From 9f03150a4ff4269ef992b8271c2e30eb23802e8f Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 9 Jan 2014 16:12:16 -0800 Subject: [PATCH] CLOUDSTACK-5653:S3 object store as Secondary Storage, the template created from different zone is not available for the other zones. --- .../subsystem/api/storage/DataStoreManager.java | 2 ++ .../subsystem/api/storage/TemplateService.java | 2 ++ .../storage/image/TemplateServiceImpl.java | 3 ++- .../storage/datastore/DataStoreManagerImpl.java | 9 +++++++++ .../src/com/cloud/template/TemplateManagerImpl.java | 12 +++++++++--- 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java index 08844536264..febce4004b4 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java @@ -37,4 +37,6 @@ public interface DataStoreManager { DataStore getImageCacheStore(long zoneId); List listImageStores(); + + boolean isRegionStore(DataStore store); } diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java index 4950597963d..72c33749c55 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java @@ -62,5 +62,7 @@ public interface TemplateService { void addSystemVMTemplatesToSecondary(DataStore store); + void associateTemplateToZone(long templateId, Long zoneId); + void associateCrosszoneTemplatesToZone(long dcId); } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index 0113bc0cfcd..07cd59ff953 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -465,7 +465,8 @@ public class TemplateServiceImpl implements TemplateService { // persist entry in template_zone_ref table. zoneId can be empty for // region-wide image store, in that case, // we will associate the template to all the zones. - private void associateTemplateToZone(long templateId, Long zoneId) { + @Override + public void associateTemplateToZone(long templateId, Long zoneId) { List dcs = new ArrayList(); if (zoneId != null) { dcs.add(zoneId); diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java index 00d08d719d3..4bb8e5488c8 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.storage.datastore; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.ScopeType; import com.cloud.utils.exception.CloudRuntimeException; import edu.emory.mathcs.backport.java.util.Collections; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; @@ -79,6 +80,14 @@ public class DataStoreManagerImpl implements DataStoreManager { return stores.get(0); } + @Override + public boolean isRegionStore(DataStore store) { + if (store.getScope().getScopeType() == ScopeType.ZONE && store.getScope().getScopeId() == null) + return true; + else + return false; + } + @Override public DataStore getPrimaryDataStore(long storeId) { return primaryStoreMgr.getPrimaryDataStore(storeId); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 3a058825a3c..396ae6180de 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -1400,9 +1400,15 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, throw new CloudRuntimeException("Failed to create template" + result.getResult()); } - VMTemplateZoneVO templateZone = new VMTemplateZoneVO(zoneId, templateId, new Date()); - this._tmpltZoneDao.persist(templateZone); - + // create entries in template_zone_ref table + if (_dataStoreMgr.isRegionStore(store)) { + // template created on region store + _tmpltSvr.associateTemplateToZone(templateId, null); + } else { + VMTemplateZoneVO templateZone = new VMTemplateZoneVO(zoneId, templateId, new Date()); + _tmpltZoneDao.persist(templateZone); + } + privateTemplate = this._tmpltDao.findById(templateId); if (snapshotId != null) { //getting the prent volume