@@ -615,13 +615,11 @@ protected void tryDownloadingTemplateToImageStore(VMTemplateVO tmplt, DataStore
615615 }
616616
617617 protected boolean tryCopyingTemplateToImageStore (VMTemplateVO tmplt , DataStore destStore ) {
618- Long destZoneId = destStore .getScope ().getScopeId ();
619-
620- List <DataStore > storesInSameZone = _storeMgr .getImageStoresByZoneIds (destZoneId );
621- if (searchAndCopyWithinZone (tmplt , destStore , storesInSameZone )) {
618+ if (searchAndCopyWithinZone (tmplt , destStore )) {
622619 return true ;
623620 }
624621
622+ Long destZoneId = destStore .getScope ().getScopeId ();
625623 logger .debug ("Template [{}] not found in any image store of zone [{}]. Checking other zones." ,
626624 tmplt .getUniqueName (), destZoneId );
627625
@@ -643,45 +641,54 @@ private boolean searchAndCopyAcrossZones(VMTemplateVO tmplt, DataStore destStore
643641 continue ;
644642 }
645643
646- DataStore sourceStore = findImageStorageHavingTemplate (tmplt , storesInOtherZone );
647- if (sourceStore == null ) {
648- logger .debug ("Template [{}] not found in any image store of zone [{}]." ,
644+ TemplateObject sourceTmpl = findUsableTemplate (tmplt , storesInOtherZone );
645+ if (sourceTmpl == null ) {
646+ logger .debug ("Template [{}] not found with a valid install path in any image store of zone [{}]." ,
649647 tmplt .getUniqueName (), otherZoneId );
650648 continue ;
651649 }
652650
653- TemplateObject sourceTmpl = (TemplateObject ) _templateFactory .getTemplate (tmplt .getId (), sourceStore );
654- if (sourceTmpl .getInstallPath () == null ) {
655- logger .warn ("Cannot copy template [{}] from image store [{}]; install path is null." ,
656- tmplt .getUniqueName (), sourceStore .getName ());
657- continue ;
658- }
659-
660651 logger .info ("Template [{}] found in zone [{}]. Initiating cross-zone copy to zone [{}]." ,
661652 tmplt .getUniqueName (), otherZoneId , destZoneId );
662653
663- return copyTemplateAcrossZones (sourceStore , destStore , tmplt );
654+ return copyTemplateAcrossZones (destStore , sourceTmpl );
664655 }
665656
666- logger .debug ("Template [{}] was not found in any zone. Cannot perform zone-to-zone copy." ,
667- tmplt .getUniqueName ());
657+ logger .debug ("Template [{}] was not found in any zone. Cannot perform zone-to-zone copy." , tmplt .getUniqueName ());
668658 return false ;
669659 }
670660
671- private boolean searchAndCopyWithinZone (VMTemplateVO tmplt , DataStore destStore , List <DataStore > stores ) {
672- for (DataStore sourceStore : stores ) {
661+ protected TemplateObject findUsableTemplate (VMTemplateVO tmplt , List <DataStore > imageStores ) {
662+ for (DataStore store : imageStores ) {
663+ TemplateObject tmpl = (TemplateObject ) _templateFactory .getTemplate (tmplt .getId (), store );
664+ if (tmpl == null ) {
665+ continue ;
666+ }
667+
668+ if (tmpl .getInstallPath () == null ) {
669+ logger .debug ("Template [{}] found in image store [{}] but install path is null. Skipping." ,
670+ tmplt .getUniqueName (), store .getName ());
671+ continue ;
672+ }
673+ return tmpl ;
674+ }
675+ return null ;
676+ }
677+
678+ private boolean searchAndCopyWithinZone (VMTemplateVO tmplt , DataStore destStore ) {
679+ Long destZoneId = destStore .getScope ().getScopeId ();
680+ List <DataStore > storesInSameZone = _storeMgr .getImageStoresByZoneIds (destZoneId );
681+ for (DataStore sourceStore : storesInSameZone ) {
673682 Map <String , TemplateProp > existingTemplatesInSourceStore = listTemplate (sourceStore );
674683 if (existingTemplatesInSourceStore == null ||
675684 !existingTemplatesInSourceStore .containsKey (tmplt .getUniqueName ())) {
676- logger .debug ("Template [{}] does not exist on image store [{}]; searching another." ,
677- tmplt .getUniqueName (), sourceStore .getName ());
685+ logger .debug ("Template [{}] does not exist on image store [{}]; searching another." , tmplt .getUniqueName (), sourceStore .getName ());
678686 continue ;
679687 }
680688
681689 TemplateObject sourceTmpl = (TemplateObject ) _templateFactory .getTemplate (tmplt .getId (), sourceStore );
682690 if (sourceTmpl .getInstallPath () == null ) {
683- logger .warn ("Cannot copy template [{}] from image store [{}]; install path is null." ,
684- tmplt .getUniqueName (), sourceStore .getName ());
691+ logger .warn ("Cannot copy template [{}] from image store [{}]; install path is null." , tmplt .getUniqueName (), sourceStore .getName ());
685692 continue ;
686693 }
687694
@@ -691,36 +698,22 @@ private boolean searchAndCopyWithinZone(VMTemplateVO tmplt, DataStore destStore,
691698 return false ;
692699 }
693700
694- private DataStore findImageStorageHavingTemplate (VMTemplateVO tmplt , List <DataStore > stores ) {
695- for (DataStore store : stores ) {
696- Map <String , TemplateProp > templates = listTemplate (store );
697- if (templates != null && templates .containsKey (tmplt .getUniqueName ())) {
698- return store ;
699- }
700- }
701- return null ;
702- }
703-
704- private boolean copyTemplateAcrossZones (DataStore sourceStore ,
705- DataStore destStore ,
706- VMTemplateVO tmplt ) {
701+ private boolean copyTemplateAcrossZones (DataStore destStore , TemplateObject sourceTmpl ) {
707702 Long dstZoneId = destStore .getScope ().getScopeId ();
708703 DataCenterVO dstZone = _dcDao .findById (dstZoneId );
709704
710705 if (dstZone == null ) {
711- logger .warn ("Destination zone [{}] not found for template [{}]." ,
712- dstZoneId , tmplt .getUniqueName ());
706+ logger .warn ("Destination zone [{}] not found for template [{}]." , dstZoneId , sourceTmpl .getUniqueName ());
713707 return false ;
714708 }
715709
716- TemplateObject sourceTmpl = (TemplateObject ) _templateFactory .getTemplate (tmplt .getId (), sourceStore );
717710 try {
718- storageOrchestrator .orchestrateTemplateCopyAcrossZones (sourceTmpl , sourceStore , destStore );
711+ storageOrchestrator .orchestrateTemplateCopyAcrossZones (sourceTmpl , destStore );
719712 return true ;
720713 } catch (Exception e ) {
721714 logger .error ("Failed to copy template [{}] from zone [{}] to zone [{}]." ,
722- tmplt .getUniqueName (),
723- sourceStore .getScope ().getScopeId (),
715+ sourceTmpl .getUniqueName (),
716+ sourceTmpl . getDataStore () .getScope ().getScopeId (),
724717 dstZoneId ,
725718 e );
726719 return false ;
0 commit comments