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:
Cody Jackson 2021-02-24 01:26:29 -07:00
parent 2ae0d31c8b
commit c05bbeb528
12 changed files with 94 additions and 24 deletions

View File

@ -2229,6 +2229,9 @@ sortableTable:
search: Filter
storageClass:
actions:
setAsDefault: Set as Default
resetDefault: Reset Default
parameters:
label: Parameters
customize:

View File

@ -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',

View File

@ -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,

View File

@ -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',

View File

@ -112,7 +112,7 @@ export default {
:resource="value"
:subtypes="[]"
:validation-passed="true"
:errors="[]"
:errors="errors"
@error="e=>errors = e"
@finish="save"
@cancel="done"

View File

@ -12,10 +12,7 @@ export default {
type: String,
required: true
}
},
data() {
return { parameters: {} };
},
}
};
</script>
<template>

View File

@ -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,

View File

@ -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 };
},

View File

@ -12,14 +12,7 @@ export default {
type: String,
required: true
}
},
data() {
return {
skuName: '',
location: '',
storageAccount: ''
};
},
}
};
</script>
<template>

View File

@ -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,

View File

@ -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 };
},

View File

@ -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;
},
};