Update System VM template Guest OS version (#11291)

This commit is contained in:
Suresh Kumar Anaparti 2025-08-01 17:20:35 +05:30 committed by GitHub
parent ed0d606e98
commit 742e131283
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 66 additions and 19 deletions

View File

@ -64,11 +64,14 @@ import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.DataCenterDaoImpl; import com.cloud.dc.dao.DataCenterDaoImpl;
import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor;
import com.cloud.storage.DataStoreRole; import com.cloud.storage.DataStoreRole;
import com.cloud.storage.GuestOSVO;
import com.cloud.storage.Storage; import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VMTemplateZoneVO; 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.VMTemplateDao;
import com.cloud.storage.dao.VMTemplateDaoImpl; import com.cloud.storage.dao.VMTemplateDaoImpl;
import com.cloud.storage.dao.VMTemplateZoneDao; 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 PARTIAL_TEMPLATE_FOLDER = String.format("/template/tmpl/%d/", Account.ACCOUNT_ID_SYSTEM);
private static final String storageScriptsDir = "scripts/storage/secondary"; private static final String storageScriptsDir = "scripts/storage/secondary";
private static final Integer OTHER_LINUX_ID = 99; private static final Integer OTHER_LINUX_ID = 99;
private static final Integer LINUX_5_ID = 15; private static Integer LINUX_12_ID = 363;
private static final Integer LINUX_7_ID = 183;
private static final Integer SCRIPT_TIMEOUT = 1800000; private static final Integer SCRIPT_TIMEOUT = 1800000;
private static final Integer LOCK_WAIT_TIMEOUT = 1200; private static final Integer LOCK_WAIT_TIMEOUT = 1200;
protected static final List<CPU.CPUArch> DOWNLOADABLE_TEMPLATE_ARCH_TYPES = Arrays.asList( protected static final List<CPU.CPUArch> DOWNLOADABLE_TEMPLATE_ARCH_TYPES = Arrays.asList(
CPU.CPUArch.arm64 CPU.CPUArch.arm64
); );
public static String CS_MAJOR_VERSION = null; public static String CS_MAJOR_VERSION = null;
public static String CS_TINY_VERSION = null; public static String CS_TINY_VERSION = null;
@ -132,6 +133,8 @@ public class SystemVmTemplateRegistration {
ClusterDao clusterDao; ClusterDao clusterDao;
@Inject @Inject
ConfigurationDao configurationDao; ConfigurationDao configurationDao;
@Inject
private GuestOSDao guestOSDao;
private String systemVmTemplateVersion; private String systemVmTemplateVersion;
@ -147,6 +150,7 @@ public class SystemVmTemplateRegistration {
imageStoreDetailsDao = new ImageStoreDetailsDaoImpl(); imageStoreDetailsDao = new ImageStoreDetailsDaoImpl();
clusterDao = new ClusterDaoImpl(); clusterDao = new ClusterDaoImpl();
configurationDao = new ConfigurationDaoImpl(); configurationDao = new ConfigurationDaoImpl();
guestOSDao = new GuestOSDaoImpl();
tempDownloadDir = new File(System.getProperty("java.io.tmpdir")); 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<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.KVM, "router.template.kvm");
put(Hypervisor.HypervisorType.VMware, "router.template.vmware"); 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.XenServer, OTHER_LINUX_ID);
put(Hypervisor.HypervisorType.VMware, OTHER_LINUX_ID); put(Hypervisor.HypervisorType.VMware, OTHER_LINUX_ID);
put(Hypervisor.HypervisorType.Hyperv, LINUX_5_ID); put(Hypervisor.HypervisorType.Hyperv, LINUX_12_ID);
put(Hypervisor.HypervisorType.LXC, LINUX_5_ID); put(Hypervisor.HypervisorType.LXC, LINUX_12_ID);
put(Hypervisor.HypervisorType.Ovm3, LINUX_7_ID); put(Hypervisor.HypervisorType.Ovm3, LINUX_12_ID);
} }
}; };
@ -595,6 +599,23 @@ public class SystemVmTemplateRegistration {
vmInstanceDao.updateSystemVmTemplateId(templateId, hypervisorType); 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) { public void updateConfigurationParams(Map<String, String> configParams) {
for (Map.Entry<String, String> config : configParams.entrySet()) { for (Map.Entry<String, String> config : configParams.entrySet()) {
boolean updated = configurationDao.update(config.getKey(), config.getValue()); boolean updated = configurationDao.update(config.getKey(), config.getValue());
@ -813,7 +834,8 @@ public class SystemVmTemplateRegistration {
section.get("filename"), section.get("filename"),
section.get("downloadurl"), section.get("downloadurl"),
section.get("checksum"), section.get("checksum"),
hypervisorType.second())); hypervisorType.second(),
section.get("guestos")));
} }
Ini.Section defaultSection = ini.get("default"); Ini.Section defaultSection = ini.get("default");
return defaultSection.get("version").trim(); return defaultSection.get("version").trim();
@ -965,6 +987,10 @@ public class SystemVmTemplateRegistration {
private void updateRegisteredTemplateDetails(Long templateId, MetadataTemplateDetails templateDetails) { private void updateRegisteredTemplateDetails(Long templateId, MetadataTemplateDetails templateDetails) {
VMTemplateVO templateVO = vmTemplateDao.findById(templateId); VMTemplateVO templateVO = vmTemplateDao.findById(templateId);
templateVO.setTemplateType(Storage.TemplateType.SYSTEM); 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); boolean updated = vmTemplateDao.update(templateVO.getId(), templateVO);
if (!updated) { if (!updated) {
String errMsg = String.format("updateSystemVmTemplates:Exception while updating template with id %s to be marked as 'system'", templateId); 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); updateConfigurationParams(configParams);
} }
private void updateTemplateUrlAndChecksum(VMTemplateVO templateVO, MetadataTemplateDetails templateDetails) { private void updateTemplateUrlChecksumAndGuestOsId(VMTemplateVO templateVO, MetadataTemplateDetails templateDetails) {
templateVO.setUrl(templateDetails.getUrl()); templateVO.setUrl(templateDetails.getUrl());
templateVO.setChecksum(templateDetails.getChecksum()); templateVO.setChecksum(templateDetails.getChecksum());
GuestOSVO guestOS = guestOSDao.findOneByDisplayName(templateDetails.getGuestOs());
if (guestOS != null) {
templateVO.setGuestOSId(guestOS.getId());
}
boolean updated = vmTemplateDao.update(templateVO.getId(), templateVO); boolean updated = vmTemplateDao.update(templateVO.getId(), templateVO);
if (!updated) { if (!updated) {
String errMsg = String.format("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type %s", templateDetails.getHypervisorType()); 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( VMTemplateVO templateVO = vmTemplateDao.findLatestTemplateByTypeAndHypervisorAndArch(
templateDetails.getHypervisorType(), templateDetails.getArch(), Storage.TemplateType.SYSTEM); templateDetails.getHypervisorType(), templateDetails.getArch(), Storage.TemplateType.SYSTEM);
if (templateVO != null) { if (templateVO != null) {
updateTemplateUrlAndChecksum(templateVO, templateDetails); updateTemplateUrlChecksumAndGuestOsId(templateVO, templateDetails);
} }
} }
} }
@ -1029,6 +1059,7 @@ public class SystemVmTemplateRegistration {
public void updateSystemVmTemplates(final Connection conn) { public void updateSystemVmTemplates(final Connection conn) {
LOGGER.debug("Updating System Vm template IDs"); LOGGER.debug("Updating System Vm template IDs");
updateSystemVmTemplateGuestOsId();
Transaction.execute(new TransactionCallbackNoReturn() { Transaction.execute(new TransactionCallbackNoReturn() {
@Override @Override
public void doInTransactionWithoutResult(final TransactionStatus status) { public void doInTransactionWithoutResult(final TransactionStatus status) {
@ -1076,15 +1107,17 @@ public class SystemVmTemplateRegistration {
private final String checksum; private final String checksum;
private final CPU.CPUArch arch; private final CPU.CPUArch arch;
private String downloadedFilePath; private String downloadedFilePath;
private final String guestOs;
MetadataTemplateDetails(Hypervisor.HypervisorType hypervisorType, String name, String filename, String url, 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.hypervisorType = hypervisorType;
this.name = name; this.name = name;
this.filename = filename; this.filename = filename;
this.url = url; this.url = url;
this.checksum = checksum; this.checksum = checksum;
this.arch = arch; this.arch = arch;
this.guestOs = guestOs;
} }
public Hypervisor.HypervisorType getHypervisorType() { public Hypervisor.HypervisorType getHypervisorType() {
@ -1111,6 +1144,10 @@ public class SystemVmTemplateRegistration {
return arch; return arch;
} }
public String getGuestOs() {
return guestOs;
}
public String getDownloadedFilePath() { public String getDownloadedFilePath() {
return downloadedFilePath; return downloadedFilePath;
} }

View File

@ -192,7 +192,7 @@ public class SystemVmTemplateRegistrationTest {
public void testValidateTemplateFile_fileNotFound() { public void testValidateTemplateFile_fileNotFound() {
SystemVmTemplateRegistration.MetadataTemplateDetails details = SystemVmTemplateRegistration.MetadataTemplateDetails details =
new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, 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( SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey(
details.getHypervisorType(), details.getArch()), details); details.getHypervisorType(), details.getArch()), details);
doReturn(null).when(systemVmTemplateRegistration).getTemplateFile(details); doReturn(null).when(systemVmTemplateRegistration).getTemplateFile(details);
@ -209,7 +209,7 @@ public class SystemVmTemplateRegistrationTest {
public void testValidateTemplateFile_checksumMismatch() { public void testValidateTemplateFile_checksumMismatch() {
SystemVmTemplateRegistration.MetadataTemplateDetails details = SystemVmTemplateRegistration.MetadataTemplateDetails details =
new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, 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"); File dummyFile = new File("dummy.txt");
SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey( SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey(
details.getHypervisorType(), details.getArch()), details); details.getHypervisorType(), details.getArch()), details);
@ -228,7 +228,7 @@ public class SystemVmTemplateRegistrationTest {
public void testValidateTemplateFile_success() { public void testValidateTemplateFile_success() {
SystemVmTemplateRegistration.MetadataTemplateDetails details = SystemVmTemplateRegistration.MetadataTemplateDetails details =
new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, 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"); File dummyFile = new File("dummy.txt");
SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey( SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey(
details.getHypervisorType(), details.getArch()), details); details.getHypervisorType(), details.getArch()), details);
@ -285,7 +285,7 @@ public class SystemVmTemplateRegistrationTest {
SystemVmTemplateRegistration.MetadataTemplateDetails details = SystemVmTemplateRegistration.MetadataTemplateDetails details =
new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM,
"name", "nonexistent.qcow2", "http://example.com/file.qcow2", "name", "nonexistent.qcow2", "http://example.com/file.qcow2",
"", CPU.CPUArch.arm64); "", CPU.CPUArch.arm64, "guestos");
try (MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class); try (MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class);
MockedStatic<HttpUtils> httpMock = Mockito.mockStatic(HttpUtils.class)) { MockedStatic<HttpUtils> httpMock = Mockito.mockStatic(HttpUtils.class)) {
filesMock.when(() -> Files.isWritable(any(Path.class))).thenReturn(true); filesMock.when(() -> Files.isWritable(any(Path.class))).thenReturn(true);
@ -301,7 +301,7 @@ public class SystemVmTemplateRegistrationTest {
SystemVmTemplateRegistration.MetadataTemplateDetails details = SystemVmTemplateRegistration.MetadataTemplateDetails details =
new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM, new SystemVmTemplateRegistration.MetadataTemplateDetails(Hypervisor.HypervisorType.KVM,
"name", "file.qcow2", "http://example.com/file.qcow2", "name", "file.qcow2", "http://example.com/file.qcow2",
"", CPU.CPUArch.arm64); "", CPU.CPUArch.arm64, "guestos");
try (MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class); try (MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class);
MockedStatic<HttpUtils> httpMock = Mockito.mockStatic(HttpUtils.class)) { MockedStatic<HttpUtils> httpMock = Mockito.mockStatic(HttpUtils.class)) {
filesMock.when(() -> Files.isWritable(any(Path.class))).thenReturn(false); filesMock.when(() -> Files.isWritable(any(Path.class))).thenReturn(false);

View File

@ -42,6 +42,15 @@ function getGenericName() {
fi 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() { function getChecksum() {
local fileData="$1" local fileData="$1"
local hvName=$2 local hvName=$2
@ -60,13 +69,14 @@ function createMetadataFile() {
section="${template%%:*}" section="${template%%:*}"
sectionHv="${section%%-*}" sectionHv="${section%%-*}"
hvName=$(getGenericName $sectionHv) hvName=$(getGenericName $sectionHv)
guestos=$(getGuestOS $sectionHv)
downloadurl="${template#*:}" downloadurl="${template#*:}"
arch=$(echo ${downloadurl#*"/systemvmtemplate-$VERSION-"} | cut -d'-' -f 1) arch=$(echo ${downloadurl#*"/systemvmtemplate-$VERSION-"} | cut -d'-' -f 1)
templatename="systemvm-${sectionHv%.*}-${VERSION}-${arch}" templatename="systemvm-${sectionHv%.*}-${VERSION}-${arch}"
checksum=$(getChecksum "$fileData" "$VERSION-${arch}-$hvName") checksum=$(getChecksum "$fileData" "$VERSION-${arch}-$hvName")
filename=$(echo ${downloadurl##*'/'}) 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 done
} }