ui/lib/shared/addon/components/form-ingress-backends/component.js

143 lines
3.9 KiB
JavaScript

import { get, set, observer, computed } from '@ember/object'
import Component from '@ember/component';
import layout from './template';
import { inject as service } from '@ember/service';
export default Component.extend({
intl: service(),
layout,
ingress: null,
rule: null,
isDefault: null,
editing: true,
pathArray: null,
init() {
this._super(...arguments);
this.initPathArray();
},
didInsertElement() {
if (get(this, 'editing') && get(this, 'pathArray.length') === 0) {
this.send('addPath', 'workload');
}
},
actions: {
addPath(backendType) {
get(this, 'pathArray').pushObject({
backendType,
targetPort: '',
serviceId: '',
path: '',
});
},
removePath(path) {
get(this, 'pathArray').removeObject(path);
},
},
pathsChanged: observer('pathArray.@each.{path,backendType,targetPort,serviceId}', 'isDefault', function() {
if (get(this, 'isDefault')) {
this.setDefaultBackend();
} else {
this.setPaths();
}
}),
servicesDidChange: observer('pathArray.@each.{service}', function() {
const pathArray = get(this, 'pathArray');
pathArray.forEach((path) => {
const backendType = get(path, 'backendType');
const targetPort = get(path, 'targetPort');
const availablePorts = get(path, 'service.availablePorts') || [];
const hasPorts = get(path, 'service.availablePorts.length') > 0;
if (backendType === 'service' && hasPorts && !availablePorts.find((p) => p.port === targetPort)) {
set(path, 'targetPort', get(path, 'service.availablePorts.firstObject.port'));
}
});
}),
hasServiceTargets: computed('pathArray.@each.backendType', function() {
return !!get(this, 'pathArray').findBy('backendType', 'service');
}),
initPathArray() {
const pathArray = [];
const paths = get(this, 'rule.paths') || [];
paths.forEach((path) => {
if (get(path, 'serviceId')) {
pathArray.pushObject(get(this, 'store').createRecord({
type: 'httpingresspath',
backendType: 'service',
targetPort: `${ get(path, 'targetPort') || '' }`,
serviceId: get(path, 'serviceId').replace('/', ':'),
path: get(path, 'path'),
}));
} else if (get(path, 'workloadIds')) {
get(path, 'workloadIds').forEach((workload) => {
pathArray.pushObject({
backendType: 'workload',
targetPort: get(path, 'targetPort'),
serviceId: workload,
path: get(path, 'path'),
});
});
}
});
set(this, 'pathArray', pathArray);
},
setDefaultBackend() {
const pathArray = get(this, 'pathArray');
let defaultBackend = { workloadIds: [], };
pathArray.forEach((path) => {
const backendType = get(path, 'backendType');
const serviceId = get(path, 'serviceId');
const targetPort = get(path, 'targetPort');
if (backendType === 'service') {
defaultBackend.serviceId = serviceId;
} else if (backendType === 'workload') {
defaultBackend.workloadIds.pushObject(serviceId);
}
defaultBackend.targetPort = targetPort;
});
set(this, 'ingress.defaultBackend', defaultBackend);
},
setPaths() {
const pathArray = get(this, 'pathArray');
const paths = [];
pathArray.forEach((item) => {
const backendType = get(item, 'backendType');
const path = get(item, 'path');
const serviceId = get(item, 'serviceId');
const targetPort = get(item, 'targetPort');
if (backendType === 'service') {
paths.pushObject({
path,
serviceId,
targetPort,
});
} else if (backendType === 'workload') {
paths.pushObject({
path,
workloadIds: [serviceId],
targetPort,
});
}
})
set(this, 'rule.paths', paths);
}
});