You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/12/26 20:13:01 UTC

git commit: updated refs/heads/4.3 to 35ba14d

Updated Branches:
  refs/heads/4.3 7e54ca883 -> 35ba14d88


CLOUDSTACK-5648:CopyTemplate and CopyISO across zones fails after NFS
migration to S3.

Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/35ba14d8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/35ba14d8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/35ba14d8

Branch: refs/heads/4.3
Commit: 35ba14d88da5ce1c2efc09ee9345a913e5bb515f
Parents: 7e54ca8
Author: Min Chen <mi...@citrix.com>
Authored: Thu Dec 26 11:12:00 2013 -0800
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Dec 26 11:12:00 2013 -0800

----------------------------------------------------------------------
 .../command/user/template/CopyTemplateCmd.java  | 11 ++--
 .../src/com/cloud/template/TemplateManager.java |  2 +
 .../datastore/db/TemplateDataStoreDao.java      |  2 +
 .../image/db/TemplateDataStoreDaoImpl.java      |  9 +++-
 .../com/cloud/template/TemplateManagerImpl.java | 57 +++++++++++++-------
 5 files changed, 56 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/35ba14d8/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
index a25bd65..10c6264 100644
--- a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
@@ -18,6 +18,8 @@ package org.apache.cloudstack.api.command.user.template;
 
 import java.util.List;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandJobType;
 import org.apache.cloudstack.api.ApiConstants;
@@ -26,12 +28,9 @@ import org.apache.cloudstack.api.BaseAsyncCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.TemplateResponse;
-import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.context.CallContext;
 
-import org.apache.log4j.Logger;
-
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.StorageUnavailableException;
@@ -56,7 +55,7 @@ public class CopyTemplateCmd extends BaseAsyncCmd {
     private Long id;
 
     @Parameter(name=ApiConstants.SOURCE_ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class,
-            required=true, description="ID of the zone the template is currently hosted on.")
+            description = "ID of the zone the template is currently hosted on. If not specified and template is cross-zone, then we will sync this template to region wide image store")
     private Long sourceZoneId;
 
 
@@ -110,10 +109,12 @@ public class CopyTemplateCmd extends BaseAsyncCmd {
         return  "copying template: " + getId() + " from zone: " + getSourceZoneId() + " to zone: " + getDestinationZoneId();
     }
 
+    @Override
     public ApiCommandJobType getInstanceType() {
         return ApiCommandJobType.Template;
     }
 
+    @Override
     public Long getInstanceId() {
         return getId();
     }
@@ -132,7 +133,7 @@ public class CopyTemplateCmd extends BaseAsyncCmd {
                 }
 
                 response.setResponseName(getCommandName());
