From e0ab35e90183d7ac3a3403a35494a8e7521ead5f Mon Sep 17 00:00:00 2001 From: n313893254 Date: Sat, 2 Feb 2019 16:26:55 +0800 Subject: [PATCH] Add form-gke-taints https://github.com/rancher/rancher/issues/16412 --- .../driver-googlegke/component.js | 84 +++++++++++++++++-- .../driver-googlegke/template.hbs | 58 ++++++------- .../components/form-gke-taints/component.js | 46 ++++++++++ .../components/form-gke-taints/template.hbs | 76 +++++++++++++++++ .../components/form-gke-taints/component.js | 1 + translations/en-us.yaml | 15 ++++ translations/zh-hans.yaml | 17 ++++ 7 files changed, 256 insertions(+), 41 deletions(-) create mode 100644 lib/shared/addon/components/form-gke-taints/component.js create mode 100644 lib/shared/addon/components/form-gke-taints/template.hbs create mode 100644 lib/shared/app/components/form-gke-taints/component.js diff --git a/lib/shared/addon/components/cluster-driver/driver-googlegke/component.js b/lib/shared/addon/components/cluster-driver/driver-googlegke/component.js index 076576a1e..be5f68b2c 100644 --- a/lib/shared/addon/components/cluster-driver/driver-googlegke/component.js +++ b/lib/shared/addon/components/cluster-driver/driver-googlegke/component.js @@ -100,7 +100,7 @@ export default Component.extend(ClusterDriver, { let config = get(this, 'cluster.googleKubernetesEngineConfig'); if ( !config ) { - config = this.get('globalStore').createRecord({ + config = get(this, 'globalStore').createRecord({ type: 'googleKubernetesEngineConfig', diskSizeGb: 100, enableAlphaFeature: false, @@ -112,6 +112,7 @@ export default Component.extend(ClusterDriver, { maxNodeCount: 1, imageType: 'UBUNTU', diskType: 'pd-standard', + taints: [], }); setProperties(this, { @@ -136,8 +137,47 @@ export default Component.extend(ClusterDriver, { stackdriverTrace: 'trace.append', cloudSourceRepositories: 'none', cloudDebugger: 'none' + }, + resourceLabels: [], + labels: [], + taints: [], + }) + } else { + const { + resourceLabels = [], labels = [], taints = [] + } = config + let map = {} + + if (resourceLabels) { + resourceLabels.map((t = '') => { + const split = t.split('=') + + set(map, split[0], split[1]) + }) + set(this, 'resourceLabels', map) + } + + if (labels) { + labels.map((t = '') => { + const split = t.split('=') + + set(map, split[0], split[1]) + }) + set(this, 'labels', map) + } + + let _taints = taints.map((t = '') => { + const splitEffect = t.split(':') + const splitLabel = (splitEffect[1] || '').split('=') + + return { + effect: splitEffect[0], + key: splitLabel[0], + value: splitLabel[1], } }) + + set(this, 'taints', _taints) } set(this, 'initialMasterVersion', get(this, 'config.masterVersion')); @@ -167,13 +207,21 @@ export default Component.extend(ClusterDriver, { }, setLabels(section) { - const out = section.filter((f) => f.key && f.value).map((s) => `${ s.key }=${ s.value }`) + const out = [] + + for (let key in section) { + out.pushObject(`${ key }=${ section[key] }`) + } set(this, 'config.resourceLabels', out); }, setNodeLabels(section) { - const out = section.filter((f) => f.key && f.value).map((s) => `${ s.key }=${ s.value }`) + const out = [] + + for (let key in section) { + out.pushObject(`${ key }=${ section[key] }`) + } set(this, 'config.labels', out); }, @@ -181,6 +229,11 @@ export default Component.extend(ClusterDriver, { updateNameservers(nameservers) { set(this, 'config.masterAuthorizedNetworkCidrBlocks', nameservers); }, + + setTaints(value) { + console.log(value, 'value') + set(this, 'config.taints', value); + }, }, credentialChanged: observer('config.credential', function() { @@ -510,10 +563,8 @@ export default Component.extend(ClusterDriver, { validate() { const model = get(this, 'cluster'); const errors = model.validationErrors(); - const intl = get(this, 'intl') - - const minNodeCount = get(this, 'config.minNodeCount') - const maxNodeCount = get(this, 'config.maxNodeCount') + const { intl, config = {} } = this + const { minNodeCount, maxNodeCount } = config if (maxNodeCount < minNodeCount) { errors.pushObject(intl.t('clusterNew.googlegke.maxNodeCount.minError')) @@ -523,6 +574,16 @@ export default Component.extend(ClusterDriver, { errors.pushObject(intl.t('clusterNew.name.required')) } + const taints = get(this, 'taints') || [] + + if (taints.length > 0) { + const filter = taints.filter((t) => !t.key || !t.value) + + if (filter.length > 0) { + errors.pushObject(intl.t('clusterNew.googlegke.taints.required')) + } + } + set(this, 'errors', errors); return errors.length === 0; @@ -545,7 +606,6 @@ export default Component.extend(ClusterDriver, { if (!get(this, 'config.useIpAliases')) { setProperties(config, { ipPolicyCreateSubnetwork: false, - network: null, ipPolicyClusterSecondaryRangeName: null, ipPolicyClusterIpv4CidrBlock: null, ipPolicyServicesSecondaryRangeName: null, @@ -599,6 +659,14 @@ export default Component.extend(ClusterDriver, { set(config, 'oauthScopes', arr) } + const taints = get(this, 'taints') || [] + + if (taints.length > 0) { + set(config, 'taints', taints.map((t) => { + return `${ t.effect }:${ t.key }=${ t.value }` + })) + } + setProperties(config, { issueClientCertificate: true, enablePrivateNodes: get(config, 'enablePrivateEndpoint'), diff --git a/lib/shared/addon/components/cluster-driver/driver-googlegke/template.hbs b/lib/shared/addon/components/cluster-driver/driver-googlegke/template.hbs index 3a17fa3f0..6fa8f4c27 100644 --- a/lib/shared/addon/components/cluster-driver/driver-googlegke/template.hbs +++ b/lib/shared/addon/components/cluster-driver/driver-googlegke/template.hbs @@ -428,13 +428,13 @@ {{#if config.enableMasterAuthorizedNetwork}}
{{form-value-array - initialValues=config.masterAuthorizedNetworkCidrBlocks - editing=(or (eq mode 'edit') (eq mode 'new')) - valueLabel="clusterNew.googlegke.masterAuthorizedNetworkCidrBlocks.label" - valuePlaceholder="clusterNew.googlegke.masterAuthorizedNetworkCidrBlocks.placeholder" - addActionLabel="clusterNew.googlegke.masterAuthorizedNetworkCidrBlocks.addActionLabel" - changed=(action "updateNameservers") - cannotAdd=(gt config.masterAuthorizedNetworkCidrBlocks.length 10) + initialValues=config.masterAuthorizedNetworkCidrBlocks + editing=(or (eq mode 'edit') (eq mode 'new')) + valueLabel="clusterNew.googlegke.masterAuthorizedNetworkCidrBlocks.label" + valuePlaceholder="clusterNew.googlegke.masterAuthorizedNetworkCidrBlocks.placeholder" + addActionLabel="clusterNew.googlegke.masterAuthorizedNetworkCidrBlocks.addActionLabel" + changed=(action "updateNameservers") + cannotAdd=(gt config.masterAuthorizedNetworkCidrBlocks.length 10) }}
{{/if}} @@ -443,19 +443,12 @@
- - {{#if editing}} - {{#if (gt config.resourceLabels.length 0)}} - {{huawei-user-labels - readOnly=true - initialLabels=config.resourceLabels - }} - {{else}} -
{{t 'clusterNew.huaweicce.clusterLabels.none'}}
- {{/if}} - {{else}} - {{huawei-user-labels setLabels=(action 'setLabels')}} - {{/if}} + + {{form-key-value + initialMap=resourceLabels + changed=(action 'setLabels') + addActionLabel="clusterNew.googlegke.nodeLabels.addAction" + }}
{{/accordion-list-item}} @@ -639,21 +632,20 @@ {{/if}} + {{form-gke-taints + taints=taints + editable=(eq mode 'new') + }} +
- - {{#if editing}} - {{#if (gt config.labels.length 0)}} - {{huawei-user-labels - readOnly=true - initialLabels=config.labels - }} - {{else}} -
{{t 'clusterNew.huaweicce.nodeLabels.none'}}
- {{/if}} - {{else}} - {{huawei-user-labels setLabels=(action 'setNodeLabels')}} - {{/if}} + + {{form-key-value + initialMap=labels + changed=(action 'setNodeLabels') + addActionLabel="clusterNew.googlegke.nodeLabels.addAction" + editing=(eq mode 'new') + }}
{{/accordion-list-item}} diff --git a/lib/shared/addon/components/form-gke-taints/component.js b/lib/shared/addon/components/form-gke-taints/component.js new file mode 100644 index 000000000..3b618a63c --- /dev/null +++ b/lib/shared/addon/components/form-gke-taints/component.js @@ -0,0 +1,46 @@ +import { inject as service } from '@ember/service'; +import { get, computed } from '@ember/object'; +import Component from '@ember/component'; +import layout from './template'; + +const EFFECT = ['NO_SCHEDULE', 'PREFER_NO_SCHEDULE', 'NO_EXECUTE'] + +export default Component.extend({ + intl: service(), + scope: service(), + settings: service(), + + layout, + editing: false, + showWarning: false, + + taints: null, + + init() { + this._super(...arguments); + }, + + actions: { + addTaint() { + get(this, 'taints').pushObject({ + effect: 'NO_SCHEDULE', + key: '', + value: '', + }); + }, + + removeTaint(obj) { + get(this, 'taints').removeObject(obj); + }, + }, + + effectContent: computed(() => { + return EFFECT.map((e) => { + return { + label: e, + value: e, + } + }) + }), + +}); diff --git a/lib/shared/addon/components/form-gke-taints/template.hbs b/lib/shared/addon/components/form-gke-taints/template.hbs new file mode 100644 index 000000000..8b9875e34 --- /dev/null +++ b/lib/shared/addon/components/form-gke-taints/template.hbs @@ -0,0 +1,76 @@ + +{{#if (gt taints.length 0)}} + + + + + + + + + + + + + {{#each taints as |taint|}} + + + + + + + + + + + + {{/each}} + +
+ {{#input-or-display + editable=editable + value=taint.effect + }} + {{searchable-select + class="form-control" + content=effectContent + value=taint.effect + }} + {{/input-or-display}} +   + {{#input-or-display + editable=editable + value=taint.key + }} + {{input + class="form-control" + value=taint.key + placeholder=(t "clusterNew.googlegke.taints.key.placeholder") + }} + {{/input-or-display}} +   + {{#input-or-display + editable=editable + value=taint.value + }} + {{input + class="form-control" + value=taint.value + placeholder=(t "clusterNew.googlegke.taints.value.placeholder") + }} + {{/input-or-display}} + + +
+{{/if}} + +{{#if editable}} +
+ +
+{{/if}} diff --git a/lib/shared/app/components/form-gke-taints/component.js b/lib/shared/app/components/form-gke-taints/component.js new file mode 100644 index 000000000..617c00470 --- /dev/null +++ b/lib/shared/app/components/form-gke-taints/component.js @@ -0,0 +1 @@ +export { default } from 'shared/components/form-gke-taints/component'; \ No newline at end of file diff --git a/translations/en-us.yaml b/translations/en-us.yaml index c3438eb8a..67aed3abd 100644 --- a/translations/en-us.yaml +++ b/translations/en-us.yaml @@ -2522,6 +2522,9 @@ clusterNew: label: Node Subnet nodeLabels: label: Node Labels + addAction: Add Label + clusterLabels: + label: Cluster Labels localSsdCount: label: Local SSD disks diskType: @@ -2575,6 +2578,18 @@ clusterNew: label: Cloud Source Repositories cloudDebugger: label: Cloud Debugger + taints: + label: Taints + addAction: Add Taint + effect: + label: Effect + key: + label: Key + placeholder: Key + value: + label: Value + placeholder: Value + required: 'Taint "key" and "value" are required.' huaweicce: label: Huawei Cloud Container Engine shortLabel: Huawei CCE diff --git a/translations/zh-hans.yaml b/translations/zh-hans.yaml index 3cac0014a..533f19820 100644 --- a/translations/zh-hans.yaml +++ b/translations/zh-hans.yaml @@ -2283,6 +2283,23 @@ clusterNew: label: 网络 subNetwork: label: 子网 + taints: + label: 节点污点 + addAction: 添加污点 + effect: + label: 效果 + key: + label: 键 + placeholder: 键 + value: + label: 值 + placeholder: 值 + required: '必须填写污点键和值' + nodeLabels: + label: 节点标签 + addAction: 添加标签 + clusterLabels: + label: 集群标签 header: iPAllocationPolicy: IP Allocation策略 privateCluster: 私有集群