You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2013/02/06 03:43:28 UTC

[43/50] [abbrv] squash changes into one giant patch

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
new file mode 100644
index 0000000..d686336
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -0,0 +1,581 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.storage.motion;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand;
+import com.cloud.agent.api.CreatePrivateTemplateFromVolumeCommand;
+import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer;
+import com.cloud.agent.api.CreateVolumeFromSnapshotCommand;
+import com.cloud.agent.api.UpgradeSnapshotCommand;
+import com.cloud.agent.api.storage.CopyVolumeAnswer;
+import com.cloud.agent.api.storage.CopyVolumeCommand;
+import com.cloud.agent.api.storage.CreateAnswer;
+import com.cloud.agent.api.storage.CreateCommand;
+import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.configuration.Config;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.Storage.ImageFormat;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VMTemplateHostVO;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.VolumeHostVO;
+import com.cloud.storage.VolumeManager;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplateHostDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.dao.VolumeHostDao;
+import com.cloud.storage.snapshot.SnapshotManager;
+import com.cloud.template.TemplateManager;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.DiskProfile;
+
+@Component
+public class AncientDataMotionStrategy implements DataMotionStrategy {
+    private static final Logger s_logger = Logger
+            .getLogger(AncientDataMotionStrategy.class);
+    @Inject
+    TemplateManager templateMgr;
+    @Inject
+    VolumeHostDao volumeHostDao;
+    @Inject
+    HostDao hostDao;
+    @Inject
+    ConfigurationDao configDao;
+    @Inject
+    StorageManager storagMgr;
+    @Inject
+    VolumeDao volDao;
+    @Inject
+    VMTemplateDao templateDao;
+    @Inject
+    SnapshotManager snapshotMgr;
+    @Inject
+    SnapshotDao snapshotDao;
+    @Inject
+    PrimaryDataStoreDao primaryDataStoreDao;
+    @Inject
+    DataStoreManager dataStoreMgr;
+    @Inject
+    VMTemplateHostDao templateHostDao;
+    @Inject DiskOfferingDao diskOfferingDao;
+    @Inject VMTemplatePoolDao templatePoolDao;
+    @Inject
+    VolumeManager volumeMgr;
+
+    @Override
+    public boolean canHandle(DataObject srcData, DataObject destData) {
+        // TODO Auto-generated method stub
+        return true;
+    }
+
+    @DB
+    protected String copyVolumeFromImage(DataObject srcData, DataObject destData) {
+        String value = configDao.getValue(Config.RecreateSystemVmEnabled.key());
+        int _copyvolumewait = NumbersUtil.parseInt(value,
+                Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
+
+        VolumeHostVO volumeHostVO = volumeHostDao.findByVolumeId(srcData
+                .getId());
+        HostVO secStorage = hostDao.findById(volumeHostVO.getHostId());
+        String secondaryStorageURL = secStorage.getStorageUrl();
+        String[] volumePath = volumeHostVO.getInstallPath().split("/");
+        String volumeUUID = volumePath[volumePath.length - 1].split("\\.")[0];
+        StoragePool destPool = (StoragePool) destData.getDataStore();
+        CopyVolumeCommand cvCmd = new CopyVolumeCommand(srcData.getId(),
+                volumeUUID, destPool, secondaryStorageURL, false,
+                _copyvolumewait);
+        CopyVolumeAnswer cvAnswer = null;
+        String errMsg = null;
+        try {
+            cvAnswer = (CopyVolumeAnswer) this.storagMgr.sendToPool(destPool,
+                    cvCmd);
+        } catch (StorageUnavailableException e1) {
+            s_logger.debug("Failed to copy volume " + srcData.getId() + " to "
+                    + destData.getId(), e1);
+            errMsg = e1.toString();
+        }
+
+        if (cvAnswer == null || !cvAnswer.getResult()) {
+            errMsg = cvAnswer.getDetails();
+        }
+
+        VolumeVO vol = this.volDao.findById(destData.getId());
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        vol.setPath(cvAnswer.getVolumePath());
+        vol.setFolder(destPool.getPath());
+        vol.setPodId(destPool.getPodId());
+        vol.setPoolId(destPool.getId());
+        vol.setPodId(destPool.getPodId());
+
+        this.volDao.update(vol.getId(), vol);
+        volumeHostDao.remove(volumeHostVO.getId());
+        txn.commit();
+        return errMsg;
+    }
+
+    private void copyTemplate(DataObject srcData, DataObject destData) {
+        VMTemplateVO template = this.templateDao.findById(srcData.getId());
+        templateMgr.prepareTemplateForCreate(template,
+                (StoragePool) destData.getDataStore());
+    }
+
+    protected String copyFromSnapshot(DataObject snapObj, DataObject volObj) {
+        SnapshotVO snapshot = this.snapshotDao.findById(snapObj.getId());
+        StoragePool pool = (StoragePool) volObj.getDataStore();
+        String vdiUUID = null;
+        Long snapshotId = snapshot.getId();
+        Long volumeId = snapshot.getVolumeId();
+        Long dcId = snapshot.getDataCenterId();
+        String secondaryStoragePoolUrl = this.snapshotMgr
+                .getSecondaryStorageURL(snapshot);
+        long accountId = snapshot.getAccountId();
+
+        String backedUpSnapshotUuid = snapshot.getBackupSnapshotId();
+        snapshot = snapshotDao.findById(snapshotId);
+        if (snapshot.getVersion().trim().equals("2.1")) {
+            VolumeVO volume = this.volDao.findByIdIncludingRemoved(volumeId);
+            if (volume == null) {
+                throw new CloudRuntimeException("failed to upgrade snapshot "
+                        + snapshotId + " due to unable to find orignal volume:"
+                        + volumeId + ", try it later ");
+            }
+            if (volume.getTemplateId() == null) {
+                snapshotDao.updateSnapshotVersion(volumeId, "2.1", "2.2");
+            } else {
+                VMTemplateVO template = templateDao
+                        .findByIdIncludingRemoved(volume.getTemplateId());
+                if (template == null) {
+                    throw new CloudRuntimeException(
+                            "failed to upgrade snapshot "
+                                    + snapshotId
+                                    + " due to unalbe to find orignal template :"
+                                    + volume.getTemplateId()
+                                    + ", try it later ");
+                }
+                Long templateId = template.getId();
+                Long tmpltAccountId = template.getAccountId();
+                if (!snapshotDao.lockInLockTable(snapshotId.toString(), 10)) {
+                    throw new CloudRuntimeException(
+                            "failed to upgrade snapshot "
+                                    + snapshotId
+                                    + " due to this snapshot is being used, try it later ");
+                }
+                UpgradeSnapshotCommand cmd = new UpgradeSnapshotCommand(null,
+                        secondaryStoragePoolUrl, dcId, accountId, volumeId,
+                        templateId, tmpltAccountId, null,
+                        snapshot.getBackupSnapshotId(), snapshot.getName(),
+                        "2.1");
+                Answer answer = null;
+                try {
+                    answer = this.storagMgr.sendToPool(pool, cmd);
+                } catch (StorageUnavailableException e) {
+                } finally {
+                    snapshotDao.unlockFromLockTable(snapshotId.toString());
+                }
+                if ((answer != null) && answer.getResult()) {
+                    snapshotDao.updateSnapshotVersion(volumeId, "2.1", "2.2");
+                } else {
+                    return "Unable to upgrade snapshot from 2.1 to 2.2 for "
+                            + snapshot.getId();
+                }
+            }
+        }
+        String basicErrMsg = "Failed to create volume from "
+                + snapshot.getName() + " on pool " + pool;
+
+        try {
+            if (snapshot.getSwiftId() != null && snapshot.getSwiftId() != 0) {
+                snapshotMgr.downloadSnapshotsFromSwift(snapshot);
+            } else if (snapshot.getS3Id() != null && snapshot.getS3Id() != 0) {
+                snapshotMgr.downloadSnapshotsFromS3(snapshot);
+            }
+            String value = configDao
+                    .getValue(Config.CreateVolumeFromSnapshotWait.toString());
+            int _createVolumeFromSnapshotWait = NumbersUtil.parseInt(value,
+                    Integer.parseInt(Config.CreateVolumeFromSnapshotWait
+                            .getDefaultValue()));
+            CreateVolumeFromSnapshotCommand createVolumeFromSnapshotCommand = new CreateVolumeFromSnapshotCommand(
+                    pool, secondaryStoragePoolUrl, dcId, accountId, volumeId,
+                    backedUpSnapshotUuid, snapshot.getName(),
+                    _createVolumeFromSnapshotWait);
+            CreateVolumeFromSnapshotAnswer answer;
+            if (!snapshotDao.lockInLockTable(snapshotId.toString(), 10)) {
+                throw new CloudRuntimeException("failed to create volume from "
+                        + snapshotId
+                        + " due to this snapshot is being used, try it later ");
+            }
+            answer = (CreateVolumeFromSnapshotAnswer) this.storagMgr
+                    .sendToPool(pool, createVolumeFromSnapshotCommand);
+            if (answer != null && answer.getResult()) {
+                vdiUUID = answer.getVdi();
+                VolumeVO vol = this.volDao.findById(volObj.getId());
+                vol.setPath(vdiUUID);
+                this.volDao.update(vol.getId(), vol);
+                return null;
+            } else {
+                s_logger.error(basicErrMsg + " due to "
+                        + ((answer == null) ? "null" : answer.getDetails()));
+                throw new CloudRuntimeException(basicErrMsg);
+            }
+        } catch (StorageUnavailableException e) {
+            s_logger.error(basicErrMsg, e);
+            throw new CloudRuntimeException(basicErrMsg);
+        } finally {
+            if (snapshot.getSwiftId() != null) {
+                snapshotMgr.deleteSnapshotsDirForVolume(
+                        secondaryStoragePoolUrl, dcId, accountId, volumeId);
+            }
+            snapshotDao.unlockFromLockTable(snapshotId.toString());
+        }
+    }
+    
+    protected String cloneVolume(DataObject template, DataObject volume) {
+        
+        DiskOfferingVO offering = diskOfferingDao.findById(volume.getId());
+        VMTemplateStoragePoolVO  tmpltStoredOn =  templatePoolDao.findByPoolTemplate(template.getDataStore().getId(), template.getId());
+        VolumeInfo volInfo = (VolumeInfo)volume;
+        DiskProfile diskProfile = new DiskProfile(volInfo, offering,
+                null);
+        CreateCommand cmd = new CreateCommand(diskProfile,
+                tmpltStoredOn.getLocalDownloadPath(),
+                new StorageFilerTO((StoragePool)template.getDataStore()));
+        Answer answer = null;
+        StoragePool pool = (StoragePool)volume.getDataStore();
+        String errMsg = null;
+        try {
+            answer = storagMgr.sendToPool(pool, null, cmd);
+        } catch (StorageUnavailableException e) {
+            s_logger.debug("Failed to send to storage pool", e);
+            errMsg = e.toString();
+            return errMsg;
+        }
+        
+        if (answer.getResult()) {
+            VolumeVO vol = this.volDao.findById(volume.getId());
+            CreateAnswer createAnswer = (CreateAnswer) answer;
+            vol.setFolder(pool.getPath());
+            vol.setPath(createAnswer.getVolume().getPath());
+            vol.setSize(createAnswer.getVolume().getSize());
+            vol.setPoolType(pool.getPoolType());
+            vol.setPoolId(pool.getId());
+            vol.setPodId(pool.getPodId());
+            this.volDao.update(vol.getId(), vol);
+           
+        } else {
+            if (tmpltStoredOn != null
+                    && (answer instanceof CreateAnswer)
+                    && ((CreateAnswer) answer)
+                            .templateReloadRequested()) {
+                if (!templateMgr
+                        .resetTemplateDownloadStateOnPool(tmpltStoredOn
+                                .getId())) {
+                   
+                }
+            }
+            errMsg = answer.getDetails();
+        }
+        
+        return errMsg;
+    }
+
+    @Override
+    public Void copyAsync(DataObject srcData, DataObject destData,
+            AsyncCompletionCallback<CopyCommandResult> callback) {
+        String errMsg = null;
+        try {
+            if (destData.getType() == DataObjectType.VOLUME
+                    && srcData.getType() == DataObjectType.VOLUME) {
+                errMsg = copyVolumeFromImage(srcData, destData);
+            } else if (destData.getType() == DataObjectType.TEMPLATE
+                    && srcData.getType() == DataObjectType.TEMPLATE) {
+                copyTemplate(srcData, destData);
+            } else if (srcData.getType() == DataObjectType.SNAPSHOT
+                    && destData.getType() == DataObjectType.VOLUME) {
+                errMsg = copyFromSnapshot(srcData, destData);
+            } else if (srcData.getType() == DataObjectType.SNAPSHOT
+                    && destData.getType() == DataObjectType.TEMPLATE) {
+                errMsg = createTemplateFromSnashot(srcData, destData);
+            } else if (srcData.getType() == DataObjectType.VOLUME
+                    && destData.getType() == DataObjectType.TEMPLATE) {
+                errMsg = createTemplateFromVolume(srcData, destData);
+            } else if (srcData.getType() == DataObjectType.TEMPLATE 
+                    && destData.getType() == DataObjectType.VOLUME) {
+                errMsg = cloneVolume(srcData, destData);
+            }
+        } catch (Exception e) {
+            s_logger.debug("copy failed", e);
+            errMsg = e.toString();
+        }
+        CopyCommandResult result = new CopyCommandResult(null);
+        result.setResult(errMsg);
+        callback.complete(result);
+
+        return null;
+    }
+
+    @DB
+    protected String createTemplateFromSnashot(DataObject srcData,
+            DataObject destData) {
+        long snapshotId = srcData.getId();
+        SnapshotVO snapshot = snapshotDao.findById(snapshotId);
+        if (snapshot == null) {
+            throw new CloudRuntimeException("Unable to find Snapshot for Id "
+                    + srcData.getId());
+        }
+        Long zoneId = snapshot.getDataCenterId();
+        HostVO secondaryStorageHost = this.templateMgr
+                .getSecondaryStorageHost(zoneId);
+        String secondaryStorageURL = snapshotMgr
+                .getSecondaryStorageURL(snapshot);
+        VMTemplateVO template = this.templateDao.findById(destData.getId());
+        String name = template.getName();
+        String backupSnapshotUUID = snapshot.getBackupSnapshotId();
+        if (backupSnapshotUUID == null) {
+            throw new CloudRuntimeException(
+                    "Unable to create private template from snapshot "
+                            + snapshotId
+                            + " due to there is no backupSnapshotUUID for this snapshot");
+        }
+
+        Long dcId = snapshot.getDataCenterId();
+        Long accountId = snapshot.getAccountId();
+        Long volumeId = snapshot.getVolumeId();
+
+        String origTemplateInstallPath = null;
+        List<StoragePoolVO> pools = this.storagMgr
+                .ListByDataCenterHypervisor(zoneId,
+                        snapshot.getHypervisorType());
+        if (pools == null || pools.size() == 0) {
+            throw new CloudRuntimeException(
+                    "Unable to find storage pools in zone " + zoneId);
+        }
+        StoragePoolVO poolvo = pools.get(0);
+        StoragePool pool = (StoragePool) this.dataStoreMgr.getDataStore(
+                poolvo.getId(), DataStoreRole.Primary);
+        if (snapshot.getVersion() != null
+                && snapshot.getVersion().equalsIgnoreCase("2.1")) {
+            VolumeVO volume = this.volDao.findByIdIncludingRemoved(volumeId);
+            if (volume == null) {
+                throw new CloudRuntimeException("failed to upgrade snapshot "
+                        + snapshotId + " due to unable to find orignal volume:"
+                        + volumeId + ", try it later ");
+            }
+            if (volume.getTemplateId() == null) {
+                snapshotDao.updateSnapshotVersion(volumeId, "2.1", "2.2");
+            } else {
+                template = templateDao.findByIdIncludingRemoved(volume
+                        .getTemplateId());
+                if (template == null) {
+                    throw new CloudRuntimeException(
+                            "failed to upgrade snapshot "
+                                    + snapshotId
+                                    + " due to unalbe to find orignal template :"
+                                    + volume.getTemplateId()
+                                    + ", try it later ");
+                }
+                Long origTemplateId = template.getId();
+                Long origTmpltAccountId = template.getAccountId();
+                if (!this.volDao.lockInLockTable(volumeId.toString(), 10)) {
+                    throw new CloudRuntimeException(
+                            "failed to upgrade snapshot " + snapshotId
+                                    + " due to volume:" + volumeId
+                                    + " is being used, try it later ");
+                }
+                UpgradeSnapshotCommand cmd = new UpgradeSnapshotCommand(null,
+                        secondaryStorageURL, dcId, accountId, volumeId,
+                        origTemplateId, origTmpltAccountId, null,
+                        snapshot.getBackupSnapshotId(), snapshot.getName(),
+                        "2.1");
+                if (!this.volDao.lockInLockTable(volumeId.toString(), 10)) {
+                    throw new CloudRuntimeException(
+                            "Creating template failed due to volume:"
+                                    + volumeId
+                                    + " is being used, try it later ");
+                }
+                Answer answer = null;
+                try {
+                    answer = this.storagMgr.sendToPool(pool, cmd);
+                    cmd = null;
+                } catch (StorageUnavailableException e) {
+                } finally {
+                    this.volDao.unlockFromLockTable(volumeId.toString());
+                }
+                if ((answer != null) && answer.getResult()) {
+                    snapshotDao.updateSnapshotVersion(volumeId, "2.1", "2.2");
+                } else {
+                    throw new CloudRuntimeException(
+                            "Unable to upgrade snapshot");
+                }
+            }
+        }
+        if (snapshot.getSwiftId() != null && snapshot.getSwiftId() != 0) {
+            snapshotMgr.downloadSnapshotsFromSwift(snapshot);
+        }
+        String value = configDao
+                .getValue(Config.CreatePrivateTemplateFromSnapshotWait
+                        .toString());
+        int _createprivatetemplatefromsnapshotwait = NumbersUtil.parseInt(
+                value, Integer
+                        .parseInt(Config.CreatePrivateTemplateFromSnapshotWait
+                                .getDefaultValue()));
+
+        CreatePrivateTemplateFromSnapshotCommand cmd = new CreatePrivateTemplateFromSnapshotCommand(
+                pool, secondaryStorageURL, dcId, accountId,
+                snapshot.getVolumeId(), backupSnapshotUUID, snapshot.getName(),
+                origTemplateInstallPath, template.getId(), name,
+                _createprivatetemplatefromsnapshotwait);
+
+        return sendCommand(cmd, pool, template.getId(), dcId,
+                secondaryStorageHost.getId());
+    }
+
+    @DB
+    protected String sendCommand(Command cmd, StoragePool pool,
+            long templateId, long zoneId, long hostId) {
+
+        CreatePrivateTemplateAnswer answer = null;
+        try {
+            answer = (CreatePrivateTemplateAnswer) this.storagMgr.sendToPool(
+                    pool, cmd);
+        } catch (StorageUnavailableException e) {
+            throw new CloudRuntimeException(
+                    "Failed to execute CreatePrivateTemplateFromSnapshotCommand",
+                    e);
+        }
+
+        if (answer == null) {
+            return "Failed to execute CreatePrivateTemplateFromSnapshotCommand";
+        } else if (!answer.getResult()) {
+            return "Failed to execute CreatePrivateTemplateFromSnapshotCommand"
+                    + answer.getDetails();
+        }
+
+        VMTemplateVO privateTemplate = templateDao.findById(templateId);
+        String answerUniqueName = answer.getUniqueName();
+        if (answerUniqueName != null) {
+            privateTemplate.setUniqueName(answerUniqueName);
+        }
+        ImageFormat format = answer.getImageFormat();
+        if (format != null) {
+            privateTemplate.setFormat(format);
+        } else {
+            // This never occurs.
+            // Specify RAW format makes it unusable for snapshots.
+            privateTemplate.setFormat(ImageFormat.RAW);
+        }
+
+        String checkSum = this.templateMgr
+                .getChecksum(hostId, answer.getPath());
+
+        Transaction txn = Transaction.currentTxn();
+
+        txn.start();
+
+        privateTemplate.setChecksum(checkSum);
+        templateDao.update(privateTemplate.getId(), privateTemplate);
+
+        // add template zone ref for this template
+        templateDao.addTemplateToZone(privateTemplate, zoneId);
+        VMTemplateHostVO templateHostVO = new VMTemplateHostVO(hostId,
+                privateTemplate.getId());
+        templateHostVO.setDownloadPercent(100);
+        templateHostVO.setDownloadState(Status.DOWNLOADED);
+        templateHostVO.setInstallPath(answer.getPath());
+        templateHostVO.setLastUpdated(new Date());
+        templateHostVO.setSize(answer.getVirtualSize());
+        templateHostVO.setPhysicalSize(answer.getphysicalSize());
+        templateHostDao.persist(templateHostVO);
+        txn.close();
+        return null;
+    }
+
+    private String createTemplateFromVolume(DataObject srcObj,
+            DataObject destObj) {
+        long volumeId = srcObj.getId();
+        VolumeVO volume = this.volDao.findById(volumeId);
+        if (volume == null) {
+            throw new CloudRuntimeException("Unable to find volume for Id "
+                    + volumeId);
+        }
+        long accountId = volume.getAccountId();
+
+        String vmName = this.volumeMgr.getVmNameOnVolume(volume);
+        Long zoneId = volume.getDataCenterId();
+        HostVO secondaryStorageHost = this.templateMgr
+                .getSecondaryStorageHost(zoneId);
+        if (secondaryStorageHost == null) {
+            throw new CloudRuntimeException(
+                    "Can not find the secondary storage for zoneId " + zoneId);
+        }
+        String secondaryStorageURL = secondaryStorageHost.getStorageUrl();
+        VMTemplateVO template = this.templateDao.findById(destObj.getId());
+        StoragePool pool = (StoragePool) this.dataStoreMgr.getDataStore(
+                volume.getPoolId(), DataStoreRole.Primary);
+        String value = configDao
+                .getValue(Config.CreatePrivateTemplateFromVolumeWait.toString());
+        int _createprivatetemplatefromvolumewait = NumbersUtil.parseInt(value,
+                Integer.parseInt(Config.CreatePrivateTemplateFromVolumeWait
+                        .getDefaultValue()));
+
+        CreatePrivateTemplateFromVolumeCommand cmd = new CreatePrivateTemplateFromVolumeCommand(
+                pool, secondaryStorageURL, destObj.getId(), accountId,
+                template.getName(), template.getUniqueName(), volume.getPath(),
+                vmName, _createprivatetemplatefromvolumewait);
+
+        return sendCommand(cmd, pool, template.getId(), zoneId,
+                secondaryStorageHost.getId());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactory.java b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactory.java
deleted file mode 100644
index 22d328f..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactory.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.snapshot;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-
-public interface SnapshotDataFactory {
-    public SnapshotInfo getSnapshot(long snapshotId, DataStore store);
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotInfo.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotInfo.java b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotInfo.java
deleted file mode 100644
index 755531d..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotInfo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package org.apache.cloudstack.storage.snapshot;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-
-public interface SnapshotInfo extends DataObject {
-	public SnapshotInfo getParent();
-	public SnapshotInfo getChild();
-	public VolumeInfo getBaseVolume();
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotService.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotService.java b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotService.java
index d50c9a0..f3e5c4a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotService.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotService.java
@@ -17,6 +17,7 @@
 package org.apache.cloudstack.storage.snapshot;
 
 import org.apache.cloudstack.engine.cloud.entity.api.SnapshotEntity;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 
 public interface SnapshotService {
 	public SnapshotEntity getSnapshotEntity(long snapshotId);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategy.java b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategy.java
index 4e31186..8c4c815 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategy.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategy.java
@@ -16,6 +16,8 @@
 // under the License.
 package org.apache.cloudstack.storage.snapshot;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+
 public interface SnapshotStrategy {
 	public boolean takeSnapshot(SnapshotInfo snapshot);
 	public boolean revertSnapshot(SnapshotInfo snapshot);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
index cd67b97..aa47e8f 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/PrimaryDataStoreTO.java
@@ -21,12 +21,12 @@ import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 public class PrimaryDataStoreTO {
     private final String uuid;
     private final String name;
-    private final String type;
+    private  String type;
     private final long id;
     public PrimaryDataStoreTO(PrimaryDataStoreInfo dataStore) {
         this.uuid = dataStore.getUuid();
         this.name = dataStore.getName();
-        this.type = dataStore.getType();
+      //  this.type = dataStore.getType();
         this.id = dataStore.getId();
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
index ed59909..bc55ea8 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
@@ -16,8 +16,8 @@
 // under the License.
 package org.apache.cloudstack.storage.to;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
-import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.image.datastore.ImageDataStoreInfo;
 
 public class TemplateTO {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java b/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java
deleted file mode 100644
index d0530d1..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.volume;
-
-import com.cloud.utils.fsm.StateObject;
-
-public interface ObjectInDataStoreStateMachine extends StateObject<ObjectInDataStoreStateMachine.State> {
-    enum State {
-        Allocated("The initial state"),
-        Creating2("This is only used with createOnlyRequested event"),
-        Creating("The object is being creating on data store"),
-        Created("The object is created"),
-        Ready("Template downloading is complished"),
-        Copying("The object is being coping"),
-        Destroying("Template is destroying"),
-        Destroyed("Template is destroyed"),
-        Failed("Failed to download template");
-        String _description;
-
-        private State(String description) {
-            _description = description;
-        }
-
-        public String getDescription() {
-            return _description;
-        }
-    }
-    
-    enum Event {
-        CreateRequested,
-        CreateOnlyRequested,
-        DestroyRequested,
-        OperationSuccessed,
-        OperationFailed,
-        CopyingRequested,
-        
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/PrimaryDataStoreDriver.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/PrimaryDataStoreDriver.java b/engine/storage/src/org/apache/cloudstack/storage/volume/PrimaryDataStoreDriver.java
index 60db60b..2b49eee 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/PrimaryDataStoreDriver.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/PrimaryDataStoreDriver.java
@@ -20,8 +20,8 @@ package org.apache.cloudstack.storage.volume;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
 
 public interface PrimaryDataStoreDriver extends DataStoreDriver {
     public void takeSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CommandResult> callback);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreInfo.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreInfo.java b/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreInfo.java
index 368c33a..b8d0857 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreInfo.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreInfo.java
@@ -18,8 +18,8 @@
  */
 package org.apache.cloudstack.storage.volume;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.image.TemplateInfo;
 
 public interface TemplateOnPrimaryDataStoreInfo {
     public String getPath();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java
deleted file mode 100644
index 19a4c3a..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeService.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.volume;
-
-import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
-import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
-import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
-import org.apache.cloudstack.framework.async.AsyncCallFuture;
-import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.image.TemplateInfo;
-
-public interface VolumeService {
-    
-    public class VolumeApiResult extends CommandResult {
-        private final VolumeInfo volume;
-        public VolumeApiResult(VolumeInfo volume) {
-            this.volume = volume;
-        }
-        
-        public VolumeInfo getVolume() {
-            return this.volume;
-        }
-    }
-    /**
-	 * 
-	 */
-    VolumeEntity allocateVolumeInDb(long size, VolumeType type, String volName, Long templateId);
-
-    /**
-     * Creates the volume based on the given criteria
-     * 
-     * @param cmd
-     * 
-     * @return the volume object
-     */
-    AsyncCallFuture<VolumeApiResult> createVolumeAsync(VolumeInfo volume, long dataStoreId);
-
-    /**
-     * Delete volume
-     * 
-     * @param volumeId
-     * @return
-     * @throws ConcurrentOperationException
-     */
-    AsyncCallFuture<VolumeApiResult> deleteVolumeAsync(VolumeInfo volume);
-
-    /**
-     * 
-     */
-    boolean cloneVolume(long volumeId, long baseVolId);
-
-    /**
-     * 
-     */
-    boolean createVolumeFromSnapshot(long volumeId, long snapshotId);
-
-    /**
-     * 
-     */
-    String grantAccess(VolumeInfo volume, EndPoint endpointId);
-
-    TemplateOnPrimaryDataStoreInfo grantAccess(TemplateOnPrimaryDataStoreInfo template, EndPoint endPoint);
-
-    /**
-     * 
-     */
-    boolean rokeAccess(long volumeId, long endpointId);
-
-    VolumeEntity getVolumeEntity(long volumeId);
-
-    AsyncCallFuture<VolumeApiResult> createVolumeFromTemplateAsync(VolumeInfo volume, long dataStoreId, TemplateInfo template);
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
index 20ceaa3..c6ca90d 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
@@ -23,40 +23,38 @@ import java.util.Map;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.springframework.stereotype.Component;
 
+import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
 public class PrimaryDataStoreHelper {
     @Inject
     private PrimaryDataStoreDao dataStoreDao;
-    public PrimaryDataStoreVO createPrimaryDataStore(Map<String, String> params) {
-        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findPoolByUUID(params.get("uuid"));
+    public StoragePoolVO createPrimaryDataStore(Map<String, Object> params) {
+        StoragePoolVO dataStoreVO = dataStoreDao.findPoolByUUID((String)params.get("uuid"));
         if (dataStoreVO != null) {
             throw new CloudRuntimeException("duplicate uuid: " + params.get("uuid"));
         }
         
-        dataStoreVO = new PrimaryDataStoreVO();
-        dataStoreVO.setStorageProviderId(Long.parseLong(params.get("providerId")));
-        dataStoreVO.setHostAddress(params.get("server"));
-        dataStoreVO.setPath(params.get("path"));
-        dataStoreVO.setPoolType(params.get("protocol"));
-        dataStoreVO.setPort(Integer.parseInt(params.get("port")));
-        dataStoreVO.setName(params.get("name"));
-        dataStoreVO.setUuid(params.get("uuid"));
+        dataStoreVO = new StoragePoolVO();
+        dataStoreVO.setStorageProviderId(Long.parseLong((String)params.get("providerId")));
+        dataStoreVO.setHostAddress((String)params.get("server"));
+        dataStoreVO.setPath((String)params.get("path"));
+        dataStoreVO.setPoolType((StoragePoolType)params.get("protocol"));
+        dataStoreVO.setPort(Integer.parseInt((String)params.get("port")));
+        dataStoreVO.setName((String)params.get("name"));
+        dataStoreVO.setUuid((String)params.get("uuid"));
         dataStoreVO = dataStoreDao.persist(dataStoreVO);
         return dataStoreVO;
     }
     
     public boolean deletePrimaryDataStore(long id) {
-        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(id);
+        StoragePoolVO dataStoreVO = dataStoreDao.findById(id);
         if (dataStoreVO == null) {
             throw new CloudRuntimeException("can't find store: " + id);
         }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
index 45ff1ec..63cdb16 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
@@ -18,7 +18,7 @@
  */
 package org.apache.cloudstack.storage.volume.db;
 
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.fsm.StateDao;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
index b47f088..ad56150 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
@@ -20,9 +20,9 @@ package org.apache.cloudstack.storage.volume.db;
 
 import java.util.Date;
 
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
index 2d355df..48a9f33 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
@@ -32,7 +32,9 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.fsm.StateObject;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
index 9c009c9..72c1843 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
@@ -18,45 +18,50 @@ package org.apache.cloudstack.storage.datastore;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import javax.inject.Inject;
 
-import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State;
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
+import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
 import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
 import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
-import org.apache.cloudstack.storage.datastore.provider.DataStoreProvider;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.image.ImageDataFactory;
-import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.snapshot.SnapshotDataFactory;
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.volume.VolumeObject;
-import org.apache.cloudstack.storage.volume.db.VolumeDao2;
-import org.apache.cloudstack.storage.volume.db.VolumeVO;
 import org.apache.log4j.Logger;
 
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.StoragePoolStatus;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.VolumeDao;
 import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.storage.encoding.EncodingType;
 
 public class DefaultPrimaryDataStore implements PrimaryDataStore {
     private static final Logger s_logger = Logger
             .getLogger(DefaultPrimaryDataStore.class);
     protected PrimaryDataStoreDriver driver;
-    protected PrimaryDataStoreVO pdsv;
+    protected StoragePoolVO pdsv;
     @Inject
     protected PrimaryDataStoreDao dataStoreDao;
     protected PrimaryDataStoreLifeCycle lifeCycle;
@@ -67,15 +72,16 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
     @Inject
     SnapshotDataFactory snapshotFactory;
     protected DataStoreProvider provider;
-
     @Inject
-    private VolumeDao2 volumeDao;
+    VMTemplatePoolDao templatePoolDao;
+
+    private VolumeDao volumeDao;
 
     protected DefaultPrimaryDataStore() {
        
     }
     
-    public void configure(PrimaryDataStoreVO pdsv,
+    public void configure(StoragePoolVO pdsv,
             PrimaryDataStoreDriver driver, DataStoreProvider provider) {
         this.pdsv = pdsv;
         this.driver = driver;
@@ -83,7 +89,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
     }
 
     public static DefaultPrimaryDataStore createDataStore(
-            PrimaryDataStoreVO pdsv, PrimaryDataStoreDriver driver,
+            StoragePoolVO pdsv, PrimaryDataStoreDriver driver,
             DataStoreProvider provider) {
         DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)ComponentContext.inject(DefaultPrimaryDataStore.class);
         dataStore.configure(pdsv, driver, provider);
@@ -109,19 +115,16 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
 
     @Override
     public DataStoreDriver getDriver() {
-        // TODO Auto-generated method stub
         return this.driver;
     }
 
     @Override
     public DataStoreRole getRole() {
-        // TODO Auto-generated method stub
         return DataStoreRole.Primary;
     }
 
     @Override
     public long getId() {
-        // TODO Auto-generated method stub
         return this.pdsv.getId();
     }
 
@@ -143,7 +146,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
 
     @Override
     public Scope getScope() {
-        PrimaryDataStoreVO vo = dataStoreDao.findById(this.pdsv.getId());
+        StoragePoolVO vo = dataStoreDao.findById(this.pdsv.getId());
         if (vo.getScope() == ScopeType.CLUSTER) {
             return new ClusterScope(vo.getClusterId(), vo.getPodId(),
                     vo.getDataCenterId());
@@ -156,7 +159,7 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
     @Override
     public boolean isHypervisorSupported(HypervisorType hypervisor) {
         // TODO Auto-generated method stub
-        return false;
+        return true;
     }
 
     @Override
@@ -171,28 +174,10 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
         return false;
     }
 
-    @Override
-    public long getCapacity() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public long getAvailableCapacity() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
 
     @Override
     public String getUuid() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public State getManagedState() {
-        // TODO Auto-generated method stub
-        return null;
+        return this.pdsv.getUuid();
     }
 
     @Override
@@ -202,26 +187,19 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
     }
 
     @Override
-    public String getType() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
     public PrimaryDataStoreLifeCycle getLifeCycle() {
         return this.lifeCycle;
     }
 
     @Override
     public boolean exists(DataObject data) {
-        return (objectInStoreMgr.findObject(data.getId(), data.getType(),
-                this.getId(), this.getRole()) != null) ? true : false;
+        return (objectInStoreMgr.findObject(data, data.getDataStore()) != null) ? true : false;
     }
 
     @Override
     public TemplateInfo getTemplate(long templateId) {
-        ObjectInDataStoreVO obj = objectInStoreMgr.findObject(templateId, DataObjectType.TEMPLATE, this.getId(), this.getRole());
-        if (obj == null) {
+        VMTemplateStoragePoolVO template = templatePoolDao.findByPoolTemplate(this.getId(), templateId);
+        if (template == null || template.getState() != ObjectInDataStoreStateMachine.State.Ready) {
             return null;
         }
         return imageDataFactory.getTemplate(templateId, this);
@@ -238,4 +216,117 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
         // TODO Auto-generated method stub
         return null;
     }
+
+    @Override
+    public DataObject create(DataObject obj) {
+        //create template on primary storage
+        if (obj.getType() == DataObjectType.TEMPLATE) {
+            VMTemplateStoragePoolVO templateStoragePoolRef = templatePoolDao.findByPoolTemplate(this.getId(), obj.getId());
+            if (templateStoragePoolRef == null) {
+                try {
+                templateStoragePoolRef = new VMTemplateStoragePoolVO(this.getId(), obj.getId());
+                templateStoragePoolRef = templatePoolDao.persist(templateStoragePoolRef);
+                } catch (Throwable t) {
+                    templateStoragePoolRef = templatePoolDao.findByPoolTemplate(this.getId(), obj.getId());
+                    if (templateStoragePoolRef == null) {
+                        throw new CloudRuntimeException("Failed to create template storage pool entry");
+                    }
+                }
+            }
+            
+        }
+        
+        return objectInStoreMgr.get(obj, this);
+    }
+
+    @Override
+    public boolean delete(DataObject obj) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public long getDataCenterId() {
+        return this.pdsv.getDataCenterId();
+    }
+
+    @Override
+    public String getPath() {
+        return this.pdsv.getPath();
+    }
+
+    @Override
+    public StoragePoolType getPoolType() {
+       return this.pdsv.getPoolType();
+    }
+
+    @Override
+    public Date getCreated() {
+       return this.pdsv.getCreated();
+    }
+
+    @Override
+    public Date getUpdateTime() {
+       return this.pdsv.getUpdateTime();
+    }
+
+    @Override
+    public long getCapacityBytes() {
+       return this.pdsv.getCapacityBytes();
+    }
+
+    @Override
+    public long getAvailableBytes() {
+        return this.pdsv.getAvailableBytes();
+    }
+
+    @Override
+    public Long getClusterId() {
+        return this.pdsv.getClusterId();
+    }
+
+    @Override
+    public String getHostAddress() {
+        return this.pdsv.getHostAddress();
+    }
+
+    @Override
+    public String getUserInfo() {
+        return this.pdsv.getUserInfo();
+    }
+
+    @Override
+    public boolean isShared() {
+       return this.pdsv.getScope() == ScopeType.HOST ? false : true;
+    }
+
+    @Override
+    public boolean isLocal() {
+        return !this.isShared();
+    }
+
+    @Override
+    public StoragePoolStatus getStatus() {
+        return this.pdsv.getStatus();
+    }
+
+    @Override
+    public int getPort() {
+        return this.pdsv.getPort();
+    }
+
+    @Override
+    public Long getPodId() {
+        return this.pdsv.getPodId();
+    }
+
+    @Override
+    public Long getStorageProviderId() {
+        return this.pdsv.getStorageProviderId();
+    }
+
+    @Override
+    public boolean isInMaintenance() {
+        return this.getStatus() == StoragePoolStatus.Maintenance ? true : false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java
new file mode 100644
index 0000000..9946fba
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/AncientPrimaryDataStoreDriverImpl.java
@@ -0,0 +1,289 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.storage.datastore.driver;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+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.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.CreateAnswer;
+import com.cloud.agent.api.storage.CreateCommand;
+import com.cloud.agent.api.storage.DestroyCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.Storage;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VMTemplateHostVO;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.template.TemplateManager;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.dao.VMInstanceDao;
+
+public class AncientPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
+    private static final Logger s_logger = Logger
+            .getLogger(AncientPrimaryDataStoreDriverImpl.class);
+    @Inject DiskOfferingDao diskOfferingDao;
+    @Inject VMTemplateDao templateDao;
+    @Inject VolumeDao volumeDao;
+    @Inject TemplateManager templateMgr;
+    @Inject HostDao hostDao;
+    @Inject StorageManager storageMgr;
+    @Inject VMInstanceDao vmDao;
+    @Inject PrimaryDataStoreDao primaryStoreDao;
+    @Override
+    public String grantAccess(DataObject data, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean revokeAccess(DataObject data, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public Set<DataObject> listObjects(DataStore store) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public boolean createVolume(
+            VolumeInfo volume) throws StorageUnavailableException {
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Creating volume: " + volume);
+        }
+        
+        DiskOfferingVO offering = diskOfferingDao.findById(volume.getDiskOfferingId());
+        DiskProfile diskProfile = new DiskProfile(volume, offering,
+                null);
+
+        VMTemplateVO template = null;
+        if (volume.getTemplateId() != null) {
+            template = templateDao.findById(volume.getTemplateId());
+        }
+
+        StoragePool pool = (StoragePool)volume.getDataStore();
+        VolumeVO vol = volumeDao.findById(volume.getId());
+        if (pool != null) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("Trying to create in " + pool);
+            }
+            vol.setPoolId(pool.getId());
+   
+            CreateCommand cmd = null;
+            VMTemplateStoragePoolVO tmpltStoredOn = null;
+
+            for (int i = 0; i < 2; i++) {
+                if (template != null
+                        && template.getFormat() != Storage.ImageFormat.ISO) {
+                    if (pool.getPoolType() == StoragePoolType.CLVM) {
+                        // prepareISOForCreate does what we need, which is to
+                        // tell us where the template is
+                        VMTemplateHostVO tmpltHostOn = templateMgr
+                                .prepareISOForCreate(template, pool);
+                        if (tmpltHostOn == null) {
+                            s_logger.debug("cannot find template "
+                                    + template.getId() + " "
+                                    + template.getName());
+                            throw new CloudRuntimeException("cannot find template"
+                                    + template.getId() 
+                                    + template.getName());
+                        }
+                        HostVO secondaryStorageHost = hostDao
+                                .findById(tmpltHostOn.getHostId());
+                        String tmpltHostUrl = secondaryStorageHost
+                                .getStorageUrl();
+                        String fullTmpltUrl = tmpltHostUrl + "/"
+                                + tmpltHostOn.getInstallPath();
+                        cmd = new CreateCommand(diskProfile, fullTmpltUrl,
+                                new StorageFilerTO(pool));
+                    } else {
+                        tmpltStoredOn = templateMgr.prepareTemplateForCreate(
+                                template, pool);
+                        if (tmpltStoredOn == null) {
+                            s_logger.debug("Cannot use this pool " + pool
+                                    + " because we can't propagate template "
+                                    + template);
+                            throw new CloudRuntimeException("Cannot use this pool " + pool
+                                    + " because we can't propagate template "
+                                    + template);
+                        }
+                        cmd = new CreateCommand(diskProfile,
+                                tmpltStoredOn.getLocalDownloadPath(),
+                                new StorageFilerTO(pool));
+                    }
+                } else {
+                    if (template != null
+                            && Storage.ImageFormat.ISO == template.getFormat()) {
+                        VMTemplateHostVO tmpltHostOn = templateMgr
+                                .prepareISOForCreate(template, pool);
+                        if (tmpltHostOn == null) {
+                            throw new CloudRuntimeException(
+                                    "Did not find ISO in secondry storage in zone "
+                                            + pool.getDataCenterId());
+                        }
+                    }
+                    cmd = new CreateCommand(diskProfile, new StorageFilerTO(
+                            pool));
+                }
+
+                Answer answer = storageMgr.sendToPool(pool, null, cmd);
+                if (answer.getResult()) {
+                    CreateAnswer createAnswer = (CreateAnswer) answer;
+                    vol.setFolder(pool.getPath());
+                    vol.setPath(createAnswer.getVolume().getPath());
+                    vol.setSize(createAnswer.getVolume().getSize());
+                    vol.setPoolType(pool.getPoolType());
+                    vol.setPoolId(pool.getId());
+                    vol.setPodId(pool.getPodId());
+                    this.volumeDao.update(vol.getId(), vol);
+                    return true;
+                } else {
+                    if (tmpltStoredOn != null
+                            && (answer instanceof CreateAnswer)
+                            && ((CreateAnswer) answer)
+                                    .templateReloadRequested()) {
+                        if (!templateMgr
+                                .resetTemplateDownloadStateOnPool(tmpltStoredOn
+                                        .getId())) {
+                            break; // break out of template-redeploy retry loop
+                        }
+                    } else {
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Unable to create volume " + volume.getId());
+        }
+        return false;
+    }
+
+    @Override
+    public void createAsync(DataObject data,
+            AsyncCompletionCallback<CreateCmdResult> callback) {
+        // TODO Auto-generated method stub
+        String errMsg = null;
+        if (data.getType() == DataObjectType.VOLUME) {
+            try {
+                createVolume((VolumeInfo)data);
+            } catch (StorageUnavailableException e) {
+                s_logger.debug("failed to create volume", e);
+                errMsg = e.toString();
+            } catch (Exception e) {
+                s_logger.debug("failed to create volume", e);
+                errMsg = e.toString();
+            }
+        }
+        CreateCmdResult result = new CreateCmdResult(null, null);
+        if (errMsg != null) {
+            result.setResult(errMsg);
+        }
+        
+        callback.complete(result);
+        
+    }
+
+    @Override
+    public void deleteAsync(DataObject data,
+            AsyncCompletionCallback<CommandResult> callback) {
+
+        String vmName = null;
+        VolumeVO vol = this.volumeDao.findById(data.getId());
+
+
+        StoragePool pool = (StoragePool)data.getDataStore();
+
+        DestroyCommand cmd = new DestroyCommand(pool, vol, vmName);
+
+        CommandResult result = new CommandResult();
+        try {
+            Answer answer = this.storageMgr.sendToPool(pool, cmd);
+            if (answer != null && !answer.getResult()) {
+                result.setResult(answer.getDetails());
+                s_logger.info("Will retry delete of " + vol + " from " + pool.getId());
+            }
+        } catch (StorageUnavailableException e) {
+            s_logger.error("Storage is unavailable currently.  Will retry delete of "
+                        + vol + " from " + pool.getId(), e);
+            result.setResult(e.toString());
+        } catch (Exception ex) {
+            s_logger.debug("Unable to destoy volume" + vol + " from " + pool.getId(), ex);
+            result.setResult(ex.toString());
+        }
+        callback.complete(result);
+    }
+
+    @Override
+    public void copyAsync(DataObject srcdata, DataObject destData,
+            AsyncCompletionCallback<CopyCommandResult> callback) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public boolean canCopy(DataObject srcData, DataObject destData) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void takeSnapshot(SnapshotInfo snapshot,
+            AsyncCompletionCallback<CommandResult> callback) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void revertSnapshot(SnapshotInfo snapshot,
+            AsyncCompletionCallback<CommandResult> callback) {
+        // TODO Auto-generated method stub
+        
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7ff41648/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
index dfe4518..efd04d1 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
@@ -27,6 +27,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.framework.async.AsyncRpcConext;
@@ -35,7 +36,6 @@ import org.apache.cloudstack.storage.command.CreateObjectCommand;
 import org.apache.cloudstack.storage.command.DeleteCommand;
 import org.apache.cloudstack.storage.datastore.DataObjectManager;
 import org.apache.cloudstack.storage.endpoint.EndPointSelector;
-import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
 import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.apache.log4j.Logger;