ui/lib/shared/addon/components/form-agent-config/component.js

182 lines
4.6 KiB
JavaScript

import Component from '@ember/component';
import layout from './template';
import { inject as service } from '@ember/service';
import {
computed,
get,
set,
observer
} from '@ember/object';
import { isEqual } from '@ember/utils';
export default Component.extend({
globalStore: service(),
layout,
mode: 'new',
cluster: {},
// cluster or fleet agent deployment
type: 'cluster',
useDefaultAffinity: true,
attributeBindings: ['data-testid'],
init(){
this._super(...arguments);
if ( this.overrideAffinity && !isEqual(this.defaultAffinity, this.overrideAffinity)){
this.useDefaultAffinity = false
}
},
actions: {
updateLimits(val){
if (!val.cpu && !val.memory){
this.updateResourceRequirement('limits', null)
} else {
this.updateResourceRequirement('limits', val)
}
},
updateRequests(val){
if (!val.cpu && !val.memory){
this.updateResourceRequirement('requests', null)
} else {
this.updateResourceRequirement('requests', val)
}
}
},
agentObserver: observer('agentConfig.overrideResourceRequirements', 'agentConfig.appendTolerations', 'agentConfig.overrideAffinity', function() {
const agentConfig = get(this, 'agentConfig') || {}
const agentKey = get(this, 'agentKey')
if (Object.keys(agentConfig).length){
set(this.cluster, agentKey, agentConfig)
} else if (this.cluster[agentKey]){
delete this.cluster[agentKey]
}
}),
useDefaultAffinityObserver: observer('useDefaultAffinity', function(){
if (!this.useDefaultAffinity){
this.set('overrideAffinity', this.defaultAffinity)
} else {
// default rules will be applied by BE if this field is empty
this.set('overrideAffinity', null)
}
}),
editing: computed('mode', function(){
const { mode } = this;
return mode === 'new' || mode === 'edit'
}),
agentKey: computed('type', function(){
return `${ this.type }AgentDeploymentCustomization`
}),
defaultSettingId: computed('type', function(){
return `${ this.type }-agent-default-affinity`
}),
defaultAffinity: computed('defaultSettingId', function(){
if (!this.defaultSettingId){
return null
}
const setting = this.globalStore.getById('setting', this.defaultSettingId)
if (setting){
try {
return JSON.parse(setting.value)
} catch (e){
console.error('error parsing affinity default value: ', e)
}
}
return null
}),
agentConfig: computed('cluster', 'agentKey', function(){
const agentKey = get(this, 'agentKey')
return get(this.cluster, agentKey) || {}
}),
overrideResourceRequirements: computed('agentConfig.overrideResourceRequirements.{requests,limits}', {
get(){
return get(this, 'agentConfig.overrideResourceRequirements') || {}
},
set(key, val = {}){
if (val.limits || val.requests){
set(this, 'agentConfig.overrideResourceRequirements', val)
} else if (this.agentConfig.overrideResourceRequirements){
set(this, 'agentConfig.overrideResourceRequirements', null)
this.notifyPropertyChange('agentConfig')
}
return val
}
}),
limits: computed('overrideResourceRequirements.limits', function() {
return get(this, 'overrideResourceRequirements.limits') || {}
}),
requests: computed('overrideResourceRequirements.requests', function() {
return get(this, 'overrideResourceRequirements.requests') || {}
}),
appendTolerations: computed('agentConfig.appendTolerations', {
get(){
return get(this, 'agentConfig.appendTolerations') || []
},
set(key, val = []){
if (val.length){
set(this, 'agentConfig.appendTolerations', val)
} else if (this.agentConfig.appendTolerations){
set(this, 'agentConfig.appendTolerations', null)
this.notifyPropertyChange('agentConfig')
}
return val
},
}),
overrideAffinity: computed('agentConfig.overrideAffinity', {
get(){
return get(this, 'agentConfig.overrideAffinity')
},
set(key, val){
if (val){
set(this.agentConfig, 'overrideAffinity', val)
} else if (this.agentConfig?.overrideAffinity){
set(this, 'agentConfig.overrideAffinity', null)
this.notifyPropertyChange('agentConfig')
}
return val
}
}),
updateResourceRequirement(type, val){
const neu = { ...this.overrideResourceRequirements }
if (val){
neu[type] = val
} else if (neu[type]){
delete neu[type]
}
this.set('overrideResourceRequirements', neu)
},
})