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
This commit is contained in:
Suresh Kumar Anaparti 2026-02-03 14:21:43 +05:30 committed by GitHub
parent 6bed3d4e64
commit ce42ce54c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 41 additions and 19 deletions

View File

@ -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() {

View File

@ -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));
}

View File

@ -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);
}

View File

@ -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
}