diff --git a/lib/shared/addon/components/cluster-driver/driver-gke/component.js b/lib/shared/addon/components/cluster-driver/driver-gke/component.js index 7000a10082..d1a7910392 100644 --- a/lib/shared/addon/components/cluster-driver/driver-gke/component.js +++ b/lib/shared/addon/components/cluster-driver/driver-gke/component.js @@ -242,9 +242,6 @@ export default Component.extend(ClusterDriver, { } } - if (isEmpty(config.kubernetesVersion)) { - set(this, 'config.kubernetesVersion', versions?.defaultClusterVersion); - } cb(true); }).catch((err) => { @@ -275,6 +272,14 @@ export default Component.extend(ClusterDriver, { }, }, + versionChoicesChanged: observer('versionChoices.[]', 'config.kubernetesVersion', 'versions.{validMasterVersions,channels}', function(){ + const { config, versionChoices } = this; + + if (isEmpty(config.kubernetesVersion)) { + set(this, 'config.kubernetesVersion', versionChoices[0].value); + } + }), + networkPolicyEnabledChanged: observer('config.networkPolicyEnabled', function() { if (get(this, 'isNew') && get(this, 'config.networkPolicyEnabled')) { set(this, 'config.clusterAddons.networkPolicyConfig', true); @@ -860,9 +865,7 @@ export default Component.extend(ClusterDriver, { } } - if (isEmpty(initialVersion)) { - initialVersion = validMasterVersions[0]; - } + if (this.editing && !validMasterVersions.includes(initialVersion)) { validMasterVersions.unshift(initialVersion); @@ -871,6 +874,11 @@ export default Component.extend(ClusterDriver, { Semver.rsort(validMasterVersions, { includePrerelease: true }); const versionChoices = this.serviceVersions.parseCloudProviderVersionChoicesV2(validMasterVersions.slice(), initialVersion, mode, null, false, MINIMUM_VERSION); + if (isEmpty(initialVersion)) { + initialVersion = versionChoices[0]?.value; + } + + if (this.editing) { try { const initialSem = Semver.parse(initialVersion, { includePrerelease: true }); diff --git a/lib/shared/addon/components/gke-node-pool-row/component.js b/lib/shared/addon/components/gke-node-pool-row/component.js index b5851d6f0f..af2f70d8c6 100644 --- a/lib/shared/addon/components/gke-node-pool-row/component.js +++ b/lib/shared/addon/components/gke-node-pool-row/component.js @@ -27,15 +27,12 @@ export default Component.extend({ nodeVersions: null, clusterVersion: null, upgradeVersion: false, + originalPoolVersion: null, init() { this._super(...arguments); - const { - nodePool, - clusterVersion, - defaultClusterVersion - } = this; + const { nodePool } = this; setProperties(this, { scopeConfig: {}, @@ -54,8 +51,8 @@ export default Component.extend({ } } - if (isEmpty(nodePool?.version) && !isEmpty(clusterVersion)) { - set(this, 'nodePool.version', defaultClusterVersion); + if (nodePool.version){ + set(this, 'originalPoolVersion', nodePool.version) } } else { setProperties(this, { @@ -87,15 +84,6 @@ export default Component.extend({ this.send('updateScopes'); }), - editingUpdateNodeVersion: observer('isNewNodePool', 'clusterVersion', function() { - const { isNewNodePool, clusterVersion } = this; - const nodeVersion = get(this, 'nodePool.version'); - - if (isNewNodePool && clusterVersion !== nodeVersion) { - set(this, 'nodePool.version', clusterVersion); - } - }), - autoscalingChanged: observer('nodePool.autoscaling.enabled', function() { if (this.isDestroyed || this.isDestroying) { return; @@ -124,6 +112,31 @@ export default Component.extend({ } }), + // if true, set np.version to latest version <= cp version + // if false, revert np.version + upgradeVersionChanged: observer('upgradeVersion', 'maxAvailableVersion', function() { + const { + upgradeVersion, originalPoolVersion, nodePool, maxAvailableVersion + } = this + + if (upgradeVersion){ + set(nodePool, 'version', maxAvailableVersion) + } else { + set(nodePool, 'version', originalPoolVersion) + } + }), + + // if the pool is new, keep version in sync with cp version + clusterVersionChanged: on('init', observer('clusterVersion', 'maxAvailableVersion', function(){ + const { + maxAvailableVersion, isNewNodePool, nodePool + } = this; + + if (isNewNodePool && maxAvailableVersion !== nodePool.version){ + set(nodePool, 'version', maxAvailableVersion) + } + })), + scopeConfigChanged: on('init', observer('scopeConfig', function() { if (this.isDestroyed || this.isDestroying) { return; @@ -181,26 +194,43 @@ export default Component.extend({ return ''; }), - upgradeAvailable: computed('clusterVersion', 'mode', 'nodePool.version', 'defaultClusterVersion', function() { - const { clusterVersion, defaultClusterVersion } = this; - const nodeVersion = get(this, 'nodePool.version'); + clusterWillUpgrade: computed('clusterVersion', 'originalClusterVersion', function(){ + const { clusterVersion, originalClusterVersion } = this; - if (isEmpty(clusterVersion) || isEmpty(nodeVersion)) { - return false; - } + return !!clusterVersion && !!originalClusterVersion && clusterVersion !== originalClusterVersion + }), - const nodeIsLess = Semver.lt(nodeVersion, clusterVersion, { includePrerelease: true }); - const clusterVersionIsAlsoTheMaxVersion = clusterVersion === defaultClusterVersion; + isNewNodePool: computed('nodePool.isNew', function() { + return this?.nodePool?.isNew ? true : false; + }), - if (nodeIsLess && clusterVersionIsAlsoTheMaxVersion) { - return true; - } + /** + * This property is used to show/hide a np version upgrade checkbox + * when the box is checked the np is upgraded to latest node version that is <= cp version + * with new node pools, the version is always kept in sync with the cp version so no checkbox shown + */ + upgradeAvailable: computed('isNewNodePool', 'clusterWillUpgrade', function(){ + const { isNewNodePool, clusterWillUpgrade } = this; - return false; + return !isNewNodePool && clusterWillUpgrade }), - isNewNodePool: computed('nodePool.isNew', function() { - return this?.nodePool?.isNew ? true : false; + + // GCP api provides a separate list of versions for node pools, which can be upgraded to anything <= control plane version + maxAvailableVersion: computed('clusterVersion', 'nodeVersions.[]', function() { + const { clusterVersion, nodeVersions } = this; + + const availableVersions = nodeVersions.filter((nv) => { + try { + const lteCP = Semver.lte(nv, clusterVersion, { includePreRelease: true }) + + return lteCP + } catch { + return + } + }) + + return availableVersions[0] }), editedMachineChoice: computed('nodePool.config.machineType', 'machineChoices', function() { @@ -221,14 +251,4 @@ export default Component.extend({ return out.sortBy('sortName') }), - - shouldUpgradeVersion: on('init', observer('upgradeVersion', 'clusterVersion', function() { - const { upgradeVersion, clusterVersion } = this; - const nodeVersion = get(this, 'nodePool.version'); - - if (upgradeVersion && clusterVersion !== nodeVersion) { - set(this, 'nodePool.version', clusterVersion); - } - })), - }); diff --git a/lib/shared/addon/components/gke-node-pool-row/template.hbs b/lib/shared/addon/components/gke-node-pool-row/template.hbs index 1a0bc372e1..6f87b6b8aa 100644 --- a/lib/shared/addon/components/gke-node-pool-row/template.hbs +++ b/lib/shared/addon/components/gke-node-pool-row/template.hbs @@ -19,11 +19,6 @@ - {{!-- --}} {{#if upgradeAvailable}}