ui/app/components/cru-persistent-volume-claim/component.js

169 lines
4.2 KiB
JavaScript

import { inject as service } from '@ember/service';
import { gt } from '@ember/object/computed';
import { get, set, computed } from '@ember/object';
import { parseSi } from 'shared/utils/parse-unit';
import Component from '@ember/component';
import ViewNewEdit from 'shared/mixins/view-new-edit';
import ChildHook from 'shared/mixins/child-hook';
import layout from './template';
import Errors from 'ui/utils/errors';
export default Component.extend(ViewNewEdit, ChildHook, {
intl: service(),
scope: service(),
layout,
model: null,
namespace: null,
persistentVolumes: null,
storageClasses: null,
selectNamespace: true,
actuallySave: true,
useStorageClass: true,
capacity: null,
titleKey: 'cruPersistentVolumeClaim.title',
canUseStorageClass: gt('storageClasses.length', 0),
didReceiveAttrs() {
if ( !get(this, 'persistentVolumes') ) {
set(this, 'persistentVolumes', get(this, 'clusterStore').all('persistentVolume'));
}
if ( !get(this, 'storageClasses') ) {
set(this, 'storageClasses', get(this, 'clusterStore').all('storageClass'));
}
if ( !get(this, 'selectNamespace') ) {
set(this, 'primaryResource.namespaceId', get(this, 'namespace.id') || get(this, 'namespace.name'));
}
if ( get(this, 'isNew') ) {
const capacity = get(this, 'primaryResource.resources.requests.storage');
if ( capacity ) {
const bytes = parseSi(capacity);
const gib = bytes / (1024 ** 3);
set(this, 'capacity', gib);
}
if ( !get(this, 'canUseStorageClass')) {
set(this, 'useStorageClass', false);
}
} else {
set(this, 'capacity', 10);
}
},
actions: {
cancel() {
if (this.cancel) {
this.cancel();
}
},
},
headerToken: computed('actuallySave', 'mode', function() {
let k = 'cruPersistentVolumeClaim.';
if ( get(this, 'actuallySave' ) ) {
k += 'add.';
} else {
k += 'define.';
}
k += get(this, 'mode');
return k;
}),
persistentVolumeChoices: computed('persistentVolumes.@each.{name,state}', function() {
return get(this, 'persistentVolumes').map((v) => {
let label = get(v, 'displayName');
const state = get(v, 'state');
const disabled = state !== 'available';
if ( disabled ) {
label += ` (${ state })`;
}
return {
label,
disabled,
value: get(v, 'id'),
}
})
.sortBy('label');
}),
willSave() {
const pr = get(this, 'primaryResource');
const intl = get(this, 'intl');
if ( get(this, 'useStorageClass') ) {
set(pr, 'volumeId', null);
const capacity = get(this, 'capacity');
if ( capacity ) {
set(pr, 'resources', { requests: { storage: `${ capacity }Gi`, } });
} else {
const errors = [];
errors.push(intl.t('validation.required', { key: intl.t('cruPersistentVolumeClaim.capacity.label') }));
set(this, 'errors', errors);
return false;
}
} else {
set(pr, 'storageClassId', get(pr, 'persistentVolume.storageClassId') || null);
set(pr, 'resources', { requests: Object.assign({}, get(pr, 'persistentVolume.capacity')), });
}
if ( !get(this, 'actuallySave') ) {
let ok = this._super(...arguments);
if ( ok ) {
if (this.doSave) {
this.doSave({ pvc: pr, });
}
if (this.done) {
this.done();
}
}
return false;
}
const self = this;
const sup = this._super;
if ( get(this, 'selectNamespace') ) {
const errors = [];
errors.pushObjects(get(this, 'namespaceErrors') || []);
set(this, 'errors', errors);
if ( get(errors, 'length') !== 0 ) {
return false;
}
return this.applyHooks('_beforeSaveHooks').then(() => {
set(pr, 'namespaceId', get(this, 'namespace.id'));
return sup.apply(self, ...arguments);
}).catch((err) => {
set(this, 'errors', [Errors.stringify(err)]);
});
} else {
if ( !get(pr, 'namespaceId') ) {
set(pr, 'namespaceId', '__REPLACE_ME__');
}
return sup.apply(self, ...arguments);
}
},
});