From 4f10dea9e09081f17552af465af83b10e877bcd7 Mon Sep 17 00:00:00 2001 From: Abhisar Sinha <63767682+abh1sar@users.noreply.github.com> Date: Thu, 25 Sep 2025 14:42:37 +0530 Subject: [PATCH 1/2] UI support for extraconfig in deploy and update instance --- ui/public/locales/en.json | 2 ++ ui/src/views/compute/DeployVM.vue | 25 ++++++++++++++++++++++++- ui/src/views/compute/EditVM.vue | 25 ++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 1dd29d5a9297..bd52467e4d06 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -1051,6 +1051,8 @@ "label.externalid": "External Id", "label.externalloadbalanceripaddress": "External load balancer IP address.", "label.extra": "Extra arguments", +"label.extraconfig": "Additional Configuration", +"label.extraconfig.tooltip": "Additional configuration parameters (extraconfig) to pass to the instance in plain text", "label.f5": "F5", "label.f5.ip.loadbalancer": "F5 BIG-IP load balancer.", "label.failed": "Failed", diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue index 854d082075f1..a26ae78a4d6d 100644 --- a/ui/src/views/compute/DeployVM.vue +++ b/ui/src/views/compute/DeployVM.vue @@ -762,6 +762,12 @@ + + + + 0) { deployVmData.userdata = this.$toBase64AndURIEncoded(values.userdata) } + if (values.extraconfig && values.extraconfig.length > 0) { + deployVmData.extraconfig = encodeURIComponent(values.extraconfig) + } // step 2: select template/iso if (this.imageType === 'templateid') { deployVmData.templateid = values.templateid diff --git a/ui/src/views/compute/EditVM.vue b/ui/src/views/compute/EditVM.vue index 7489674b9664..a5ba6326da0a 100644 --- a/ui/src/views/compute/EditVM.vue +++ b/ui/src/views/compute/EditVM.vue @@ -91,6 +91,12 @@ + + + + { + const configResponse = json.listconfigurationsresponse.configuration || [] + this.extraConfigEnabled = configResponse[0]?.value === 'true' + }).catch(error => { + this.$notifyError(error) + }) + }, handleSubmit () { this.formRef.value.validate().then(() => { const values = toRaw(this.form) @@ -397,6 +417,9 @@ export default { if (values.userdata && values.userdata.length > 0) { params.userdata = this.$toBase64AndURIEncoded(values.userdata) } + if (values.extraconfig && values.extraconfig.length > 0) { + params.extraconfig = encodeURIComponent(values.extraconfig) + } if (values.leaseduration !== undefined && (values.leaseduration === -1 || values.leaseduration > 0)) { params.leaseduration = values.leaseduration if (values.leaseexpiryaction !== undefined) { From 64b396e9066e3543a24ba54a04088c26d2ffc67d Mon Sep 17 00:00:00 2001 From: Abhisar Sinha <63767682+abh1sar@users.noreply.github.com> Date: Thu, 25 Sep 2025 14:57:39 +0530 Subject: [PATCH 2/2] Fix kvm multiple extraconfig bug --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 854886d233e0..2f79aa592c1b 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -6712,8 +6712,8 @@ protected void persistExtraConfigKvm(String decodedUrl, UserVm vm) { // validate config against denied cfg commands validateKvmExtraConfig(decodedUrl, vm.getAccountId()); String[] extraConfigs = decodedUrl.split("\n\n"); + int i = 1; for (String cfg : extraConfigs) { - int i = 1; String[] cfgParts = cfg.split("\n"); String extraConfigKey = ApiConstants.EXTRA_CONFIG; String extraConfigValue;