This is an automated email from the ASF dual-hosted git repository. dahn 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 742e131283a Update System VM template Guest OS version (#11291) 742e131283a is described below commit 742e131283a13e68f3c9c9b074f62c43242a0473 Author: Suresh Kumar Anaparti <sureshkumar.anapa...@gmail.com> AuthorDate: Fri Aug 1 17:20:35 2025 +0530 Update System VM template Guest OS version (#11291) --- .../upgrade/SystemVmTemplateRegistration.java | 63 +++++++++++++++++----- .../upgrade/SystemVmTemplateRegistrationTest.java | 10 ++-- engine/schema/templateConfig.sh | 12 ++++- 3 files changed, 66 insertions(+), 19 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java index e711c564015..26b033c8d79 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java @@ -64,11 +64,14 @@ import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDaoImpl; import com.cloud.hypervisor.Hypervisor; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.GuestOSVO; import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateZoneVO; +import com.cloud.storage.dao.GuestOSDao; +import com.cloud.storage.dao.GuestOSDaoImpl; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDaoImpl; import com.cloud.storage.dao.VMTemplateZoneDao; @@ -102,15 +105,13 @@ public class SystemVmTemplateRegistration { private static final String PARTIAL_TEMPLATE_FOLDER = String.format("/template/tmpl/%d/", Account.ACCOUNT_ID_SYSTEM); private static final String storageScriptsDir = "scripts/storage/secondary"; private static final Integer OTHER_LINUX_ID = 99; - private static final Integer LINUX_5_ID = 15; - private static final Integer LINUX_7_ID = 183; + private static Integer LINUX_12_ID = 363; private static final Integer SCRIPT_TIMEOUT = 1800000; private static final Integer LOCK_WAIT_TIMEOUT = 1200; protected static final List<CPU.CPUArch> DOWNLOADABLE_TEMPLATE_ARCH_TYPES = Arrays.asList( CPU.CPUArch.arm64 ); - public static String CS_MAJOR_VERSION = null; public static String CS_TINY_VERSION = null; @@ -132,6 +133,8 @@ public class SystemVmTemplateRegistration { ClusterDao clusterDao; @Inject ConfigurationDao configurationDao; + @Inject + private GuestOSDao guestOSDao; private String systemVmTemplateVersion; @@ -147,6 +150,7 @@ public class SystemVmTemplateRegistration { imageStoreDetailsDao = new ImageStoreDetailsDaoImpl(); clusterDao = new ClusterDaoImpl(); configurationDao = new ConfigurationDaoImpl(); + guestOSDao = new GuestOSDaoImpl(); tempDownloadDir = new File(System.getProperty("java.io.tmpdir")); } @@ -320,7 +324,7 @@ public class SystemVmTemplateRegistration { public static final Map<String, MetadataTemplateDetails> NewTemplateMap = new HashMap<>(); - public static final Map<Hypervisor.HypervisorType, String> RouterTemplateConfigurationNames = new HashMap<Hypervisor.HypervisorType, String>() { + public static final Map<Hypervisor.HypervisorType, String> RouterTemplateConfigurationNames = new HashMap<>() { { put(Hypervisor.HypervisorType.KVM, "router.template.kvm"); put(Hypervisor.HypervisorType.VMware, "router.template.vmware"); @@ -331,14 +335,14 @@ public class SystemVmTemplateRegistration { } }; - public static final Map<Hypervisor.HypervisorType, Integer> hypervisorGuestOsMap = new HashMap<Hypervisor.HypervisorType, Integer>() { + public static Map<Hypervisor.HypervisorType, Integer> hypervisorGuestOsMap = new HashMap<>() { { - put(Hypervisor.HypervisorType.KVM, LINUX_5_ID); + put(Hypervisor.HypervisorType.KVM, LINUX_12_ID); put(Hypervisor.HypervisorType.XenServer, OTHER_LINUX_ID); put(Hypervisor.HypervisorType.VMware, OTHER_LINUX_ID); - put(Hypervisor.HypervisorType.Hyperv, LINUX_5_ID); - put(Hypervisor.HypervisorType.LXC, LINUX_5_ID); - put(Hypervisor.HypervisorType.Ovm3, LINUX_7_ID); + put(Hypervisor.HypervisorType.Hyperv, LINUX_12_ID); + put(Hypervisor.HypervisorType.LXC, LINUX_12_ID); + put(Hypervisor.HypervisorType.Ovm3, LINUX_12_ID); } }; @@ -595,6 +599,23 @@ public class SystemVmTemplateRegistration { vmInstanceDao.updateSystemVmTemplateId(templateId, hypervisorType); } + private void updateSystemVmTemplateGuestOsId() { + String systemVmGuestOsName = "Debian GNU/Linux 12 (64-bit)"; // default + try { + GuestOSVO guestOS = guestOSDao.findOneByDisplayName(systemVmGuestOsName); + if (guestOS != null) { + LOGGER.debug("Updating SystemVM Template Guest OS [{}] id", systemVmGuestOsName); + SystemVmTemplateRegistration.LINUX_12_ID = Math.toIntExact(guestOS.getId()); + hypervisorGuestOsMap.put(Hypervisor.HypervisorType.KVM, LINUX_12_ID); + hypervisorGuestOsMap.put(Hypervisor.HypervisorType.Hyperv, LINUX_12_ID); + hypervisorGuestOsMap.put(Hypervisor.HypervisorType.LXC, LINUX_12_ID); + hypervisorGuestOsMap.put(Hypervisor.HypervisorType.Ovm3, LINUX_12_ID); + } + } catch (Exception e) { + LOGGER.warn("Couldn't update SystemVM Template Guest OS id, due to {}", e.getMessage()); + } + } + public void updateConfigurationParams(Map<String, String> configParams) { for (Map.Entry<String, String> config : configParams.entrySet()) { boolean updated = configurationDao.update(config.getKey(), config.getValue()); @@ -813,7 +834,8 @@ public class SystemVmTemplateRegistration { section.get("filename"), section.get("downloadurl"), section.get("checksum"), - hypervisorType.second())); + hypervisorType.second(), + section.get("guestos"))); } Ini.Section defaultSection = ini.get("default"); return defaultSection.get("version").trim(); @@ -965,6 +987,10 @@ public class SystemVmTemplateRegistration { private void updateRegisteredTemplateDetails(Long templateId, MetadataTemplateDetails templateDetails) { VMTemplateVO templateVO = vmTemplateDao.findById(templateId); templateVO.setTemplateType(Storage.TemplateType.SYSTEM); + GuestOSVO guestOS = guestOSDao.findOneByDisplayName(templateDetails.getGuestOs()); + if (guestOS != null) { + templateVO.setGuestOSId(guestOS.getId()); + } boolean updated = vmTemplateDao.update(templateVO.getId(), templateVO); if (!updated) { String errMsg = String.format("updateSystemVmTemplates:Exception while updating template with id %s to be marked as 'system'", templateId); @@ -980,9 +1006,13 @@ public class SystemVmTemplateRegistration { updateConfigurationParams(configParams); } - private void updateTemplateUrlAndChecksum(VMTemplateVO templateVO, MetadataTemplateDetails templateDetails) { + private void updateTemplateUrlChecksumAndGuestOsId(VMTemplateVO templateVO, MetadataTemplateDetails templateDetails) { templateVO.setUrl(templateDetails.getUrl()); templateVO.setChecksum(templateDetails.getChecksum()); + GuestOSVO guestOS = guestOSDao.findOneByDisplayName(templateDetails.getGuestOs()); + if (guestOS != null) { + templateVO.setGuestOSId(guestOS.getId()); + } boolean updated = vmTemplateDao.update(templateVO.getId(), templateVO); if (!updated) { String errMsg = String.format("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type %s", templateDetails.getHypervisorType()); @@ -1020,7 +1050,7 @@ public class SystemVmTemplateRegistration { VMTemplateVO templateVO = vmTemplateDao.findLatestTemplateByTypeAndHypervisorAndArch( templateDetails.getHypervisorType(), templateDetails.getArch(), Storage.TemplateType.SYSTEM); if (templateVO != null) { - updateTemplateUrlAndChecksum(templateVO, templateDetails); + updateTemplateUrlChecksumAndGuestOsId(templateVO, templateDetails); } } } @@ -1029,6 +1059,7 @@ public class SystemVmTemplateRegistration { public void updateSystemVmTemplates(final Connection conn) { LOGGER.debug("Updating System Vm template IDs"); + updateSystemVmTemplateGuestOsId(); Transaction.execute(new TransactionCallbackNoReturn() { @Override public void doInTransactionWithoutResult(final TransactionStatus status) { @@ -1076,15 +1107,17 @@ public class SystemVmTemplateRegistration { private final String checksum; private final CPU.CPUArch arch; private String downloadedFilePath; + private final String guestOs; MetadataTemplateDetails(Hypervisor.HypervisorType hypervisorType, String name, String filename, String url, - String checksum, CPU.CPUArch arch) { + String checksum, CPU.CPUArch arch, String guestOs) { this.hypervisorType = hypervisorType; this.name = name; this.filename = filename; this.url = url; this.checksum = checksum; this.arch = arch; + this.guestOs = guestOs; } public Hypervisor.HypervisorType getHypervisorType() { @@ -1111,6 +1144,10 @@ public class SystemVmTemplateRegistration { return arch; } + public String getGuestOs() { + return guestOs; + } + public String getDownloadedFilePath() { return downloadedFilePath; } diff --git a/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java b/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java index 27656fd33b0..6573a5565f3 100644 --- a/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java +++ b/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java @@ -192,7 +192,7 @@ public class SystemVmTemplateRegistrationTest { public void testValidateTemplateFile_fileNotFound() { SystemVmTemplateRegistration.MetadataTemplateDetails details = new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, - "name", "file", "url", "checksum", CPU.CPUArch.amd64); + "name", "file", "url", "checksum", CPU.CPUArch.amd64, "guestos"); SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey( details.getHypervisorType(), details.getArch()), details); doReturn(null).when(systemVmTemplateRegistration).getTemplateFile(details); @@ -209,7 +209,7 @@ public class SystemVmTemplateRegistrationTest { public void testValidateTemplateFile_checksumMismatch() { SystemVmTemplateRegistration.MetadataTemplateDetails details = new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, - "name", "file", "url", "checksum", CPU.CPUArch.amd64); + "name", "file", "url", "checksum", CPU.CPUArch.amd64, "guestos"); File dummyFile = new File("dummy.txt"); SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey( details.getHypervisorType(), details.getArch()), details); @@ -228,7 +228,7 @@ public class SystemVmTemplateRegistrationTest { public void testValidateTemplateFile_success() { SystemVmTemplateRegistration.MetadataTemplateDetails details = new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, - "name", "file", "url", "checksum", CPU.CPUArch.amd64); + "name", "file", "url", "checksum", CPU.CPUArch.amd64, "guestos"); File dummyFile = new File("dummy.txt"); SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey( details.getHypervisorType(), details.getArch()), details); @@ -285,7 +285,7 @@ public class SystemVmTemplateRegistrationTest { SystemVmTemplateRegistration.MetadataTemplateDetails details = new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, "name", "nonexistent.qcow2", "http://example.com/file.qcow2", - "", CPU.CPUArch.arm64); + "", CPU.CPUArch.arm64, "guestos"); try (MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class); MockedStatic<HttpUtils> httpMock = Mockito.mockStatic(HttpUtils.class)) { filesMock.when(() -> Files.isWritable(any(Path.class))).thenReturn(true); @@ -301,7 +301,7 @@ public class SystemVmTemplateRegistrationTest { SystemVmTemplateRegistration.MetadataTemplateDetails details = new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, "name", "file.qcow2", "http://example.com/file.qcow2", - "", CPU.CPUArch.arm64); + "", CPU.CPUArch.arm64, "guestos"); try (MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class); MockedStatic<HttpUtils> httpMock = Mockito.mockStatic(HttpUtils.class)) { filesMock.when(() -> Files.isWritable(any(Path.class))).thenReturn(false); diff --git a/engine/schema/templateConfig.sh b/engine/schema/templateConfig.sh index bed51a48a8f..d10b8668b12 100644 --- a/engine/schema/templateConfig.sh +++ b/engine/schema/templateConfig.sh @@ -42,6 +42,15 @@ function getGenericName() { fi } +function getGuestOS() { + hypervisor=$(echo "$1" | tr "[:upper:]" "[:lower:]") + if [[ "$hypervisor" == "vmware" || "$hypervisor" == "xenserver" ]]; then + echo "Other Linux (64-bit)" + else + echo "Debian GNU/Linux 12 (64-bit)" + fi +} + function getChecksum() { local fileData="$1" local hvName=$2 @@ -60,13 +69,14 @@ function createMetadataFile() { section="${template%%:*}" sectionHv="${section%%-*}" hvName=$(getGenericName $sectionHv) + guestos=$(getGuestOS $sectionHv) downloadurl="${template#*:}" arch=$(echo ${downloadurl#*"/systemvmtemplate-$VERSION-"} | cut -d'-' -f 1) templatename="systemvm-${sectionHv%.*}-${VERSION}-${arch}" checksum=$(getChecksum "$fileData" "$VERSION-${arch}-$hvName") filename=$(echo ${downloadurl##*'/'}) - echo -e "["$section"]\ntemplatename = $templatename\nchecksum = $checksum\ndownloadurl = $downloadurl\nfilename = $filename\narch = $arch\n" >> $METADATAFILE + echo -e "["$section"]\ntemplatename = $templatename\nchecksum = $checksum\ndownloadurl = $downloadurl\nfilename = $filename\narch = $arch\nguestos = $guestos\n" >> $METADATAFILE done }