-                this.setResponseObject(response);
+                setResponseObject(response);
             } else {
                 throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to copy template");
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/35ba14d8/engine/components-api/src/com/cloud/template/TemplateManager.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/template/TemplateManager.java b/engine/components-api/src/com/cloud/template/TemplateManager.java
index 1372a14..3adce4f 100755
--- a/engine/components-api/src/com/cloud/template/TemplateManager.java
+++ b/engine/components-api/src/com/cloud/template/TemplateManager.java
@@ -103,6 +103,8 @@ public interface TemplateManager {
 
     DataStore getImageStore(long zoneId, long tmpltId);
 
+    DataStore getImageStore(long tmpltId);
+
     Long getTemplateSize(long templateId, long zoneId);
 
     DataStore getImageStore(String storeUuid, Long zoneId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/35ba14d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index 7a9a15a..39347c5 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -62,6 +62,8 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
 
     TemplateDataStoreVO findByTemplate(long templateId, DataStoreRole role);
 
+    TemplateDataStoreVO findReadyByTemplate(long templateId, DataStoreRole role);
+
     TemplateDataStoreVO findByTemplateZone(long templateId, Long zoneId, DataStoreRole role);
 
     List<TemplateDataStoreVO> listByTemplate(long templateId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/35ba14d8/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 69a52c0..5104fb2 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -343,16 +343,21 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
     }
 
     @Override
-    public TemplateDataStoreVO findReadyOnCache(long templateId) {
+    public TemplateDataStoreVO findReadyByTemplate(long templateId, DataStoreRole role) {
         SearchCriteria<TemplateDataStoreVO> sc = templateRoleSearch.create();
         sc.setParameters("template_id", templateId);
-        sc.setParameters("store_role", DataStoreRole.ImageCache);
+        sc.setParameters("store_role", role);
         sc.setParameters("destroyed", false);
         sc.setParameters("state", ObjectInDataStoreStateMachine.State.Ready);
         return findOneIncludingRemovedBy(sc);
     }
 
     @Override
+    public TemplateDataStoreVO findReadyOnCache(long templateId) {
+        return findReadyByTemplate(templateId, DataStoreRole.ImageCache);
+    }
+
+    @Override
     public List<TemplateDataStoreVO> listOnCache(long templateId) {
         SearchCriteria<TemplateDataStoreVO> sc = templateRoleSearch.create();
         sc.setParameters("template_id", templateId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/35ba14d8/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index de30948..8dc8196 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -694,38 +694,47 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
         Account caller = CallContext.current().getCallingAccount();
 
         // Verify parameters
-        if (sourceZoneId.equals(destZoneId)) {
-            throw new InvalidParameterValueException("Please specify different source and destination zones.");
-        }
-
-        DataCenterVO sourceZone = _dcDao.findById(sourceZoneId);
-        if (sourceZone == null) {
-            throw new InvalidParameterValueException("Please specify a valid source zone.");
-        }
-
-        DataCenterVO dstZone = _dcDao.findById(destZoneId);
-        if (dstZone == null) {
-            throw new InvalidParameterValueException("Please specify a valid destination zone.");
-        }
-
         VMTemplateVO template = _tmpltDao.findById(templateId);
         if (template == null || template.getRemoved() != null) {
             throw new InvalidParameterValueException("Unable to find template with id");
         }
 
-        DataStore srcSecStore = getImageStore(sourceZoneId, templateId);
+        DataStore srcSecStore = null;
+        if (sourceZoneId != null) {
+            // template is on zone-wide secondary storage
+            srcSecStore = getImageStore(sourceZoneId, templateId);
+        } else {
+            // template is on region store
+            srcSecStore = getImageStore(templateId);
+        }
+
         if (srcSecStore == null) {
-            throw new InvalidParameterValueException("There is no template " + templateId + " in zone " + sourceZoneId);
+            throw new InvalidParameterValueException("There is no template " + templateId + " ready on image store.");
         }
 
-        if (template.isCrossZones()){
-            //TODO: we may need UI still enable CopyTemplate in case of cross zone template to trigger sync to region store.
+        if (template.isCrossZones()) {
             // sync template from cache store to region store if it is not there, for cases where we are going to migrate existing NFS to S3.
             _tmpltSvr.syncTemplateToRegionStore(templateId, srcSecStore);
             s_logger.debug("Template " + templateId + " is cross-zone, don't need to copy");
             return template;
         }
 
+        if (sourceZoneId != null) {
+            if (sourceZoneId.equals(destZoneId)) {
+                throw new InvalidParameterValueException("Please specify different source and destination zones.");
+            }
+
+            DataCenterVO sourceZone = _dcDao.findById(sourceZoneId);
+            if (sourceZone == null) {
+                throw new InvalidParameterValueException("Please specify a valid source zone.");
+            }
+        }
+
+        DataCenterVO dstZone = _dcDao.findById(destZoneId);
+        if (dstZone == null) {
+            throw new InvalidParameterValueException("Please specify a valid destination zone.");
+        }
+
         DataStore dstSecStore = getImageStore(destZoneId, templateId);
         if (dstSecStore != null) {
             s_logger.debug("There is template " + templateId + " in secondary storage " + dstSecStore.getName() + " in zone " + destZoneId
@@ -1706,6 +1715,18 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
         return null;
     }
 
+    // get the region wide image store where a template is READY on,
+    // just pick one is enough.
+    @Override
+    public DataStore getImageStore(long tmpltId) {
+        TemplateDataStoreVO tmpltStore = _tmplStoreDao.findReadyByTemplate(tmpltId, DataStoreRole.Image);
+        if (tmpltStore != null) {
+            return _dataStoreMgr.getDataStore(tmpltStore.getDataStoreId(), DataStoreRole.Image);
+        }
+
+        return null;
+    }
+
     @Override
     public Long getTemplateSize(long templateId, long zoneId) {
         TemplateDataStoreVO templateStoreRef = _tmplStoreDao.findByTemplateZoneDownloadStatus(templateId, zoneId,