From 264e404108ad3b35389e0a444db2fccb6592ae17 Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Thu, 24 Jul 2025 09:30:20 +0530 Subject: [PATCH] Fix for dynamic scaling toggle for instance (#11086) * Fix for dynamic scaling toggle for instance * Update api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java --------- Co-authored-by: Suresh Kumar Anaparti --- .../command/user/config/ListCapabilitiesCmd.java | 1 + .../api/response/CapabilitiesResponse.java | 8 ++++++++ .../com/cloud/server/ManagementServerImpl.java | 1 + ui/src/views/compute/DeployVM.vue | 14 +++----------- ui/src/views/compute/DeployVnfAppliance.vue | 14 +++----------- ui/src/views/compute/EditVM.vue | 16 ++-------------- 6 files changed, 18 insertions(+), 36 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java index 65920a97c98..4f036e89a64 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java @@ -71,6 +71,7 @@ public class ListCapabilitiesCmd extends BaseCmd { response.setInstancesStatsUserOnly((Boolean) capabilities.get(ApiConstants.INSTANCES_STATS_USER_ONLY)); response.setInstancesDisksStatsRetentionEnabled((Boolean) capabilities.get(ApiConstants.INSTANCES_DISKS_STATS_RETENTION_ENABLED)); response.setInstancesDisksStatsRetentionTime((Integer) capabilities.get(ApiConstants.INSTANCES_DISKS_STATS_RETENTION_TIME)); + response.setDynamicScalingEnabled((Boolean) capabilities.get(ApiConstants.DYNAMIC_SCALING_ENABLED)); response.setObjectName("capability"); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java index e4224c85e97..83fb4f4b372 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java @@ -124,6 +124,10 @@ public class CapabilitiesResponse extends BaseResponse { @Param(description = "the retention time for Instances disks stats", since = "4.18.0") private Integer instancesDisksStatsRetentionTime; + @SerializedName(ApiConstants.DYNAMIC_SCALING_ENABLED) + @Param(description = "true if dynamically scaling for instances is enabled", since = "4.21.0") + private Boolean dynamicScalingEnabled; + public void setSecurityGroupsEnabled(boolean securityGroupsEnabled) { this.securityGroupsEnabled = securityGroupsEnabled; } @@ -223,4 +227,8 @@ public class CapabilitiesResponse extends BaseResponse { public void setCustomHypervisorDisplayName(String customHypervisorDisplayName) { this.customHypervisorDisplayName = customHypervisorDisplayName; } + + public void setDynamicScalingEnabled(Boolean dynamicScalingEnabled) { + this.dynamicScalingEnabled = dynamicScalingEnabled; + } } diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 7ccd6b5e289..451c8f4e159 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -4408,6 +4408,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe capabilities.put(ApiConstants.INSTANCES_STATS_USER_ONLY, StatsCollector.vmStatsCollectUserVMOnly.value()); capabilities.put(ApiConstants.INSTANCES_DISKS_STATS_RETENTION_ENABLED, StatsCollector.vmDiskStatsRetentionEnabled.value()); capabilities.put(ApiConstants.INSTANCES_DISKS_STATS_RETENTION_TIME, StatsCollector.vmDiskStatsMaxRetentionTime.value()); + capabilities.put(ApiConstants.DYNAMIC_SCALING_ENABLED, UserVmManager.EnableDynamicallyScaleVm.value()); if (apiLimitEnabled) { capabilities.put("apiLimitInterval", apiLimitInterval); capabilities.put("apiLimitMax", apiLimitMax); diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue index c99ffe4d321..30ac498c5c2 100644 --- a/ui/src/views/compute/DeployVM.vue +++ b/ui/src/views/compute/DeployVM.vue @@ -944,8 +944,7 @@ export default { keyboards: [], bootTypes: [], bootModes: [], - ioPolicyTypes: [], - dynamicScalingVmConfig: false + ioPolicyTypes: [] }, rowCount: {}, loading: { @@ -1175,13 +1174,6 @@ export default { type: 'Routing' }, field: 'hostid' - }, - dynamicScalingVmConfig: { - list: 'listConfigurations', - options: { - zoneid: _.get(this.zone, 'id'), - name: 'enable.dynamic.scale.vm' - } } } }, @@ -1312,7 +1304,7 @@ export default { return Boolean('listUserData' in this.$store.getters.apis) }, dynamicScalingVmConfigValue () { - return this.options.dynamicScalingVmConfig?.[0]?.value === 'true' + return this.$store.getters.features.dynamicscalingenabled }, isCustomizedDiskIOPS () { return this.diskSelected?.iscustomizediops || false @@ -2215,7 +2207,7 @@ export default { param.loading = true param.opts = [] const options = param.options || {} - if (!('listall' in options) && !['zones', 'pods', 'clusters', 'hosts', 'dynamicScalingVmConfig', 'hypervisors'].includes(name)) { + if (!('listall' in options) && !['zones', 'pods', 'clusters', 'hosts', 'hypervisors'].includes(name)) { options.listall = true } api(param.list, options).then((response) => { diff --git a/ui/src/views/compute/DeployVnfAppliance.vue b/ui/src/views/compute/DeployVnfAppliance.vue index 5e1baac3d8f..b69b67aa8d3 100644 --- a/ui/src/views/compute/DeployVnfAppliance.vue +++ b/ui/src/views/compute/DeployVnfAppliance.vue @@ -960,8 +960,7 @@ export default { keyboards: [], bootTypes: [], bootModes: [], - ioPolicyTypes: [], - dynamicScalingVmConfig: false + ioPolicyTypes: [] }, rowCount: {}, loading: { @@ -1194,13 +1193,6 @@ export default { type: 'Routing' }, field: 'hostid' - }, - dynamicScalingVmConfig: { - list: 'listConfigurations', - options: { - zoneid: _.get(this.zone, 'id'), - name: 'enable.dynamic.scale.vm' - } } } }, @@ -1332,7 +1324,7 @@ export default { return Boolean('listUserData' in this.$store.getters.apis) }, dynamicScalingVmConfigValue () { - return this.options.dynamicScalingVmConfig?.[0]?.value === 'true' + return this.$store.getters.features.dynamicscalingenabled }, isCustomizedDiskIOPS () { return this.diskSelected?.iscustomizediops || false @@ -2403,7 +2395,7 @@ export default { param.loading = true param.opts = [] const options = param.options || {} - if (!('listall' in options) && !['zones', 'pods', 'clusters', 'hosts', 'dynamicScalingVmConfig', 'hypervisors'].includes(name)) { + if (!('listall' in options) && !['zones', 'pods', 'clusters', 'hosts', 'hypervisors'].includes(name)) { options.listall = true } api(param.list, options).then((response) => { diff --git a/ui/src/views/compute/EditVM.vue b/ui/src/views/compute/EditVM.vue index 92079b84113..90cc96dd9ef 100644 --- a/ui/src/views/compute/EditVM.vue +++ b/ui/src/views/compute/EditVM.vue @@ -145,7 +145,6 @@ export default { template: {}, userDataEnabled: false, securityGroupsEnabled: false, - dynamicScalingVmConfig: false, loading: false, securitygroups: { loading: false, @@ -189,7 +188,6 @@ export default { this.fetchInstaceGroups() this.fetchServiceOfferingData() this.fetchTemplateData() - this.fetchDynamicScalingVmConfig() this.fetchUserData() }, fetchZoneDetails () { @@ -241,18 +239,8 @@ export default { this.template = templateResponses[0] }) }, - fetchDynamicScalingVmConfig () { - const params = {} - params.name = 'enable.dynamic.scale.vm' - params.zoneid = this.resource.zoneid - var apiName = 'listConfigurations' - api(apiName, params).then(json => { - const configResponse = json.listconfigurationsresponse.configuration - this.dynamicScalingVmConfig = configResponse[0]?.value === 'true' - }) - }, - canDynamicScalingEnabled () { - return this.template.isdynamicallyscalable && this.serviceOffering.dynamicscalingenabled && this.dynamicScalingVmConfig + isDynamicScalingEnabled () { + return this.template.isdynamicallyscalable && this.serviceOffering.dynamicscalingenabled && this.$store.getters.features.dynamicscalingenabled }, fetchOsTypes () { this.osTypes.loading = true