From 021a64a5ecf2607d872cf9d7488e991e636936ab Mon Sep 17 00:00:00 2001 From: Francesco Torchia Date: Mon, 11 Nov 2024 19:52:58 +0100 Subject: [PATCH] Refactoring feature flags store functions Signed-off-by: Francesco Torchia --- pkg/harvester/components/UpgradeInfo.vue | 4 +++- .../components/settings/storage-network.vue | 4 +++- pkg/harvester/config/feature-flags.js | 12 ++++++------ .../harvesterhci.io.host/HarvesterKsmtuned.vue | 4 +++- pkg/harvester/list/harvesterhci.io.host.vue | 4 +++- pkg/harvester/models/harvester/node.js | 3 +-- .../models/kubevirt.io.virtualmachine.js | 3 +-- pkg/harvester/pages/c/_cluster/support/index.vue | 4 +++- pkg/harvester/store/harvester-common.js | 14 +++++++++++--- pkg/harvester/utils/feature-flags.js | 15 +++++---------- 10 files changed, 39 insertions(+), 28 deletions(-) diff --git a/pkg/harvester/components/UpgradeInfo.vue b/pkg/harvester/components/UpgradeInfo.vue index a96fa192..84c23a26 100644 --- a/pkg/harvester/components/UpgradeInfo.vue +++ b/pkg/harvester/components/UpgradeInfo.vue @@ -21,7 +21,9 @@ export default { }, upgradeLink() { - return docLink(DOC.UPGRADE_URL, this.$store.getters); + const version = this.$rootGetters['harvester-common/getServerVersion'](); + + return docLink(DOC.UPGRADE_URL, version); } }, }; diff --git a/pkg/harvester/components/settings/storage-network.vue b/pkg/harvester/components/settings/storage-network.vue index 689ebb24..d0b27628 100644 --- a/pkg/harvester/components/settings/storage-network.vue +++ b/pkg/harvester/components/settings/storage-network.vue @@ -88,7 +88,9 @@ export default { computed: { storageNetworkExampleLink() { - return docLink(DOC.STORAGE_NETWORK_EXAMPLE, this.$store.getters); + const version = this.$rootGetters['harvester-common/getServerVersion'](); + + return docLink(DOC.STORAGE_NETWORK_EXAMPLE, version); }, clusterNetworkOptions() { const inStore = this.$store.getters['currentProduct'].inStore; diff --git a/pkg/harvester/config/feature-flags.js b/pkg/harvester/config/feature-flags.js index c6573e6b..9767bcf6 100644 --- a/pkg/harvester/config/feature-flags.js +++ b/pkg/harvester/config/feature-flags.js @@ -1,16 +1,18 @@ // https://github.com/harvester/dashboard/releases/tag/v1.3.0 -const featuresV130 = []; +const featuresV130 = [ + 'supportHarvesterClusterVersion' +]; // https://github.com/harvester/dashboard/releases/tag/v1.3.1 const featuresV131 = [ + ...featuresV130, 'autoRotateRke2CertsSetting', 'supportBundleNodeCollectionTimeoutSetting' ]; // https://github.com/harvester/dashboard/releases/tag/v1.3.2 const featuresV132 = [ - 'autoRotateRke2CertsSetting', - 'supportBundleNodeCollectionTimeoutSetting', + ...featuresV131, 'kubeconfigDefaultTokenTTLMinutesSetting', 'improveMaintenanceMode', ]; @@ -22,9 +24,7 @@ const featuresV132 = [ // https://github.com/harvester/dashboard/releases/tag/v1.4.0-rc2 // https://github.com/harvester/dashboard/releases/tag/v1.4.0-rc1 const featuresV140 = [ - 'autoRotateRke2CertsSetting', - 'supportBundleNodeCollectionTimeoutSetting', - 'kubeconfigDefaultTokenTTLMinutesSetting', + ...featuresV132, 'cpuPinning', 'usbPassthrough', 'volumeEncryption', diff --git a/pkg/harvester/edit/harvesterhci.io.host/HarvesterKsmtuned.vue b/pkg/harvester/edit/harvesterhci.io.host/HarvesterKsmtuned.vue index 4158b7e4..de16e351 100644 --- a/pkg/harvester/edit/harvesterhci.io.host/HarvesterKsmtuned.vue +++ b/pkg/harvester/edit/harvesterhci.io.host/HarvesterKsmtuned.vue @@ -91,7 +91,9 @@ export default { }, ksmtunedLink() { - return docLink(DOC.KSMTUNED_MODE, this.$store.getters); + const version = this.$rootGetters['harvester-common/getServerVersion'](); + + return docLink(DOC.KSMTUNED_MODE, version); } }, diff --git a/pkg/harvester/list/harvesterhci.io.host.vue b/pkg/harvester/list/harvesterhci.io.host.vue index 1f0b17f7..321cc9a7 100644 --- a/pkg/harvester/list/harvesterhci.io.host.vue +++ b/pkg/harvester/list/harvesterhci.io.host.vue @@ -167,7 +167,9 @@ export default { }, consoleDocLink() { - return docLink(DOC.CONSOLE_URL, this.$store.getters); + const version = this.$rootGetters['harvester-common/getServerVersion'](); + + return docLink(DOC.CONSOLE_URL, version); } }, methods: { diff --git a/pkg/harvester/models/harvester/node.js b/pkg/harvester/models/harvester/node.js index 0a0833d9..b265db35 100644 --- a/pkg/harvester/models/harvester/node.js +++ b/pkg/harvester/models/harvester/node.js @@ -15,7 +15,6 @@ import { ucFirst } from '@shell/utils/string'; import HarvesterResource from '../harvester'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../../config/harvester'; import { HCI } from '../../types'; -import { featureEnabled } from '../../utils/feature-flags'; const ALLOW_SYSTEM_LABEL_KEYS = [ 'topology.kubernetes.io/zone', @@ -371,7 +370,7 @@ export default class HciNode extends HarvesterResource { } get cpuPinningFeatureEnabled() { - return featureEnabled(this.$rootGetters, 'cpuPinning'); + return this.$rootGetters['harvester-common/getFeatureEnabled']('cpuPinning'); } get isCPUManagerEnabled() { diff --git a/pkg/harvester/models/kubevirt.io.virtualmachine.js b/pkg/harvester/models/kubevirt.io.virtualmachine.js index f8be0a27..1d0ea6d6 100644 --- a/pkg/harvester/models/kubevirt.io.virtualmachine.js +++ b/pkg/harvester/models/kubevirt.io.virtualmachine.js @@ -13,7 +13,6 @@ import { parseVolumeClaimTemplates } from '@pkg/utils/vm'; import { BACKUP_TYPE } from '../config/types'; import { HCI } from '../types'; import HarvesterResource from './harvester'; -import { featureEnabled } from '../utils/feature-flags'; export const OFF = 'Off'; @@ -481,7 +480,7 @@ export default class VirtVm extends HarvesterResource { } get cpuPinningFeatureEnabled() { - return featureEnabled(this.$rootGetters, 'cpuPinning'); + return this.$rootGetters['harvester-common/getFeatureEnabled']('cpuPinning'); } get isCpuPinning() { diff --git a/pkg/harvester/pages/c/_cluster/support/index.vue b/pkg/harvester/pages/c/_cluster/support/index.vue index db24dd32..17824d94 100644 --- a/pkg/harvester/pages/c/_cluster/support/index.vue +++ b/pkg/harvester/pages/c/_cluster/support/index.vue @@ -76,7 +76,9 @@ export default { }, rancherIntegrationLink() { - return docLink(DOC.RANCHER_INTEGRATION_URL, this.$store.getters); + const version = this.$rootGetters['harvester-common/getServerVersion'](); + + return docLink(DOC.RANCHER_INTEGRATION_URL, version); }, }, diff --git a/pkg/harvester/store/harvester-common.js b/pkg/harvester/store/harvester-common.js index 24317016..e64328ae 100644 --- a/pkg/harvester/store/harvester-common.js +++ b/pkg/harvester/store/harvester-common.js @@ -1,7 +1,7 @@ import Parse from 'url-parse'; import { HCI } from '../types'; import { PRODUCT_NAME } from '../config/harvester'; -import { featureEnabled } from '../utils/feature-flags'; +import { featureEnabled, featureVersion } from '../utils/feature-flags'; const state = function() { return { @@ -71,8 +71,16 @@ const getters = { return (name) => state.uploadingImageError[name]; }, - getFeatureEnabled: (_state, _getters, _rootState, rootGetters) => (feature) => { - return featureEnabled(rootGetters, feature); + getServerVersion: (_state, _getters, _rootState, rootGetters) => () => { + const serverVersion = rootGetters['harvester/byId'](HCI.SETTING, 'server-version')?.value; + + return featureVersion(serverVersion); + }, + + getFeatureEnabled: (_state, _getters, _rootState, rootGetters) => (feature, version) => { + const serverVersion = version || rootGetters['harvester/byId'](HCI.SETTING, 'server-version')?.value; + + return featureEnabled(feature, serverVersion); }, getHarvesterClusterUrl: (state, getters, rootState, rootGetters) => (url) => { diff --git a/pkg/harvester/utils/feature-flags.js b/pkg/harvester/utils/feature-flags.js index f23c4a4b..08c77650 100644 --- a/pkg/harvester/utils/feature-flags.js +++ b/pkg/harvester/utils/feature-flags.js @@ -1,24 +1,19 @@ import semver from 'semver'; -import { HCI } from '../types'; import { RELEASE_FEATURES } from '../config/feature-flags'; -export const docLink = (suffix, getter) => { - const v = serverVersion(getter); - - const docVersion = `v${ semver.major(v) }.${ semver.minor(v) }`; +export const docLink = (suffix, version) => { + const docVersion = `v${ semver.major(version) }.${ semver.minor(version) }`; return `https://docs.harvesterhci.io/${ docVersion }${ suffix }`; }; -export function serverVersion(getters) { +export function featureVersion(v) { // e.g v1.4.0 if (process.env.VUE_APP_SERVER_VERSION) { return process.env.VUE_APP_SERVER_VERSION; } try { - const v = getters['harvester/byId'](HCI.SETTING, 'server-version')?.value; - return `v${ semver.major(v) }.${ semver.minor(v) }.${ semver.patch(v) }`; } catch (error) { // fallback to the latest version @@ -26,8 +21,8 @@ export function serverVersion(getters) { } } -export const featureEnabled = (getters, featureKey) => { - const version = serverVersion(getters); +export const featureEnabled = (featureKey, serverVersion) => { + const version = featureVersion(serverVersion); const releasedFeatures = RELEASE_FEATURES[version] || []; return releasedFeatures.includes(featureKey);