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;