mirror of https://github.com/rancher/ui.git
147 lines
3.3 KiB
JavaScript
147 lines
3.3 KiB
JavaScript
import { resolve } from 'rsvp';
|
|
import { get, set, computed } from '@ember/object';
|
|
import { alias } from '@ember/object/computed';
|
|
import { inject as service } from '@ember/service';
|
|
import Component from '@ember/component';
|
|
import NewOrEdit from 'shared/mixins/new-or-edit';
|
|
import layout from './template';
|
|
|
|
export default Component.extend(NewOrEdit, {
|
|
intl: service(),
|
|
scope: service(),
|
|
|
|
layout,
|
|
ingress: null,
|
|
editing: null,
|
|
existing: null,
|
|
namespacedCertificates: null,
|
|
certificates: null,
|
|
|
|
isGKE: alias('scope.currentCluster.isGKE'),
|
|
|
|
primaryResource: alias('ingress'),
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
if ( get(this, 'existing')) {
|
|
set(this, 'namespace', get(this, 'existing.namespace'));
|
|
}
|
|
},
|
|
actions: {
|
|
done() {
|
|
if (this.done) {
|
|
this.done();
|
|
}
|
|
},
|
|
cancel() {
|
|
if (this.cancel) {
|
|
this.cancel();
|
|
}
|
|
},
|
|
|
|
setLabels(labels) {
|
|
let out = {};
|
|
|
|
labels.forEach((row) => {
|
|
out[row.key] = row.value;
|
|
});
|
|
|
|
set(this, 'ingress.labels', out);
|
|
},
|
|
},
|
|
|
|
headerLabel: computed('intl.locale', 'existing', function() {
|
|
let k;
|
|
|
|
if (get(this, 'existing')) {
|
|
k = 'newIngress.header.edit';
|
|
} else {
|
|
k = 'newIngress.header.add';
|
|
}
|
|
|
|
return get(this, 'intl').t(k);
|
|
}),
|
|
|
|
willSave() {
|
|
let pr = get(this, 'primaryResource');
|
|
|
|
// Namespace is required, but doesn't exist yet... so lie to the validator
|
|
let nsId = get(pr, 'namespaceId');
|
|
|
|
set(pr, 'namespaceId', '__TEMP__');
|
|
let ok = this.validate();
|
|
|
|
set(pr, 'namespaceId', nsId);
|
|
|
|
return ok;
|
|
},
|
|
|
|
doSave() {
|
|
let pr = get(this, 'primaryResource');
|
|
|
|
let namespacePromise = resolve();
|
|
|
|
if (!get(this, 'existing')) {
|
|
// Set the namespace ID
|
|
if (get(this, 'namespace.id')) {
|
|
set(pr, 'namespaceId', get(this, 'namespace.id'));
|
|
} else if (get(this, 'namespace')) {
|
|
namespacePromise = get(this, 'namespace').save()
|
|
.then((newNamespace) => {
|
|
set(pr, 'namespaceId', get(newNamespace, 'id'));
|
|
|
|
return newNamespace.waitForState('active');
|
|
});
|
|
}
|
|
}
|
|
|
|
let self = this;
|
|
let sup = self._super;
|
|
|
|
return namespacePromise.then(() => sup.apply(self, arguments));
|
|
},
|
|
|
|
validate() {
|
|
let intl = get(this, 'intl');
|
|
|
|
let pr = get(this, 'primaryResource');
|
|
let errors = pr.validationErrors() || [];
|
|
|
|
errors.pushObjects(get(this, 'namespaceErrors') || []);
|
|
errors.pushObjects(get(this, 'certErrors') || []);
|
|
|
|
if (!get(this, 'ingress.rules.length') && !get(this, 'ingress.defaultBackend')) {
|
|
errors.push(intl.t('newIngress.error.noRules'));
|
|
}
|
|
if (get(this, 'ingress.rules.length')) {
|
|
const invalid = get(this, 'ingress.rules').some((rule) => {
|
|
const paths = [];
|
|
|
|
Object.keys(rule.paths).forEach((key) => {
|
|
paths.push(rule.paths[key]);
|
|
});
|
|
|
|
return paths.some((path) => !path.targetPort)
|
|
});
|
|
|
|
if (invalid) {
|
|
errors.push(intl.t('validation.required', { key: intl.t('generic.port') }));
|
|
}
|
|
}
|
|
|
|
if (errors.length) {
|
|
set(this, 'errors', errors.uniq());
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
doneSaving() {
|
|
this._super(...arguments);
|
|
this.send('done');
|
|
},
|
|
});
|