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
}