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
 }
 

Reply via email to