mirror of https://github.com/rancher/dashboard.git
Adding the ability to set default storageclasses
Adding the ability to select default storage classes as it was missed as part of the migration. rancher/dashboard#2415
This commit is contained in:
parent
2ae0d31c8b
commit
c05bbeb528
|
|
@ -2229,6 +2229,9 @@ sortableTable:
|
|||
search: Filter
|
||||
|
||||
storageClass:
|
||||
actions:
|
||||
setAsDefault: Set as Default
|
||||
resetDefault: Reset Default
|
||||
parameters:
|
||||
label: Parameters
|
||||
customize:
|
||||
|
|
|
|||
|
|
@ -22,7 +22,10 @@ export const RIO = { STACK: 'rio.cattle.io/stack' };
|
|||
|
||||
export const CERTMANAGER = { ISSUER: 'cert-manager.io/issuer-name' };
|
||||
|
||||
export const STORAGE = { DEFAULT_STORAGE_CLASS: 'storageclass.kubernetes.io/is-default-class' };
|
||||
export const STORAGE = {
|
||||
DEFAULT_STORAGE_CLASS: 'storageclass.kubernetes.io/is-default-class',
|
||||
BETA_DEFAULT_STORAGE_CLASS: 'storageclass.beta.kubernetes.io/is-default-class'
|
||||
};
|
||||
|
||||
export const NODE_ROLES = {
|
||||
CONTROL_PLANE: 'node-role.kubernetes.io/controlplane',
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ import {
|
|||
STATE, NAME as NAME_COL, NAMESPACE as NAMESPACE_COL, AGE, KEYS,
|
||||
INGRESS_DEFAULT_BACKEND, INGRESS_TARGET, ROLES, VERSION, INTERNAL_EXTERNAL_IP, CPU, RAM,
|
||||
SPEC_TYPE, TARGET_PORT, SELECTOR, NODE as NODE_COL, TYPE, WORKLOAD_IMAGES, POD_IMAGES,
|
||||
USER_ID, USERNAME, USER_DISPLAY_NAME, USER_PROVIDER, WORKLOAD_ENDPOINTS, STORAGE_CLASS_PROVISIONER,
|
||||
PERSISTENT_VOLUME_SOURCE,
|
||||
USER_ID, USERNAME, USER_DISPLAY_NAME, USER_PROVIDER, WORKLOAD_ENDPOINTS, STORAGE_CLASS_DEFAULT,
|
||||
STORAGE_CLASS_PROVISIONER, PERSISTENT_VOLUME_SOURCE,
|
||||
HPA_REFERENCE, MIN_REPLICA, MAX_REPLICA, CURRENT_REPLICA,
|
||||
ACCESS_KEY, DESCRIPTION, SCOPE, EXPIRES, EXPIRY_STATE,
|
||||
} from '@/config/table-headers';
|
||||
|
|
@ -167,7 +167,7 @@ export function init(store) {
|
|||
headers(WORKLOAD_TYPES.CRON_JOB, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Schedule', 'Last Schedule', AGE]);
|
||||
headers(WORKLOAD_TYPES.REPLICATION_CONTROLLER, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', AGE]);
|
||||
headers(POD, [STATE, NAME_COL, NAMESPACE_COL, POD_IMAGES, 'Ready', 'Restarts', 'IP', NODE_COL, AGE]);
|
||||
headers(STORAGE_CLASS, [STATE, NAME_COL, STORAGE_CLASS_PROVISIONER, AGE]);
|
||||
headers(STORAGE_CLASS, [STATE, NAME_COL, STORAGE_CLASS_PROVISIONER, STORAGE_CLASS_DEFAULT, AGE]);
|
||||
|
||||
headers(RBAC.ROLE, [
|
||||
STATE,
|
||||
|
|
|
|||
|
|
@ -69,6 +69,14 @@ export const STORAGE_CLASS_PROVISIONER = {
|
|||
sort: ['provisioner'],
|
||||
};
|
||||
|
||||
export const STORAGE_CLASS_DEFAULT = {
|
||||
name: 'storage_class_default',
|
||||
labelKey: 'tableHeaders.default',
|
||||
value: 'isDefault',
|
||||
sort: ['isDefault'],
|
||||
formatter: 'Checked',
|
||||
};
|
||||
|
||||
export const PERSISTENT_VOLUME_SOURCE = {
|
||||
name: 'persistent_volume_source',
|
||||
labelKey: 'tableHeaders.persistentVolumeSource',
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ export default {
|
|||
:resource="value"
|
||||
:subtypes="[]"
|
||||
:validation-passed="true"
|
||||
:errors="[]"
|
||||
:errors="errors"
|
||||
@error="e=>errors = e"
|
||||
@finish="save"
|
||||
@cancel="done"
|
||||
|
|
|
|||
|
|
@ -12,10 +12,7 @@ export default {
|
|||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return { parameters: {} };
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
import LabeledInput from '@/components/form/LabeledInput';
|
||||
import RadioGroup from '@/components/form/RadioGroup';
|
||||
import UnitInput from '@/components/form/UnitInput';
|
||||
import { _CREATE } from '@/config/query-params';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
|
@ -69,9 +70,11 @@ export default {
|
|||
}
|
||||
];
|
||||
|
||||
this.$set(this.value.parameters, 'type', this.value.parameters.type || volumeTypeOptions[0].value);
|
||||
this.$set(this.value.parameters, 'encrypted', this.value.parameters.encrypted || encryptionOptions[0].value);
|
||||
this.$set(this.value.parameters, 'iopsPerGB', this.value.parameters.iopsPerGB || '0');
|
||||
if (this.mode === _CREATE) {
|
||||
this.$set(this.value.parameters, 'type', this.value.parameters.type || volumeTypeOptions[0].value);
|
||||
this.$set(this.value.parameters, 'encrypted', this.value.parameters.encrypted || encryptionOptions[0].value);
|
||||
this.$set(this.value.parameters, 'iopsPerGB', this.value.parameters.iopsPerGB || '0');
|
||||
}
|
||||
|
||||
return {
|
||||
volumeTypeOptions,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<script>
|
||||
import LabeledInput from '@/components/form/LabeledInput';
|
||||
import LabeledSelect from '@/components/form/LabeledSelect';
|
||||
import { _CREATE } from '@/config/query-params';
|
||||
|
||||
export default {
|
||||
components: { LabeledInput, LabeledSelect },
|
||||
|
|
@ -30,7 +31,9 @@ export default {
|
|||
},
|
||||
];
|
||||
|
||||
this.$set(this.value.parameters, 'kind', this.value.parameters.kind || kindOptions[0].value);
|
||||
if (this.mode === _CREATE) {
|
||||
this.$set(this.value.parameters, 'kind', this.value.parameters.kind || kindOptions[0].value);
|
||||
}
|
||||
|
||||
return { kindOptions };
|
||||
},
|
||||
|
|
|
|||
|
|
@ -12,14 +12,7 @@ export default {
|
|||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
skuName: '',
|
||||
location: '',
|
||||
storageAccount: ''
|
||||
};
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<script>
|
||||
import LabeledInput from '@/components/form/LabeledInput';
|
||||
import RadioGroup from '@/components/form/RadioGroup';
|
||||
import { _CREATE } from '@/config/query-params';
|
||||
|
||||
export default {
|
||||
components: { LabeledInput, RadioGroup },
|
||||
|
|
@ -47,7 +48,9 @@ export default {
|
|||
}
|
||||
];
|
||||
|
||||
this.$set(this.value.parameters, 'type', this.value.parameters.type || volumeTypeOptions[0].value);
|
||||
if (this.mode === _CREATE) {
|
||||
this.$set(this.value.parameters, 'type', this.value.parameters.type || volumeTypeOptions[0].value);
|
||||
}
|
||||
|
||||
return {
|
||||
volumeTypeOptions,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<script>
|
||||
import LabeledInput from '@/components/form/LabeledInput';
|
||||
import LabeledSelect from '@/components/form/LabeledSelect';
|
||||
import { _CREATE } from '@/config/query-params';
|
||||
|
||||
export default {
|
||||
components: { LabeledInput, LabeledSelect },
|
||||
|
|
@ -30,7 +31,9 @@ export default {
|
|||
},
|
||||
];
|
||||
|
||||
this.$set(this.value.parameters, 'diskformat', this.value.parameters.diskformat || diskFormatOptions[0].value);
|
||||
if (this.mode === _CREATE) {
|
||||
this.$set(this.value.parameters, 'diskformat', this.value.parameters.diskformat || diskFormatOptions[0].value);
|
||||
}
|
||||
|
||||
return { diskFormatOptions };
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
import { STORAGE } from '@/config/labels-annotations';
|
||||
import { STORAGE_CLASS } from '@/config/types';
|
||||
|
||||
export const PROVISIONER_OPTIONS = [
|
||||
{
|
||||
labelKey: 'storageClass.aws-ebs.title',
|
||||
|
|
@ -30,5 +33,56 @@ export default {
|
|||
const option = PROVISIONER_OPTIONS.find(o => o.value === this.provisioner);
|
||||
|
||||
return option ? this.t(option.labelKey) : this.provisioner;
|
||||
}
|
||||
},
|
||||
|
||||
isDefault() {
|
||||
return this.annotations[STORAGE.DEFAULT_STORAGE_CLASS] === 'true';
|
||||
},
|
||||
|
||||
updateDefault() {
|
||||
return (value) => {
|
||||
this.setAnnotation(STORAGE.DEFAULT_STORAGE_CLASS, value.toString());
|
||||
this.setAnnotation(STORAGE.BETA_DEFAULT_STORAGE_CLASS, value.toString());
|
||||
this.save();
|
||||
};
|
||||
},
|
||||
|
||||
setDefault() {
|
||||
return () => {
|
||||
const allStorageClasses = this.$rootGetters['cluster/all'](STORAGE_CLASS) || [];
|
||||
|
||||
allStorageClasses.forEach(storageClass => storageClass.resetDefault());
|
||||
this.updateDefault(true);
|
||||
};
|
||||
},
|
||||
|
||||
resetDefault() {
|
||||
return () => {
|
||||
if (this.isDefault) {
|
||||
this.updateDefault(false);
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
availableActions() {
|
||||
const out = this._standardActions;
|
||||
|
||||
if (this.isDefault) {
|
||||
out.unshift({
|
||||
action: 'resetDefault',
|
||||
enabled: true,
|
||||
icon: 'icon icon-fw icon-checkmark',
|
||||
label: this.t('storageClass.actions.resetDefault'),
|
||||
});
|
||||
} else {
|
||||
out.unshift({
|
||||
action: 'setDefault',
|
||||
enabled: true,
|
||||
icon: 'icon icon-fw icon-checkmark',
|
||||
label: this.t('storageClass.actions.setAsDefault'),
|
||||
});
|
||||
}
|
||||
|
||||
return out;
|
||||
},
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue