This is an automated email from the ASF dual-hosted git repository. dahn pushed a commit to branch 4.22 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit cd6a8f61ca5a1d53c2d01d2ef0eb8a7ed3e5093a Merge: b869913529e 3d7d412d5be Author: Daan Hoogland <[email protected]> AuthorDate: Thu Feb 5 15:32:36 2026 +0100 Merge branch '4.20' into 4.22 .../cloudstack/api/BaseUpdateTemplateOrIsoCmd.java | 4 +- .../com/cloud/storage/dao/VMTemplateDaoImpl.java | 4 +- pom.xml | 8 +- .../com/cloud/template/TemplateManagerImpl.java | 5 +- .../cloud/vm/snapshot/VMSnapshotManagerImpl.java | 23 +-- .../cloud/vm/snapshot/VMSnapshotManagerTest.java | 42 ++++-- tools/checkstyle/src/main/resources/cloud-pmd.xml | 53 ++++--- ui/public/locales/en.json | 4 + ui/src/components/view/DomainDeleteConfirm.vue | 155 +++++++++++++++++++++ ui/src/views/iam/DomainView.vue | 56 +++++++- ui/src/views/image/UpdateTemplate.vue | 45 ++++-- 11 files changed, 325 insertions(+), 74 deletions(-) diff --cc server/src/main/java/com/cloud/template/TemplateManagerImpl.java index 4699be65888,194d97349f0..a5180c05b19 --- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java @@@ -2254,9 -2209,8 +2254,9 @@@ public class TemplateManagerImpl extend isRoutingTemplate == null && templateType == null && templateTag == null && + forCks == 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; diff --cc server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index 617a4e54a6e,cdbb7119e9e..6f7b96453ac --- a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@@ -479,10 -488,10 +486,10 @@@ public class VMSnapshotManagerImpl exte protected void addSupportForCustomServiceOffering(long vmId, long serviceOfferingId, long vmSnapshotId) { ServiceOfferingVO serviceOfferingVO = _serviceOfferingDao.findById(serviceOfferingId); if (serviceOfferingVO.isDynamic()) { - List<UserVmDetailVO> vmDetails = _userVmDetailsDao.listDetails(vmId); + List<VMInstanceDetailVO> vmDetails = _vmInstanceDetailsDao.listDetails(vmId); List<VMSnapshotDetailsVO> vmSnapshotDetails = new ArrayList<VMSnapshotDetailsVO>(); - for (UserVmDetailVO detail : vmDetails) { + for (VMInstanceDetailVO detail : vmDetails) { - if(detail.getName().equalsIgnoreCase(VmDetailConstants.CPU_NUMBER) || detail.getName().equalsIgnoreCase(VmDetailConstants.CPU_SPEED) || detail.getName().equalsIgnoreCase(VmDetailConstants.MEMORY)) { + if (VM_SNAPSHOT_CUSTOM_SERVICE_OFFERING_DETAILS.contains(detail.getName().toLowerCase())) { vmSnapshotDetails.add(new VMSnapshotDetailsVO(vmSnapshotId, detail.getName(), detail.getValue(), detail.isDisplay())); } } @@@ -955,11 -958,11 +962,11 @@@ ServiceOfferingVO serviceOfferingVO = _serviceOfferingDao.findById(vmSnapshotVo.getServiceOfferingId()); if (serviceOfferingVO.isDynamic()) { List<VMSnapshotDetailsVO> vmSnapshotDetails = _vmSnapshotDetailsDao.listDetails(vmSnapshotVo.getId()); - List<VMInstanceDetailVO> userVmDetails = new ArrayList<VMInstanceDetailVO>(); for (VMSnapshotDetailsVO detail : vmSnapshotDetails) { - userVmDetails.add(new VMInstanceDetailVO(userVm.getId(), detail.getName(), detail.getValue(), detail.isDisplay())); + if (VM_SNAPSHOT_CUSTOM_SERVICE_OFFERING_DETAILS.contains(detail.getName().toLowerCase())) { - _userVmDetailsDao.addDetail(userVm.getId(), detail.getName(), detail.getValue(), detail.isDisplay()); ++ _vmInstanceDetailsDao.addDetail(userVm.getId(), detail.getName(), detail.getValue(), detail.isDisplay()); + } } - _vmInstanceDetailsDao.saveDetails(userVmDetails); } } diff --cc server/src/test/java/com/cloud/vm/snapshot/VMSnapshotManagerTest.java index a0f09981a40,8d48fc4dac5..38f1680af6a --- a/server/src/test/java/com/cloud/vm/snapshot/VMSnapshotManagerTest.java +++ b/server/src/test/java/com/cloud/vm/snapshot/VMSnapshotManagerTest.java @@@ -51,8 -51,9 +51,9 @@@ import com.cloud.vm.UserVmManager import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineManager; + import com.cloud.vm.VmDetailConstants; import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.UserVmDetailsDao; +import com.cloud.vm.dao.VMInstanceDetailsDao; import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.snapshot.dao.VMSnapshotDao; import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao; @@@ -403,9 -408,20 +408,20 @@@ public class VMSnapshotManagerTest @Test public void testRevertUserVmDetailsFromVmSnapshotDynamicServiceOffering() { when(serviceOffering.isDynamic()).thenReturn(true); - _vmSnapshotMgr.revertUserVmDetailsFromVmSnapshot(vmMock, vmSnapshotVO); + VMSnapshotDetailsVO uefiSnapshotDetail = new VMSnapshotDetailsVO(VM_SNAPSHOT_ID, "UEFI", "SECURE", true); + List<VMSnapshotDetailsVO> snapshotDetailsWithUefi = Arrays.asList( + vmSnapshotDetailCpuNumber, vmSnapshotDetailMemory, uefiSnapshotDetail); + when(_vmSnapshotDetailsDao.listDetails(VM_SNAPSHOT_ID)).thenReturn(snapshotDetailsWithUefi); + + _vmSnapshotMgr.revertCustomServiceOfferingDetailsFromVmSnapshot(vmMock, vmSnapshotVO); + verify(_vmSnapshotDetailsDao).listDetails(VM_SNAPSHOT_ID); - verify(_vmInstanceDetailsDao).saveDetails(listUserVmDetailsCaptor.capture()); - verify(_userVmDetailsDao, never()).saveDetails(any()); ++ verify(_vmInstanceDetailsDao, never()).saveDetails(any()); + ArgumentCaptor<String> detailNameCaptor = ArgumentCaptor.forClass(String.class); - verify(_userVmDetailsDao, times(2)).addDetail(eq(TEST_VM_ID), detailNameCaptor.capture(), anyString(), anyBoolean()); ++ verify(_vmInstanceDetailsDao, times(2)).addDetail(eq(TEST_VM_ID), detailNameCaptor.capture(), anyString(), anyBoolean()); + List<String> appliedNames = detailNameCaptor.getAllValues(); + assertTrue(appliedNames.contains(VmDetailConstants.CPU_NUMBER)); + assertTrue(appliedNames.contains(VmDetailConstants.MEMORY)); + assertFalse("UEFI must not be applied from snapshot so that existing UEFI setting is preserved", appliedNames.contains("UEFI")); } - } diff --cc ui/src/views/image/UpdateTemplate.vue index 9f52eededd3,590e8c233c8..326cabc1f74 --- a/ui/src/views/image/UpdateTemplate.vue +++ b/ui/src/views/image/UpdateTemplate.vue @@@ -260,7 -246,8 +260,9 @@@ export default userdatapolicy: null, userdatapolicylist: {}, architectureTypes: {}, + originalOstypeid: null + detailsFields: [], + details: {} } }, beforeCreate () {
