This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.20 by this push:
     new ce42ce54c2d Fix template details deletion while updating template from 
UI (#12559)
ce42ce54c2d is described below

commit ce42ce54c2d966bf5814afb7e0e4a1b973686ffa
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Tue Feb 3 14:21:43 2026 +0530

    Fix template details deletion while updating template from UI (#12559)
    
    * Fix template details deletion while updating template from UI
    
    * update the latest template details before submit
---
 .../cloudstack/api/BaseUpdateTemplateOrIsoCmd.java |  4 +-
 .../com/cloud/storage/dao/VMTemplateDaoImpl.java   |  4 +-
 .../com/cloud/template/TemplateManagerImpl.java    |  5 +--
 ui/src/views/image/UpdateTemplate.vue              | 47 ++++++++++++++++------
 4 files changed, 41 insertions(+), 19 deletions(-)

diff --git 
a/api/src/main/java/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java 
b/api/src/main/java/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java
index 696a500860e..54a398d756f 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java
@@ -145,8 +145,8 @@ public abstract class BaseUpdateTemplateOrIsoCmd extends 
BaseCmd {
         return (Map) (paramsCollection.toArray())[0];
     }
 
-    public boolean isCleanupDetails(){
-        return cleanupDetails == null ? false : cleanupDetails.booleanValue();
+    public boolean isCleanupDetails() {
+        return cleanupDetails != null && cleanupDetails;
     }
 
     public CPU.CPUArch getCPUArch() {
diff --git 
a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java 
b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java
index 98859789f82..45dffea7621 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java
@@ -459,7 +459,7 @@ public class VMTemplateDaoImpl extends 
GenericDaoBase<VMTemplateVO, Long> implem
         if (detailsStr == null) {
             return;
         }
-        List<VMTemplateDetailVO> details = new ArrayList<VMTemplateDetailVO>();
+        List<VMTemplateDetailVO> details = new ArrayList<>();
         for (String key : detailsStr.keySet()) {
             VMTemplateDetailVO detail = new VMTemplateDetailVO(tmpl.getId(), 
key, detailsStr.get(key), true);
             details.add(detail);
@@ -481,7 +481,7 @@ public class VMTemplateDaoImpl extends 
GenericDaoBase<VMTemplateVO, Long> implem
             }
 
             if (tmplt.getDetails() != null) {
-                List<VMTemplateDetailVO> details = new 
ArrayList<VMTemplateDetailVO>();
+                List<VMTemplateDetailVO> details = new ArrayList<>();
                 for (String key : tmplt.getDetails().keySet()) {
                     details.add(new VMTemplateDetailVO(tmplt.getId(), key, 
tmplt.getDetails().get(key), true));
                 }
diff --git a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java 
b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
index 78265021c0a..194d97349f0 100755
--- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
@@ -2210,7 +2210,7 @@ public class TemplateManagerImpl extends ManagerBase 
implements TemplateManager,
                   templateType == null &&
                   templateTag == null &&
                   arch == null &&
-                  (! cleanupDetails && details == null) //update details in 
every case except this one
+                  (!cleanupDetails && details == null) //update details in 
every case except this one
                   );
         if (!updateNeeded) {
             return template;
@@ -2308,8 +2308,7 @@ public class TemplateManagerImpl extends ManagerBase 
implements TemplateManager,
         if (cleanupDetails) {
             template.setDetails(null);
             _tmpltDetailsDao.removeDetails(id);
-        }
-        else if (details != null && !details.isEmpty()) {
+        } else if (details != null && !details.isEmpty()) {
             template.setDetails(details);
             _tmpltDao.saveDetails(template);
         }
diff --git a/ui/src/views/image/UpdateTemplate.vue 
b/ui/src/views/image/UpdateTemplate.vue
index 7db402cdd5b..590e8c233c8 100644
--- a/ui/src/views/image/UpdateTemplate.vue
+++ b/ui/src/views/image/UpdateTemplate.vue
@@ -245,7 +245,9 @@ export default {
       userdataid: null,
       userdatapolicy: null,
       userdatapolicylist: {},
-      architectureTypes: {}
+      architectureTypes: {},
+      detailsFields: [],
+      details: {}
     }
   },
   beforeCreate () {
@@ -295,17 +297,10 @@ export default {
           }
         }
       }
-      const resourceDetailsFields = []
       if (this.resource.hypervisor === 'KVM') {
-        resourceDetailsFields.push('rootDiskController')
+        this.detailsFields.push('rootDiskController')
       } else if (this.resource.hypervisor === 'VMware' && 
!this.resource.deployasis) {
-        resourceDetailsFields.push(...['rootDiskController', 'nicAdapter', 
'keyboard'])
-      }
-      for (var detailsField of resourceDetailsFields) {
-        var detailValue = this.resource?.details?.[detailsField] || null
-        if (detailValue) {
-          this.form[detailValue] = fieldValue
-        }
+        this.detailsFields.push(...['rootDiskController', 'nicAdapter', 
'keyboard'])
       }
     },
     fetchData () {
@@ -316,6 +311,7 @@ export default {
       this.fetchKeyboardTypes()
       this.fetchUserdata()
       this.fetchUserdataPolicy()
+      this.fetchDetails()
     },
     isValidValueForKey (obj, key) {
       if (this.emptyAllowedFields.includes(key) && obj[key] === '') {
@@ -360,6 +356,10 @@ export default {
           id: 'virtio',
           description: 'virtio'
         })
+        controller.push({
+          id: 'virtio-blk',
+          description: 'virtio-blk'
+        })
       } else if (hyperVisor === 'VMware') {
         controller.push({
           id: '',
@@ -486,6 +486,25 @@ export default {
         this.userdata.loading = false
       })
     },
+    fetchDetails () {
+      const params = {}
+      params.id = this.resource.id
+      params.templatefilter = 'all'
+
+      api('listTemplates', params).then(response => {
+        if (response?.listtemplatesresponse?.template?.length > 0) {
+          this.details = response.listtemplatesresponse.template[0].details
+          if (this.details) {
+            for (var detailsField of this.detailsFields) {
+              var detailValue = this.details?.[detailsField] || null
+              if (detailValue) {
+                this.form[detailsField] = detailValue
+              }
+            }
+          }
+        }
+      })
+    },
     handleSubmit (e) {
       e.preventDefault()
       if (this.loading) return
@@ -495,10 +514,14 @@ export default {
         const params = {
           id: this.resource.id
         }
-        const detailsField = ['rootDiskController', 'nicAdapter', 'keyboard']
+        if (this.details) {
+          Object.keys(this.details).forEach((detail, index) => {
+            params['details[0].' + detail] = this.details[detail]
+          })
+        }
         for (const key in values) {
           if (!this.isValidValueForKey(values, key)) continue
-          if (detailsField.includes(key)) {
+          if (this.detailsFields.includes(key)) {
             params['details[0].' + key] = values[key]
             continue
           }

Reply via email to