ui/app/models/storageclass.js

141 lines
3.9 KiB
JavaScript

import Resource from '@rancher/ember-api-store/models/resource';
import { get, set, computed } from '@ember/object';
import { inject as service } from '@ember/service';
import { all } from 'rsvp';
const BETA_ANNOTATION = 'storageclass.beta.kubernetes.io/is-default-class';
const DEFAULT_ANNOTATION = 'storageclass.kubernetes.io/is-default-class';
const PROVISIONERS = [];
registerProvisioner('aws-ebs', 'kubernetes.io/aws-ebs', true);
registerProvisioner('gce-pd', 'kubernetes.io/gce-pd', true);
registerProvisioner('glusterfs', 'kubernetes.io/glusterfs', true);
registerProvisioner('cinder', 'kubernetes.io/cinder', true);
registerProvisioner('vsphere-volume', 'kubernetes.io/vsphere-volume', true);
registerProvisioner('rbd', 'kubernetes.io/rbd', true);
registerProvisioner('quobyte', 'kubernetes.io/quobyte', true);
registerProvisioner('azure-disk', 'kubernetes.io/azure-disk', true);
registerProvisioner('azure-file', 'kubernetes.io/azure-file', true);
registerProvisioner('portworx-volume', 'kubernetes.io/portworx-volume', true);
registerProvisioner('scaleio', 'kubernetes.io/scaleio', true);
registerProvisioner('storageos', 'kubernetes.io/storageos', true);
registerProvisioner('longhorn', 'rancher.io/longhorn', true);
export function registerProvisioner(name, provisioner, component) {
if ( component === true ) {
component = name;
}
const existing = PROVISIONERS.findBy('name', name);
if ( existing ) {
PROVISIONERS.removeObject(existing);
}
PROVISIONERS.push({
name,
value: provisioner,
component,
});
}
export function getProvisioners() {
return JSON.parse(JSON.stringify(PROVISIONERS));
}
export default Resource.extend({
clusterStore: service(),
router: service(),
type: 'storageClass',
state: 'active',
isDefault: computed('annotations', function() {
const annotations = get(this, 'annotations') || {};
return annotations[DEFAULT_ANNOTATION] === 'true' ||
annotations[BETA_ANNOTATION] === 'true';
}),
availableActions: computed('isDefault', function() {
const isDefault = get(this, 'isDefault');
let out = [
{
label: 'action.makeDefault',
icon: 'icon icon-star-fill',
action: 'makeDefault',
enabled: !isDefault
},
{
label: 'action.resetDefault',
icon: 'icon icon-star-line',
action: 'resetDefault',
enabled: isDefault
},
];
return out;
}),
displayProvisioner: computed('provisioner', 'intl.locale', function() {
const intl = get(this, 'intl');
const provisioner = get(this, 'provisioner');
const entry = PROVISIONERS.findBy('value', provisioner)
if ( provisioner && entry ) {
const key = `storageClass.${ entry.name }.title`;
if ( intl.exists(key) ) {
return intl.t(key);
}
}
return provisioner;
}),
actions: {
makeDefault() {
const cur = get(this, 'clusterStore').all('storageClass')
.filterBy('isDefault', true);
const promises = [];
cur.forEach((sc) => {
promises.push(sc.setDefault(false));
});
all(promises).then(() => {
this.setDefault(true);
});
},
resetDefault() {
this.setDefault(false)
},
edit() {
get(this, 'router').transitionTo('authenticated.cluster.storage.classes.detail.edit', get(this, 'id'));
},
},
setDefault(on) {
let annotations = get(this, 'annotations');
if ( !annotations ) {
annotations = {};
set(this, 'annotations', annotations);
}
if ( on ) {
annotations[DEFAULT_ANNOTATION] = 'true';
annotations[BETA_ANNOTATION] = 'true';
} else {
annotations[DEFAULT_ANNOTATION] = 'false';
annotations[BETA_ANNOTATION] = 'false';
}
this.save();
},
});