@@ -417,8 +417,15 @@ protected static MetadataTemplateDetails getMetadataTemplateDetails(Hypervisor.H
417417 return NewTemplateMap .get (getHypervisorArchKey (hypervisorType , arch ));
418418 }
419419
420- public VMTemplateVO getRegisteredTemplate (String templateName , CPU .CPUArch arch ) {
421- return vmTemplateDao .findLatestTemplateByName (templateName , arch );
420+ public VMTemplateVO getRegisteredTemplate (String templateName , Hypervisor .HypervisorType hypervisorType ,
421+ CPU .CPUArch arch , String url ) {
422+ VMTemplateVO registeredTemplate = vmTemplateDao .findLatestTemplateByName (templateName , hypervisorType , arch );
423+ if (registeredTemplate == null && StringUtils .isNotBlank (url )) {
424+ String urlPath = url .substring (url .lastIndexOf ("/" ) + 1 );
425+ registeredTemplate = vmTemplateDao .findActiveSystemTemplateByHypervisorArchAndUrlPath (hypervisorType , arch ,
426+ urlPath );
427+ }
428+ return registeredTemplate ;
422429 }
423430
424431 private static boolean isRunningInTest () {
@@ -940,7 +947,8 @@ protected void registerTemplatesForZone(long zoneId, String filePath) {
940947 if (templateDetails == null ) {
941948 continue ;
942949 }
943- VMTemplateVO templateVO = getRegisteredTemplate (templateDetails .getName (), templateDetails .getArch ());
950+ VMTemplateVO templateVO = getRegisteredTemplate (templateDetails .getName (),
951+ templateDetails .getHypervisorType (), templateDetails .getArch (), templateDetails .getUrl ());
944952 if (templateVO != null ) {
945953 TemplateDataStoreVO templateDataStoreVO =
946954 templateDataStoreDao .findByStoreTemplate (storeUrlAndId .second (), templateVO .getId ());
@@ -999,7 +1007,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
9991007 }
10001008 }
10011009
1002- private void updateRegisteredTemplateDetails (Long templateId , MetadataTemplateDetails templateDetails ) {
1010+ protected void updateRegisteredTemplateDetails (Long templateId , MetadataTemplateDetails templateDetails ) {
10031011 VMTemplateVO templateVO = vmTemplateDao .findById (templateId );
10041012 templateVO .setTemplateType (Storage .TemplateType .SYSTEM );
10051013 GuestOSVO guestOS = guestOSDao .findOneByDisplayName (templateDetails .getGuestOs ());
@@ -1039,37 +1047,36 @@ private void updateTemplateUrlChecksumAndGuestOsId(VMTemplateVO templateVO, Meta
10391047 protected boolean registerOrUpdateSystemVmTemplate (MetadataTemplateDetails templateDetails ,
10401048 List <Pair <Hypervisor .HypervisorType , CPU .CPUArch >> hypervisorsInUse ) {
10411049 LOGGER .debug ("Updating System VM template for {}" , templateDetails .getHypervisorArchLog ());
1042- VMTemplateVO registeredTemplate = getRegisteredTemplate (templateDetails .getName (), templateDetails . getArch ());
1043- // change template type to SYSTEM
1050+ VMTemplateVO registeredTemplate = getRegisteredTemplate (templateDetails .getName (),
1051+ templateDetails . getHypervisorType (), templateDetails . getArch (), templateDetails . getUrl ());
10441052 if (registeredTemplate != null ) {
10451053 updateRegisteredTemplateDetails (registeredTemplate .getId (), templateDetails );
1046- } else {
1047- boolean isHypervisorArchMatchMetadata = hypervisorsInUse .stream ()
1048- .anyMatch (p -> p .first ().equals (templateDetails .getHypervisorType ())
1049- && Objects .equals (p .second (), templateDetails .getArch ()));
1050- if (isHypervisorArchMatchMetadata ) {
1051- try {
1052- registerTemplates (hypervisorsInUse );
1053- return true ;
1054- } catch (final Exception e ) {
1055- throw new CloudRuntimeException (String .format ("Failed to register %s templates for hypervisors: [%s]. " +
1056- "Cannot upgrade system VMs" ,
1057- getSystemVmTemplateVersion (),
1058- StringUtils .join (hypervisorsInUse .stream ()
1059- .map (x -> getHypervisorArchKey (x .first (), x .second ()))
1060- .collect (Collectors .toList ()), "," )), e );
1061- }
1062- } else {
1063- LOGGER .warn ("Cannot upgrade {} system VM template for {} as it is not used, not failing upgrade" ,
1064- getSystemVmTemplateVersion (), templateDetails .getHypervisorArchLog ());
1065- VMTemplateVO templateVO = vmTemplateDao .findLatestTemplateByTypeAndHypervisorAndArch (
1066- templateDetails .getHypervisorType (), templateDetails .getArch (), Storage .TemplateType .SYSTEM );
1067- if (templateVO != null ) {
1068- updateTemplateUrlChecksumAndGuestOsId (templateVO , templateDetails );
1069- }
1054+ return false ;
1055+ }
1056+ boolean isHypervisorArchMatchMetadata = hypervisorsInUse .stream ()
1057+ .anyMatch (p -> p .first ().equals (templateDetails .getHypervisorType ())
1058+ && Objects .equals (p .second (), templateDetails .getArch ()));
1059+ if (!isHypervisorArchMatchMetadata ) {
1060+ LOGGER .warn ("Skipping upgrading {} system VM template for {} as it is not used, not failing upgrade" ,
1061+ getSystemVmTemplateVersion (), templateDetails .getHypervisorArchLog ());
1062+ VMTemplateVO templateVO = vmTemplateDao .findLatestTemplateByTypeAndHypervisorAndArch (
1063+ templateDetails .getHypervisorType (), templateDetails .getArch (), Storage .TemplateType .SYSTEM );
1064+ if (templateVO != null ) {
1065+ updateTemplateUrlChecksumAndGuestOsId (templateVO , templateDetails );
10701066 }
1067+ return false ;
1068+ }
1069+ try {
1070+ registerTemplates (hypervisorsInUse );
1071+ return true ;
1072+ } catch (final Exception e ) {
1073+ throw new CloudRuntimeException (String .format ("Failed to register %s templates for hypervisors: [%s]. " +
1074+ "Cannot upgrade system VMs" ,
1075+ getSystemVmTemplateVersion (),
1076+ StringUtils .join (hypervisorsInUse .stream ()
1077+ .map (x -> getHypervisorArchKey (x .first (), x .second ()))
1078+ .collect (Collectors .toList ()), "," )), e );
10711079 }
1072- return false ;
10731080 }
10741081
10751082 public void updateSystemVmTemplates (final Connection conn ) {
0 commit comments