mirror of https://github.com/rancher/ui.git
143 lines
3.9 KiB
JavaScript
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);
|
|
}
|
|
});
|