diff --git a/app/models/storageclass.js b/app/models/storageclass.js
index 4f476739a..021d28f21 100644
--- a/app/models/storageclass.js
+++ b/app/models/storageclass.js
@@ -6,18 +6,18 @@ import { all } from 'rsvp';
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', );
-registerProvisioner('glusterfs', 'kubernetes.io/glusterfs', );
-registerProvisioner('cinder', 'kubernetes.io/cinder', );
-registerProvisioner('vsphere-volume', 'kubernetes.io/vpshere-volume', );
-registerProvisioner('rbd', 'kubernetes.io/rbd', );
-registerProvisioner('quobyte', 'kubernetes.io/quobyte', );
-registerProvisioner('azure-disk', 'kubernetes.io/azure-disk', );
-registerProvisioner('azure-file', 'kubernetes.io/azure-file', );
-registerProvisioner('portworx-volume','kubernetes.io/portworx-volume',);
-registerProvisioner('scaleio', 'kubernetes.io/scaleio', );
-registerProvisioner('storageos', 'kubernetes.io/storageos', );
+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/vpshere-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);
export function registerProvisioner(name, provisioner, component) {
if ( component === true ) {
diff --git a/lib/shared/addon/components/cru-storage-class/template.hbs b/lib/shared/addon/components/cru-storage-class/template.hbs
index 7ac10ac95..82bee8e94 100644
--- a/lib/shared/addon/components/cru-storage-class/template.hbs
+++ b/lib/shared/addon/components/cru-storage-class/template.hbs
@@ -16,9 +16,10 @@
{{else}}
{{form-name-description
model=primaryResource
- nameRequired=true
- namePlaceholder="newSecret.name.placeholder"
- descriptionPlaceholder="newSecret.description.placeholder"
+ nameRequired=false
+ nameDisabled=isEdit
+ namePlaceholder="cruStorageClass.name.placeholder"
+ descriptionPlaceholder="cruStorageClass.description.placeholder"
}}
{{/if}}
@@ -99,7 +100,7 @@
{{form-value-array
initialValues=primaryResource.mountOptions
+ editing=(not isView)
valueLabel="cruStorageClass.mountOptions.label"
addActionLabel="cruStorageClass.mountOptions.addActionLabel"
changed=(action "updateOptions")
diff --git a/lib/shared/addon/components/form-value-array/template.hbs b/lib/shared/addon/components/form-value-array/template.hbs
index 9423c08d0..27a9a1b33 100644
--- a/lib/shared/addon/components/form-value-array/template.hbs
+++ b/lib/shared/addon/components/form-value-array/template.hbs
@@ -20,6 +20,8 @@
{{/each}}
+{{else if (not editing)}}
+
| {{t 'formValueArray.noData'}} |
{{/if}}
{{#if editing}}
diff --git a/lib/shared/addon/components/storage-class/provisioner-aws-ebs/template.hbs b/lib/shared/addon/components/storage-class/provisioner-aws-ebs/template.hbs
index f8a6185c0..f9aad08ac 100644
--- a/lib/shared/addon/components/storage-class/provisioner-aws-ebs/template.hbs
+++ b/lib/shared/addon/components/storage-class/provisioner-aws-ebs/template.hbs
@@ -47,7 +47,7 @@
{{#unless zoneAutomatic}}
- {{textarea-autogrow spellcheck="false" required=true value=zones}}
+ {{textarea-autogrow placeholder="cruStorageClass.aws-ebs.zone.placeholder" spellcheck="false" required=true value=zones}}
{{/unless}}
{{else}}
diff --git a/lib/shared/addon/components/storage-class/provisioner-azure-disk/component.js b/lib/shared/addon/components/storage-class/provisioner-azure-disk/component.js
new file mode 100644
index 000000000..4d0965af9
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-azure-disk/component.js
@@ -0,0 +1,12 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['skuName', 'location', 'storageAccount', 'storageaccounttype', 'kind'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'azure-disk',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-azure-disk/template.hbs b/lib/shared/addon/components/storage-class/provisioner-azure-disk/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-azure-disk/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-azure-file/component.js b/lib/shared/addon/components/storage-class/provisioner-azure-file/component.js
new file mode 100644
index 000000000..e17e7afd2
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-azure-file/component.js
@@ -0,0 +1,12 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['skuName', 'location', 'storageAccount'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'azure-file',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-azure-file/template.hbs b/lib/shared/addon/components/storage-class/provisioner-azure-file/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-azure-file/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-cinder/component.js b/lib/shared/addon/components/storage-class/provisioner-cinder/component.js
new file mode 100644
index 000000000..af2109748
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-cinder/component.js
@@ -0,0 +1,12 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['type', 'availability'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'cinder',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-cinder/template.hbs b/lib/shared/addon/components/storage-class/provisioner-cinder/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-cinder/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-gce-pd/component.js b/lib/shared/addon/components/storage-class/provisioner-gce-pd/component.js
new file mode 100644
index 000000000..5ca6c20fd
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-gce-pd/component.js
@@ -0,0 +1,56 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+import { get, setProperties, computed, observer } from '@ember/object';
+
+export const VOLUME_TYPES = [
+ 'pd-standard',
+ 'pd-ssd',
+];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+ volumeTypes: VOLUME_TYPES,
+
+ volumeType: null,
+ zones: null,
+ zoneAutomatic: null,
+
+ didReceiveAttrs() {
+ const changes = {};
+
+ changes['volumeType'] = get(this, 'parameters.type')||'pd-standard';
+
+ const zone = get(this, 'parameters.zone');
+ const zones = get(this, 'parameters.zones');
+ if ( zones && zones.length ) {
+ changes['zoneAutomatic'] = false;
+ changes['zones'] = zones;
+ } else if ( zone ) {
+ changes['zoneAutomatic'] = false;
+ changes['zones'] = zone;
+ } else {
+ changes['zoneAutomatic'] = true;
+ changes['zones'] = '';
+ }
+
+ setProperties(this, changes);
+ },
+
+ sendUpdate: observer('volumeType','zones','zoneAutomatic', function() {
+ const type = get(this, 'volumeType');
+ const out = {
+ type: type,
+ };
+
+ const zoneAutomatic = get(this, 'zoneAutomatic');
+ if ( !zoneAutomatic ) {
+ const zones = (get(this, 'zones')||'').trim();
+ if ( zones ) {
+ out['zones'] = zones;
+ }
+ }
+
+ this.sendAction('changed', out);
+ })
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-gce-pd/template.hbs b/lib/shared/addon/components/storage-class/provisioner-gce-pd/template.hbs
new file mode 100644
index 000000000..5cbb43947
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-gce-pd/template.hbs
@@ -0,0 +1,43 @@
+
+
+
+ {{#if editing}}
+ {{#each volumeTypes as |name|}}
+
+
+
+ {{/each}}
+ {{else}}
+ {{t (concat 'cruStorageClass.gce-pd.type.' volumeType)}}
+ {{/if}}
+
+
+
+ {{#if editing}}
+
+
+
+
+
+
+ {{#unless zoneAutomatic}}
+ {{textarea-autogrow placeholder="cruStorageClass.gce-pd.zone.placeholder" spellcheck="false" required=true value=zones}}
+ {{/unless}}
+ {{else}}
+ {{#if zoneAutomatic}}
+ {{t 'cruStorageClass.gce-pd.zone.automatic'}}
+ {{else}}
+ {{zones}}
+ {{/if}}
+ {{/if}}
+
+
diff --git a/lib/shared/addon/components/storage-class/provisioner-glusterfs/component.js b/lib/shared/addon/components/storage-class/provisioner-glusterfs/component.js
new file mode 100644
index 000000000..9e8743c4d
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-glusterfs/component.js
@@ -0,0 +1,13 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['resturl', 'restuser', 'restuserkey',
+ 'secretNamespace', 'secretName', 'clusterid', 'gidMin', 'gidMax', 'volumetype'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'glusterfs',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-glusterfs/template.hbs b/lib/shared/addon/components/storage-class/provisioner-glusterfs/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-glusterfs/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-portworx-volume/component.js b/lib/shared/addon/components/storage-class/provisioner-portworx-volume/component.js
new file mode 100644
index 000000000..77d702ce8
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-portworx-volume/component.js
@@ -0,0 +1,13 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['fs', 'block_size', 'repl',
+ 'io_priority', 'snap_interval', 'aggregation_level', 'ephemeral'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'portworx-volume',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-portworx-volume/template.hbs b/lib/shared/addon/components/storage-class/provisioner-portworx-volume/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-portworx-volume/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-quobyte/component.js b/lib/shared/addon/components/storage-class/provisioner-quobyte/component.js
new file mode 100644
index 000000000..94dcacce8
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-quobyte/component.js
@@ -0,0 +1,13 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['quobyteAPIServer', 'registry', 'adminSecretNamespace',
+ 'adminSecretName', 'user', 'group', 'quobyteConfig', 'quobyteTenant'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'quobyte',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-quobyte/template.hbs b/lib/shared/addon/components/storage-class/provisioner-quobyte/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-quobyte/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-rbd/component.js b/lib/shared/addon/components/storage-class/provisioner-rbd/component.js
new file mode 100644
index 000000000..3a0bb5fa7
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-rbd/component.js
@@ -0,0 +1,13 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['monitors', 'adminId', 'adminSecretNamespace',
+ 'adminSecret', 'pool', 'userId', 'userSecretName', 'fsType', 'imageFormat', 'imageFeatures'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'rbd',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-rbd/template.hbs b/lib/shared/addon/components/storage-class/provisioner-rbd/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-rbd/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-scaleio/component.js b/lib/shared/addon/components/storage-class/provisioner-scaleio/component.js
new file mode 100644
index 000000000..3eaf7b575
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-scaleio/component.js
@@ -0,0 +1,13 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['gateway', 'system', 'protectionDomain',
+ 'storagePool', 'storageMode', 'secretRef', 'readOnly', 'fsType'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'scaleio',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-scaleio/template.hbs b/lib/shared/addon/components/storage-class/provisioner-scaleio/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-scaleio/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-storageos/component.js b/lib/shared/addon/components/storage-class/provisioner-storageos/component.js
new file mode 100644
index 000000000..3bd4a30d5
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-storageos/component.js
@@ -0,0 +1,13 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['pool', 'description', 'fsType',
+ 'adminSecretNamespace', 'adminSecretName'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'storageos',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-storageos/template.hbs b/lib/shared/addon/components/storage-class/provisioner-storageos/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-storageos/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/components/storage-class/provisioner-vsphere-volume/component.js b/lib/shared/addon/components/storage-class/provisioner-vsphere-volume/component.js
new file mode 100644
index 000000000..bbc836cb6
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-vsphere-volume/component.js
@@ -0,0 +1,13 @@
+import Component from '@ember/component';
+import layout from './template';
+import StorageClassProvisioner from 'shared/mixins/storage-class-provisioner';
+
+const FIELDS = ['diskformat', 'storagePolicyName', 'datastore',
+ 'hostFailuresToTolerate', 'cachereservation', 'fstype'];
+
+export default Component.extend(StorageClassProvisioner, {
+ layout,
+
+ provisioner: 'vsphere-volume',
+ fields: FIELDS,
+});
diff --git a/lib/shared/addon/components/storage-class/provisioner-vsphere-volume/template.hbs b/lib/shared/addon/components/storage-class/provisioner-vsphere-volume/template.hbs
new file mode 100644
index 000000000..e80e6de2f
--- /dev/null
+++ b/lib/shared/addon/components/storage-class/provisioner-vsphere-volume/template.hbs
@@ -0,0 +1,12 @@
+{{#each fieldsGroup as |fields|}}
+
+ {{#each fields as |field|}}
+
+
+ {{#input-or-display editable=editing value=(get model field)}}
+ {{input type="text" value=(get model field) classNames="form-control" placeholder=(t (concat 'cruStorageClass.' provisioner '.' field '.placeholder'))}}
+ {{/input-or-display}}
+
+ {{/each}}
+
+{{/each}}
\ No newline at end of file
diff --git a/lib/shared/addon/mixins/storage-class-provisioner.js b/lib/shared/addon/mixins/storage-class-provisioner.js
index 14326f8ef..d0c378097 100644
--- a/lib/shared/addon/mixins/storage-class-provisioner.js
+++ b/lib/shared/addon/mixins/storage-class-provisioner.js
@@ -1,8 +1,62 @@
import Mixin from '@ember/object/mixin';
-
+import { get, setProperties, computed } from '@ember/object';
export default Mixin.create({
parameters: null,
editing: null,
+ fields: [],
+ model: null,
+
+ didInsertElement() {
+ const fields = get(this, 'fields') || [];
+ if (fields.length > 0) {
+ fields.forEach(field => {
+ this.addObserver(`model.${field}`, this, 'sendUpdate');
+ });
+ this.sendUpdate();
+ }
+ },
+
+ fieldsGroup: computed('fields.[]', function () {
+ const fields = get(this, 'fields') || [];
+ const group = [];
+ let groupIndex = 0;
+ fields.forEach((item, index) => {
+ if (index % 3 === 0) {
+ group.push([item]);
+ groupIndex++;
+ } else {
+ group[groupIndex - 1].push(item);
+ }
+ });
+ return group;
+ }),
+
+ didReceiveAttrs() {
+ const fields = get(this, 'fields') || [];
+ if (fields.length > 0) {
+ const changes = {};
+ fields.forEach(field => {
+ changes[field] = get(this, `parameters.${field}`) || '';
+ });
+ setProperties(this, {
+ model: changes
+ });
+ }
+ },
+
+ sendUpdate: function () {
+ const fields = get(this, 'fields') || [];
+ if (fields.length > 0) {
+ const out = {};
+ fields.forEach(field => {
+ const value = get(this, `model.${field}`) || '';
+ if (value) {
+ out[field] = value;
+ }
+ });
+ this.sendAction('changed', out);
+ }
+ },
actions: {
changed(map) {
diff --git a/lib/shared/app/components/storage-class/provisioner-azure-disk/component.js b/lib/shared/app/components/storage-class/provisioner-azure-disk/component.js
new file mode 100644
index 000000000..bc0e7fe8f
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-azure-disk/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-azure-disk/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-azure-file/component.js b/lib/shared/app/components/storage-class/provisioner-azure-file/component.js
new file mode 100644
index 000000000..0f6c07677
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-azure-file/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-azure-file/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-cinder/component.js b/lib/shared/app/components/storage-class/provisioner-cinder/component.js
new file mode 100644
index 000000000..7bebfc451
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-cinder/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-cinder/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-gce-pd/component.js b/lib/shared/app/components/storage-class/provisioner-gce-pd/component.js
new file mode 100644
index 000000000..86ba9929b
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-gce-pd/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-gce-pd/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-glusterfs/component.js b/lib/shared/app/components/storage-class/provisioner-glusterfs/component.js
new file mode 100644
index 000000000..a9c5cfd48
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-glusterfs/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-glusterfs/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-portworx-volume/component.js b/lib/shared/app/components/storage-class/provisioner-portworx-volume/component.js
new file mode 100644
index 000000000..6f7cfe82f
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-portworx-volume/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-portworx-volume/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-quobyte/component.js b/lib/shared/app/components/storage-class/provisioner-quobyte/component.js
new file mode 100644
index 000000000..3f9a188ac
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-quobyte/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-quobyte/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-rbd/component.js b/lib/shared/app/components/storage-class/provisioner-rbd/component.js
new file mode 100644
index 000000000..d8708fb53
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-rbd/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-rbd/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-scaleio/component.js b/lib/shared/app/components/storage-class/provisioner-scaleio/component.js
new file mode 100644
index 000000000..de8c5a13f
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-scaleio/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-scaleio/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-storageos/component.js b/lib/shared/app/components/storage-class/provisioner-storageos/component.js
new file mode 100644
index 000000000..71bfe91e7
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-storageos/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-storageos/component';
diff --git a/lib/shared/app/components/storage-class/provisioner-vsphere-volume/component.js b/lib/shared/app/components/storage-class/provisioner-vsphere-volume/component.js
new file mode 100644
index 000000000..703ab5448
--- /dev/null
+++ b/lib/shared/app/components/storage-class/provisioner-vsphere-volume/component.js
@@ -0,0 +1 @@
+export { default } from 'shared/components/storage-class/provisioner-vsphere-volume/component';
diff --git a/translations/en-us.yaml b/translations/en-us.yaml
index 0c9ac2fbd..ce38d0524 100644
--- a/translations/en-us.yaml
+++ b/translations/en-us.yaml
@@ -1719,6 +1719,10 @@ cruRegistry:
saved: Saved
cruStorageClass:
+ name:
+ placeholder: e.g. storage
+ description:
+ placeholder: e.g. AWS EBS Storage
title:
new: Add Storage Class
edit: 'Edit Storage Class: {name}'
@@ -1753,6 +1757,7 @@ cruStorageClass:
label: Availability Zone
automatic: "Automatic: Zones the cluster has a node in"
manual: "Manual: Choose specific zones"
+ placeholder: "us-east-1d, us-east-1c"
iopsPerGB:
label: Provisioned IOPS
unit: per second, per GB
@@ -1762,7 +1767,215 @@ cruStorageClass:
label: KMS Key ID for Encryption
automatic: "Automatic: Generate a key"
manual: "Manual: Use a specific key (full ARN)"
-
+ gce-pd:
+ type:
+ label: Volume Type
+ pd-standard: 'Standard'
+ pd-ssd: 'SSD'
+ zone:
+ label: Availability Zone
+ automatic: "Automatic: Zones the cluster has a node in"
+ manual: "Manual: Choose specific zones"
+ placeholder: "us-central1-a, us-central1-b"
+ cinder:
+ type:
+ label: Volume Type
+ placeholder: "e.g. fast"
+ availability:
+ label: Availability Zone
+ placeholder: "e.g. nova"
+ vsphere-volume:
+ diskformat:
+ label: Disk Format
+ placeholder: "e.g. thin"
+ storagePolicyName:
+ label: Storage Policy Name
+ placeholder: "e.g. gold"
+ datastore:
+ label: Datastore
+ placeholder: "e.g. VSANDatastore"
+ fstype:
+ label: FS Type
+ placeholder: "e.g. ext3"
+ hostFailuresToTolerate:
+ label: Host Failures To Tolerate
+ placeholder: "e.g. 2"
+ cachereservation:
+ label: Cache Reservation
+ placeholder: "e.g. 20"
+ azure-disk:
+ skuName:
+ label: Sku Name
+ placeholder: "e.g. Standard_LRS"
+ location:
+ label: Location
+ placeholder: "e.g. eastus"
+ storageAccount:
+ label: Storage Account
+ placeholder: "e.g. azure_storage_account_name"
+ storageaccounttype:
+ label: Storage Account Type
+ placeholder: "e.g. Standard_LRS"
+ kind:
+ label: Kind
+ placeholder: "e.g. Shared"
+ azure-file:
+ skuName:
+ label: Sku Name
+ placeholder: "e.g. Standard_LRS"
+ location:
+ label: Location
+ placeholder: "e.g. eastus"
+ storageAccount:
+ label: Storage Account
+ placeholder: "e.g. azure_storage_account_name"
+ portworx-volume:
+ fs:
+ label: Filesystem
+ placeholder: "e.g. ext4"
+ block_size:
+ label: Block Size
+ placeholder: "e.g. 32"
+ repl:
+ label: Repl
+ placeholder: "e.g. 1"
+ io_priority:
+ label: I/O Priority
+ placeholder: "e.g. low"
+ snap_interval:
+ label: Snapshots Interval
+ placeholder: "e.g. 70"
+ aggregation_level:
+ label: Aggregation Level
+ placeholder: "e.g. 0"
+ ephemeral:
+ label: Ephemeral
+ placeholder: "e.g. true"
+ scaleio:
+ gateway:
+ label: Gateway
+ placeholder: "e.g. https://192.168.99.200:443/api"
+ system:
+ label: System
+ placeholder: "e.g. scaleio"
+ protectionDomain:
+ label: Protection Domain
+ placeholder: "e.g. pd0"
+ storagePool:
+ label: Storage Pool
+ placeholder: "e.g. sp1"
+ storageMode:
+ label: Storage Mode
+ placeholder: "e.g. ThinProvisioned"
+ secretRef:
+ label: Secret Ref
+ placeholder: "e.g. sio-secret"
+ readOnly:
+ label: Read Only
+ placeholder: "e.g. false"
+ fsType:
+ label: FS Type
+ placeholder: "e.g. xfs"
+ storageos:
+ pool:
+ label: Pool
+ placeholder: "e.g. default"
+ description:
+ label: Description
+ placeholder: "e.g. Kubernetes volume"
+ adminSecretNamespace:
+ label: Admin Secret Namespace
+ placeholder: "e.g. default"
+ adminSecretName:
+ label: Admin Secret Name
+ placeholder: "e.g. storageos-secret"
+ fsType:
+ label: FS Type
+ placeholder: "e.g. ext4"
+ quobyte:
+ quobyteAPIServer:
+ label: Quobyte API Server
+ placeholder: "e.g. http://138.68.74.142:7860"
+ registry:
+ label: Registry
+ placeholder: "e.g. 138.68.74.142:7861"
+ adminSecretNamespace:
+ label: Admin Secret Namespace
+ placeholder: "e.g. kube-system"
+ adminSecretName:
+ label: Admin Secret Name
+ placeholder: "e.g. quobyte-admin-secret"
+ user:
+ label: User
+ placeholder: "e.g. root"
+ group:
+ label: Group
+ placeholder: "e.g. root"
+ quobyteConfig:
+ label: Quobyte Config
+ placeholder: "e.g. BASE"
+ quobyteTenant:
+ label: Quobyte Tenant
+ placeholder: "e.g. DEFAULT"
+ rbd:
+ monitors:
+ label: Monitors
+ placeholder: "e.g. 10.16.153.105:6789"
+ adminId:
+ label: Admin ID
+ placeholder: "e.g. kube"
+ adminSecretNamespace:
+ label: Admin Secret Namespace
+ placeholder: "e.g. kube-system"
+ adminSecret:
+ label: Admin Secret
+ placeholder: "e.g. secret"
+ pool:
+ label: Pool
+ placeholder: "e.g. kube"
+ userId:
+ label: User ID
+ placeholder: "e.g. kube"
+ userSecretName:
+ label: User Secret Name
+ placeholder: "e.g. ceph-secret-user"
+ fsType:
+ label: FS Type
+ placeholder: "e.g. ext4"
+ imageFormat:
+ label: Image Format
+ placeholder: "e.g. 2"
+ imageFeatures:
+ label: Image Features
+ placeholder: "e.g. layering"
+ glusterfs:
+ resturl:
+ label: REST URL
+ placeholder: "e.g. http://127.0.0.1:8081"
+ restuser:
+ label: REST User
+ placeholder: "e.g. admin"
+ restuserkey:
+ label: REST User Key
+ placeholder: "e.g. password"
+ secretNamespace:
+ label: Secret Namespace
+ placeholder: "e.g. default"
+ secretName:
+ label: Secret Name
+ placeholder: "e.g. heketi-secret"
+ clusterid:
+ label: Cluster ID
+ placeholder: "e.g. 630372ccdc720a92c681fb928f27b53f"
+ gidMin:
+ label: GID MIN
+ placeholder: "e.g. 40000"
+ gidMax:
+ label: GID MAX
+ placeholder: "e.g. 50000"
+ volumetype:
+ label: Volume Type
+ placeholder: "e.g. replicate:3"
dangerZone:
header: Advanced Settings
@@ -2850,6 +3063,7 @@ formValueArray:
addActionLabel: Add Value
valueLabel: Value
valuePlaceholder: Value
+ noData: No Data
protip: "ProTip: Paste one or more lines of values into any field for easy bulk entry."
formVolumeRow: