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/04/23 00:34:04 UTC

git commit: updated refs/heads/object_store to 5f90aa9

Updated Branches:
  refs/heads/object_store 9c584b550 -> 5f90aa971


Implement createTemplateCmd and consolidate several copy calls in
TemplateServiceImpl.

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

Branch: refs/heads/object_store
Commit: 5f90aa971a523ac8dc52879bd68a305caa3f29b5
Parents: 9c584b5
Author: Min Chen <mi...@citrix.com>
Authored: Mon Apr 22 15:33:43 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Apr 22 15:33:43 2013 -0700

----------------------------------------------------------------------
 .../storage/image/TemplateServiceImpl.java         |  185 +++------------
 .../datastore/ObjectInDataStoreManager.java        |    4 +-
 .../datastore/ObjectInDataStoreManagerImpl.java    |   52 ++++
 3 files changed, 86 insertions(+), 155 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5f90aa97/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
----------------------------------------------------------------------
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 2e0da4d..708bda7 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
@@ -58,7 +58,6 @@ import org.apache.cloudstack.storage.image.store.TemplateObject;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.storage.ListTemplateAnswer;
 import com.cloud.agent.api.storage.ListTemplateCommand;
@@ -69,7 +68,6 @@ import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.StoragePool;
-import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.VMTemplateZoneVO;
@@ -78,7 +76,6 @@ import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VMTemplateZoneDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.download.DownloadMonitor;
-import com.cloud.storage.secondary.SecondaryStorageVmManager;
 import com.cloud.storage.template.TemplateProp;
 import com.cloud.user.AccountManager;
 import com.cloud.user.ResourceLimitService;
@@ -113,10 +110,6 @@ public class TemplateServiceImpl implements TemplateService {
     @Inject
     DownloadMonitor _dlMonitor;
     @Inject
-    AgentManager _agentMgr;
-    @Inject
-    SecondaryStorageVmManager _ssvmMgr;
-    @Inject
     DataCenterDao _dcDao = null;
     @Inject
     VMTemplateZoneDao _vmTemplateZoneDao;
@@ -145,6 +138,12 @@ public class TemplateServiceImpl implements TemplateService {
         public TemplateObject getTemplate() {
             return template;
         }
+
+        public AsyncCallFuture<TemplateApiResult> getFuture() {
+            return future;
+        }
+
+
     }
 
     @Override
@@ -491,56 +490,43 @@ public class TemplateServiceImpl implements TemplateService {
         return null;
     }
 
+    private AsyncCallFuture<TemplateApiResult> copyAsync(DataObject source, TemplateInfo template, DataStore store){
+        AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
+        DataObject templateOnStore = store.create(template);
+        templateOnStore.processEvent(Event.CreateOnlyRequested);
+
+        TemplateOpContext<TemplateApiResult> context = new TemplateOpContext<TemplateApiResult>(null, (TemplateObject) templateOnStore, future);
+        AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+        caller.setCallback(caller.getTarget().copyTemplateCallBack(null, null)).setContext(context);
+        this._motionSrv.copyAsync(source, templateOnStore, caller);
+        return future;
+    }
+
     @Override
     public AsyncCallFuture<TemplateApiResult> createTemplateFromSnapshotAsync(
             SnapshotInfo snapshot, TemplateInfo template, DataStore store) {
-        // TODO Auto-generated method stub
-        return null;
+        return this.copyAsync(snapshot, template, store);
     }
 
     @Override
     public AsyncCallFuture<TemplateApiResult> createTemplateFromVolumeAsync(
             VolumeInfo volume, TemplateInfo template, DataStore store) {
-        // TODO Auto-generated method stub
-        return null;
+        return this.copyAsync(volume, template, store);
     }
 
     @Override
-    public AsyncCallFuture<TemplateApiResult> copyTemplate(TemplateInfo srcTemplate,
-            DataStore destStore) {
-        AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
-        TemplateApiResult res = new TemplateApiResult(srcTemplate);
-        try{
-        // create one entry in template_store_ref
-            TemplateDataStoreVO destTmpltStore = _vmTemplateStoreDao.findByStoreTemplate(destStore.getId(), srcTemplate.getId());
-            if (destTmpltStore == null) {
-                destTmpltStore = new TemplateDataStoreVO(destStore.getId(), srcTemplate.getId());
-                destTmpltStore.setCopy(true);
-                _vmTemplateStoreDao.persist(destTmpltStore);
-            }
-            TemplateInfo destTemplate = this._templateFactory.getTemplate(destTmpltStore.getTemplateId(), destStore);
-            destTemplate.processEvent(Event.CreateOnlyRequested);
-            srcTemplate.processEvent(Event.CopyingRequested);
-
-            CopyTemplateContext<TemplateApiResult> context = new CopyTemplateContext<TemplateApiResult>(null, future, srcTemplate,
-                    destTemplate,
-                    destStore);
-            AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
-            caller.setCallback(caller.getTarget().copyTemplateCallBack(null, null))
-            .setContext(context);
-            this._motionSrv.copyAsync(srcTemplate, destTemplate, caller);
-        } catch (Exception e) {
-            s_logger.debug("Failed to copy template", e);
-            res.setResult(e.toString());
-            future.complete(res);
-        }
-        return future;
+    public AsyncCallFuture<TemplateApiResult> copyTemplate(TemplateInfo srcTemplate, DataStore destStore) {
+        return this.copyAsync(srcTemplate, srcTemplate, destStore);
+    }
+
+    @Override
+    public AsyncCallFuture<TemplateApiResult> prepareTemplateOnPrimary(TemplateInfo srcTemplate, StoragePool pool) {
+        return this.copyAsync(srcTemplate, srcTemplate, (DataStore)pool);
     }
 
     protected Void copyTemplateCallBack(AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> callback,
-            CopyTemplateContext<TemplateApiResult> context) {
-        TemplateInfo srcTemplate = context.getSrcTemplate();
-        TemplateInfo destTemplate = context.getDestTemplate();
+            TemplateOpContext<TemplateApiResult> context) {
+        TemplateInfo destTemplate = context.getTemplate();
         CopyCommandResult result = callback.getResult();
         AsyncCallFuture<TemplateApiResult> future = context.getFuture();
         TemplateApiResult res = new TemplateApiResult(destTemplate);
@@ -548,17 +534,12 @@ public class TemplateServiceImpl implements TemplateService {
             if (result.isFailed()) {
                 res.setResult(result.getResult());
                 destTemplate.processEvent(Event.OperationFailed);
-                srcTemplate.processEvent(Event.OperationFailed);
                 // remove entry from template_store_ref
-                TemplateDataStoreVO destTmpltStore = _vmTemplateStoreDao.findByStoreTemplate(context.getDestStore().getId(), destTemplate.getId());
-                _vmTemplateStoreDao.remove(destTmpltStore.getId());
-                future.complete(res);
-                return null;
+                destTemplate.getDataStore().delete(destTemplate);
+            } else {
+                destTemplate.processEvent(Event.OperationSuccessed);
             }
-            srcTemplate.processEvent(Event.OperationSuccessed);
-            destTemplate.processEvent(Event.OperationSuccessed);
             future.complete(res);
-            return null;
         } catch (Exception e) {
             s_logger.debug("Failed to process copy template callback", e);
             res.setResult(e.toString());
@@ -568,106 +549,4 @@ public class TemplateServiceImpl implements TemplateService {
         return null;
     }
 
-    protected Void prepareTemplateCallBack(AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> callback,
-            CopyTemplateContext<TemplateApiResult> context) {
-        TemplateInfo srcTemplate = context.getSrcTemplate();
-        TemplateInfo destTemplate = context.getDestTemplate();
-        CopyCommandResult result = callback.getResult();
-        AsyncCallFuture<TemplateApiResult> future = context.getFuture();
-        TemplateApiResult res = new TemplateApiResult(destTemplate);
-        try {
-            if (result.isFailed()) {
-                res.setResult(result.getResult());
-                destTemplate.processEvent(Event.OperationFailed);
-                srcTemplate.processEvent(Event.OperationFailed);
-                // remove entry from template_spool_ref
-                VMTemplateStoragePoolVO destTmpltPool =  _tmpltPoolDao.findByPoolTemplate(context.getDestStore().getId(), destTemplate.getId());
-                _vmTemplateStoreDao.remove(destTmpltPool.getId());
-                future.complete(res);
-                return null;
-            }
-            srcTemplate.processEvent(Event.OperationSuccessed);
-            // update other information in template_spool_ref through templateObject event processing.
-            destTemplate.processEvent(Event.OperationSuccessed);
-            future.complete(res);
-            return null;
-        } catch (Exception e) {
-            s_logger.debug("Failed to process prepare template callback", e);
-            res.setResult(e.toString());
-            future.complete(res);
-        }
-
-        return null;
-    }
-
-    @Override
-    public AsyncCallFuture<TemplateApiResult> prepareTemplateOnPrimary(TemplateInfo srcTemplate, StoragePool pool) {
-        AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
-        TemplateApiResult res = new TemplateApiResult(srcTemplate);
-        long poolId = pool.getId();
-        long templateId = srcTemplate.getId();
-        try{
-            // create one entry in template_spool_ref
-            VMTemplateStoragePoolVO templateStoragePoolRef = _tmpltPoolDao.findByPoolTemplate(poolId, templateId);
-            if (templateStoragePoolRef == null) {
-                templateStoragePoolRef = new VMTemplateStoragePoolVO(poolId, templateId);
-                templateStoragePoolRef = _tmpltPoolDao.persist(templateStoragePoolRef);
-            }
-            DataStore destStore = (DataStore)pool;
-            TemplateInfo destTemplate = this._templateFactory.getTemplate(templateStoragePoolRef.getTemplateId(), destStore);
-            destTemplate.processEvent(Event.CreateOnlyRequested);
-            srcTemplate.processEvent(Event.CopyingRequested);
-
-            CopyTemplateContext<TemplateApiResult> context = new CopyTemplateContext<TemplateApiResult>(null, future, srcTemplate,
-                    destTemplate,
-                    destStore
-                    );
-            AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
-            caller.setCallback(caller.getTarget().prepareTemplateCallBack(null, null))
-            .setContext(context);
-            this._motionSrv.copyAsync(srcTemplate, destTemplate, caller);
-        } catch (Exception e) {
-            s_logger.debug("Failed to prepare template on storage pool", e);
-            res.setResult(e.toString());
-            future.complete(res);
-        }
-        return future;
-    }
-
-
-
-    class CopyTemplateContext<T> extends AsyncRpcConext<T> {
-        final TemplateInfo srcTemplate;
-        final TemplateInfo destTemplate;
-        final DataStore destStore;
-        final AsyncCallFuture<TemplateApiResult> future;
-
-        /**
-         * @param callback
-         */
-        public CopyTemplateContext(AsyncCompletionCallback<T> callback, AsyncCallFuture<TemplateApiResult> future, TemplateInfo srcTemplate,
-                TemplateInfo destTemplate, DataStore destStore) {
-            super(callback);
-            this.srcTemplate = srcTemplate;
-            this.destTemplate = destTemplate;
-            this.destStore = destStore;
-            this.future = future;
-        }
-
-        public TemplateInfo getSrcTemplate() {
-            return srcTemplate;
-        }
-
-        public TemplateInfo getDestTemplate() {
-            return destTemplate;
-        }
-
-        public DataStore getDestStore() {
-            return destStore;
-        }
-
-        public AsyncCallFuture<TemplateApiResult> getFuture() {
-            return future;
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5f90aa97/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
index d53029a..ca9f22c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
@@ -22,12 +22,12 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
 
-import com.cloud.agent.api.Answer;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.utils.fsm.NoTransitionException;
 
 public interface ObjectInDataStoreManager {
-    public DataObject create(DataObject template, DataStore dataStore);
+    public DataObject create(DataObject dataObj, DataStore dataStore);
+    public boolean delete(DataObject dataObj);
     public DataObject get(DataObject dataObj, DataStore store);
     public boolean update(DataObject vo, Event event) throws NoTransitionException;
     DataObjectInStore findObject(long objId, DataObjectType type,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5f90aa97/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
index bf9a98d..b00d152 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
@@ -157,6 +157,58 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
         return this.get(obj,  dataStore);
     }
 
+
+    @Override
+    public boolean delete(DataObject dataObj) {
+        long objId = dataObj.getId();
+        DataStore dataStore = dataObj.getDataStore();
+        if (dataStore.getRole() == DataStoreRole.Primary) {
+            if ( dataObj.getType() == DataObjectType.TEMPLATE){
+                VMTemplateStoragePoolVO destTmpltPool = templatePoolDao.findByPoolTemplate(dataStore.getId(), objId);
+                if ( destTmpltPool != null ){
+                    return templatePoolDao.remove(destTmpltPool.getId());
+                } else {
+                    s_logger.warn("Template " + objId + " is not found on storage pool " + dataStore.getId() + ", so no need to delete");
+                    return true;
+                }
+            }
+        } else {
+            // Image store
+            switch ( dataObj.getType()){
+            case TEMPLATE:
+                TemplateDataStoreVO destTmpltStore = templateDataStoreDao.findByStoreTemplate(dataStore.getId(), objId);
+                if ( destTmpltStore != null ){
+                    return templateDataStoreDao.remove(destTmpltStore.getId());
+                }
+                else{
+                    s_logger.warn("Template " + objId + " is not found on image store " + dataStore.getId() + ", so no need to delete");
+                    return true;
+                }
+            case SNAPSHOT:
+                SnapshotDataStoreVO destSnapshotStore = snapshotDataStoreDao.findByStoreSnapshot(dataStore.getId(), objId);
+                if ( destSnapshotStore != null ){
+                    return snapshotDataStoreDao.remove(destSnapshotStore.getId());
+                }
+                else{
+                    s_logger.warn("Snapshot " + objId + " is not found on image store " + dataStore.getId() + ", so no need to delete");
+                    return true;
+                }
+            case VOLUME:
+                VolumeDataStoreVO destVolumeStore = volumeDataStoreDao.findByStoreVolume(dataStore.getId(), objId);
+                if ( destVolumeStore != null ){
+                    return volumeDataStoreDao.remove(destVolumeStore.getId());
+                }
+                else{
+                    s_logger.warn("Volume " + objId + " is not found on image store " + dataStore.getId() + ", so no need to delete");
+                    return true;
+                }
+            }
+        }
+
+        s_logger.warn("Unsupported data object (" + dataObj.getType() + ", " + dataObj.getDataStore() + ")");
+        return false;
+    }
+
     @Override
     public boolean update(DataObject data, Event event)
             throws NoTransitionException {