1616// under the License.
1717package com .cloud .upgrade ;
1818
19+ import com .cloud .dc .DataCenterVO ;
1920import com .cloud .dc .dao .ClusterDao ;
2021import com .cloud .dc .dao .ClusterDaoImpl ;
2122import com .cloud .dc .dao .DataCenterDao ;
2627import com .cloud .storage .Storage .ImageFormat ;
2728import com .cloud .storage .VMTemplateStorageResourceAssoc ;
2829import com .cloud .storage .VMTemplateVO ;
30+ import com .cloud .storage .VMTemplateZoneVO ;
2931import com .cloud .storage .dao .VMTemplateDao ;
3032import com .cloud .storage .dao .VMTemplateDaoImpl ;
33+ import com .cloud .storage .dao .VMTemplateZoneDao ;
34+ import com .cloud .storage .dao .VMTemplateZoneDaoImpl ;
3135import com .cloud .template .VirtualMachineTemplate ;
3236import com .cloud .upgrade .dao .BasicTemplateDataStoreDaoImpl ;
3337import com .cloud .user .Account ;
3438import com .cloud .utils .DateUtil ;
3539import com .cloud .utils .Pair ;
3640import com .cloud .utils .UriUtils ;
41+ import com .cloud .utils .db .GenericDaoBase ;
3742import com .cloud .utils .db .GlobalLock ;
3843import com .cloud .utils .db .Transaction ;
3944import com .cloud .utils .db .TransactionCallbackNoReturn ;
@@ -104,6 +109,8 @@ public class SystemVmTemplateRegistration {
104109 @ Inject
105110 VMTemplateDao vmTemplateDao ;
106111 @ Inject
112+ VMTemplateZoneDao vmTemplateZoneDao ;
113+ @ Inject
107114 TemplateDataStoreDao templateDataStoreDao ;
108115 @ Inject
109116 VMInstanceDao vmInstanceDao ;
@@ -117,6 +124,7 @@ public class SystemVmTemplateRegistration {
117124 public SystemVmTemplateRegistration () {
118125 dataCenterDao = new DataCenterDaoImpl ();
119126 vmTemplateDao = new VMTemplateDaoImpl ();
127+ vmTemplateZoneDao = new VMTemplateZoneDaoImpl ();
120128 templateDataStoreDao = new BasicTemplateDataStoreDaoImpl ();
121129 vmInstanceDao = new VMInstanceDaoImpl ();
122130 imageStoreDao = new ImageStoreDaoImpl ();
@@ -435,7 +443,7 @@ private List<String> fetchAllHypervisors(Long zoneId) {
435443 return hypervisorList ;
436444 }
437445
438- private Long createTemplateObjectInDB (SystemVMTemplateDetails details ) {
446+ private VMTemplateVO createTemplateObjectInDB (SystemVMTemplateDetails details ) {
439447 Long templateId = vmTemplateDao .getNextInSequence (Long .class , "id" );
440448 VMTemplateVO template = new VMTemplateVO ();
441449 template .setUuid (details .getUuid ());
@@ -458,10 +466,31 @@ private Long createTemplateObjectInDB(SystemVMTemplateDetails details) {
458466 template .setState (VirtualMachineTemplate .State .Inactive );
459467 template .setDeployAsIs (Hypervisor .HypervisorType .VMware .equals (details .getHypervisorType ()));
460468 template = vmTemplateDao .persist (template );
461- if (template == null ) {
462- return null ;
469+ return template ;
470+ }
471+
472+ private VMTemplateZoneVO createOrUpdateTemplateZoneEntry (long zoneId , long templateId ) {
473+ VMTemplateZoneVO templateZoneVO = vmTemplateZoneDao .findByZoneTemplate (zoneId , templateId );
474+ if (templateZoneVO == null ) {
475+ templateZoneVO = new VMTemplateZoneVO (zoneId , templateId , new java .util .Date ());
476+ templateZoneVO = vmTemplateZoneDao .persist (templateZoneVO );
477+ } else {
478+ templateZoneVO .setLastUpdated (new java .util .Date ());
479+ if (vmTemplateZoneDao .update (templateZoneVO .getId (), templateZoneVO )) {
480+ templateZoneVO = null ;
481+ }
482+ }
483+ return templateZoneVO ;
484+ }
485+
486+ private void createCrossZonesTemplateZoneRefEntries (VMTemplateVO template ) {
487+ List <DataCenterVO > dcs = dataCenterDao .listAll ();
488+ for (DataCenterVO dc : dcs ) {
489+ VMTemplateZoneVO templateZoneVO = createOrUpdateTemplateZoneEntry (dc .getId (), template .getId ());
490+ if (templateZoneVO == null ) {
491+ throw new CloudRuntimeException (String .format ("Failed to create template_zone_ref record for the systemVM template for hypervisor: %s and zone: %s" , template .getHypervisorType ().name (), dc ));
492+ }
463493 }
464- return template .getId ();
465494 }
466495
467496 private void createTemplateStoreRefEntry (SystemVMTemplateDetails details ) {
@@ -585,10 +614,12 @@ private Long performTemplateRegistrationOperations(Pair<Hypervisor.HypervisorTyp
585614 SystemVMTemplateDetails details = new SystemVMTemplateDetails (templateName , hypervisorAndTemplateName .second (), created ,
586615 url , checksum , format , (int ) guestOsId , hypervisor , storeId );
587616 if (templateId == null ) {
588- templateId = createTemplateObjectInDB (details );
589- }
590- if (templateId == null ) {
591- throw new CloudRuntimeException (String .format ("Failed to register template for hypervisor: %s" , hypervisor .name ()));
617+ VMTemplateVO template = createTemplateObjectInDB (details );
618+ if (template == null ) {
619+ throw new CloudRuntimeException (String .format ("Failed to register template for hypervisor: %s" , hypervisor .name ()));
620+ }
621+ templateId = template .getId ();
622+ createCrossZonesTemplateZoneRefEntries (template );
592623 }
593624 details .setId (templateId );
594625 String destTempFolderName = String .valueOf (templateId );
0 commit comments