Search in sources :

Example 1 with CopyCommand

use of org.apache.cloudstack.storage.command.CopyCommand in project cloudstack by apache.

the class StorageSystemDataMotionStrategy method handleCopyDataToSecondaryStorage.

/**
     * This function is responsible for copying a volume from the managed store to a secondary store. This is used in two cases
     * 1) When creating a template from a snapshot
     * 2) When createSnapshot is called with location=SECONDARY
     *
     * @param snapshotInfo Source snapshot
     * @param destData destination (can be template or snapshot)
     * @param callback callback for async
     */
private void handleCopyDataToSecondaryStorage(SnapshotInfo snapshotInfo, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
    try {
        snapshotInfo.processEvent(Event.CopyingRequested);
    } catch (Exception ex) {
        throw new CloudRuntimeException("This snapshot is not currently in a state where it can be used to create a template.");
    }
    HostVO hostVO = getHost(snapshotInfo);
    boolean usingBackendSnapshot = usingBackendSnapshotFor(snapshotInfo);
    boolean computeClusterSupportsResign = clusterDao.getSupportsResigning(hostVO.getClusterId());
    boolean needCache = needCacheStorage(snapshotInfo, destData);
    DataObject destOnStore = destData;
    if (needCache) {
        // creates an object in the DB for data to be cached
        Scope selectedScope = pickCacheScopeForCopy(snapshotInfo, destData);
        destOnStore = cacheMgr.getCacheObject(snapshotInfo, selectedScope);
        destOnStore.processEvent(Event.CreateOnlyRequested);
    }
    if (usingBackendSnapshot && !computeClusterSupportsResign) {
        String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + hostVO.getClusterId();
        LOGGER.warn(noSupportForResignErrMsg);
        throw new CloudRuntimeException(noSupportForResignErrMsg);
    }
    try {
        if (usingBackendSnapshot) {
            createVolumeFromSnapshot(hostVO, snapshotInfo, true);
        }
        DataStore srcDataStore = snapshotInfo.getDataStore();
        String value = _configDao.getValue(Config.PrimaryStorageDownloadWait.toString());
        int primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue()));
        CopyCommand copyCommand = new CopyCommand(snapshotInfo.getTO(), destOnStore.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value());
        String errMsg = null;
        CopyCmdAnswer copyCmdAnswer = null;
        try {
            // (because we passed in true as the third parameter to createVolumeFromSnapshot above).
            if (!usingBackendSnapshot) {
                _volumeService.grantAccess(snapshotInfo, hostVO, srcDataStore);
            }
            Map<String, String> srcDetails = getSnapshotDetails(snapshotInfo);
            copyCommand.setOptions(srcDetails);
            copyCmdAnswer = (CopyCmdAnswer) _agentMgr.send(hostVO.getId(), copyCommand);
            if (!copyCmdAnswer.getResult()) {
                // We were not able to copy. Handle it.
                errMsg = copyCmdAnswer.getDetails();
                throw new CloudRuntimeException(errMsg);
            }
            if (needCache) {
                // If cached storage was needed (in case of object store as secondary
                // storage), at this point, the data has been copied from the primary
                // to the NFS cache by the hypervisor. We now invoke another copy
                // command to copy this data from cache to secondary storage. We
                // then cleanup the cache
                destOnStore.processEvent(Event.OperationSuccessed, copyCmdAnswer);
                CopyCommand cmd = new CopyCommand(destOnStore.getTO(), destData.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value());
                EndPoint ep = selector.select(destOnStore, destData);
                if (ep == null) {
                    errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
                    LOGGER.error(errMsg);
                    copyCmdAnswer = new CopyCmdAnswer(errMsg);
                } else {
                    copyCmdAnswer = (CopyCmdAnswer) ep.sendMessage(cmd);
                }
                // clean up snapshot copied to staging
                cacheMgr.deleteCacheObject(destOnStore);
            }
        } catch (CloudRuntimeException | AgentUnavailableException | OperationTimedoutException ex) {
            String msg = "Failed to create template from snapshot (Snapshot ID = " + snapshotInfo.getId() + ") : ";
            LOGGER.warn(msg, ex);
            throw new CloudRuntimeException(msg + ex.getMessage());
        } finally {
            _volumeService.revokeAccess(snapshotInfo, hostVO, srcDataStore);
            if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) {
                if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) {
                    errMsg = copyCmdAnswer.getDetails();
                    if (needCache) {
                        cacheMgr.deleteCacheObject(destOnStore);
                    }
                } else {
                    errMsg = "Unable to create template from snapshot";
                }
            }
            try {
                if (StringUtils.isEmpty(errMsg)) {
                    snapshotInfo.processEvent(Event.OperationSuccessed);
                } else {
                    snapshotInfo.processEvent(Event.OperationFailed);
                }
            } catch (Exception ex) {
                LOGGER.warn("Error processing snapshot event: " + ex.getMessage(), ex);
            }
        }
        CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer);
        result.setResult(errMsg);
        callback.complete(result);
    } finally {
        if (usingBackendSnapshot) {
            deleteVolumeFromSnapshot(snapshotInfo);
        }
    }
}
Also used : OperationTimedoutException(com.cloud.exception.OperationTimedoutException) CopyCommand(org.apache.cloudstack.storage.command.CopyCommand) EndPoint(org.apache.cloudstack.engine.subsystem.api.storage.EndPoint) TimeoutException(java.util.concurrent.TimeoutException) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) OperationTimedoutException(com.cloud.exception.OperationTimedoutException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ExecutionException(java.util.concurrent.ExecutionException) HostVO(com.cloud.host.HostVO) EndPoint(org.apache.cloudstack.engine.subsystem.api.storage.EndPoint) DataObject(org.apache.cloudstack.engine.subsystem.api.storage.DataObject) ZoneScope(org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope) Scope(org.apache.cloudstack.engine.subsystem.api.storage.Scope) HostScope(org.apache.cloudstack.engine.subsystem.api.storage.HostScope) ClusterScope(org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) DataStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore) CopyCommandResult(org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer)

Example 2 with CopyCommand

use of org.apache.cloudstack.storage.command.CopyCommand in project cloudstack by apache.

the class StorageSystemDataMotionStrategy method copyImageToVolume.

private CopyCmdAnswer copyImageToVolume(DataObject srcDataObject, VolumeInfo destVolumeInfo, HostVO hostVO) {
    int primaryStorageDownloadWait = StorageManager.PRIMARY_STORAGE_DOWNLOAD_WAIT.value();
    CopyCommand copyCommand = new CopyCommand(srcDataObject.getTO(), destVolumeInfo.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value());
    CopyCmdAnswer copyCmdAnswer;
    try {
        _volumeService.grantAccess(destVolumeInfo, hostVO, destVolumeInfo.getDataStore());
        Map<String, String> destDetails = getVolumeDetails(destVolumeInfo);
        copyCommand.setOptions2(destDetails);
        copyCmdAnswer = (CopyCmdAnswer) agentManager.send(hostVO.getId(), copyCommand);
    } catch (CloudRuntimeException | AgentUnavailableException | OperationTimedoutException ex) {
        String msg = "Failed to copy image : ";
        LOGGER.warn(msg, ex);
        throw new CloudRuntimeException(msg + ex.getMessage(), ex);
    } finally {
        _volumeService.revokeAccess(destVolumeInfo, hostVO, destVolumeInfo.getDataStore());
    }
    VolumeObjectTO volumeObjectTO = (VolumeObjectTO) copyCmdAnswer.getNewData();
    volumeObjectTO.setFormat(ImageFormat.QCOW2);
    return copyCmdAnswer;
}
Also used : OperationTimedoutException(com.cloud.exception.OperationTimedoutException) CopyCommand(org.apache.cloudstack.storage.command.CopyCommand) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) VolumeObjectTO(org.apache.cloudstack.storage.to.VolumeObjectTO) EndPoint(org.apache.cloudstack.engine.subsystem.api.storage.EndPoint) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer)

Example 3 with CopyCommand

use of org.apache.cloudstack.storage.command.CopyCommand in project cloudstack by apache.

the class StorageSystemDataMotionStrategy method handleCreateNonManagedVolumeFromManagedSnapshot.

private void handleCreateNonManagedVolumeFromManagedSnapshot(SnapshotInfo snapshotInfo, VolumeInfo volumeInfo, AsyncCompletionCallback<CopyCommandResult> callback) {
    if (!HypervisorType.XenServer.equals(snapshotInfo.getHypervisorType())) {
        String errMsg = "Creating a volume on non-managed storage from a snapshot on managed storage is currently only supported with XenServer.";
        handleError(errMsg, callback);
    }
    long volumeStoragePoolId = volumeInfo.getDataStore().getId();
    StoragePoolVO volumeStoragePoolVO = _storagePoolDao.findById(volumeStoragePoolId);
    if (volumeStoragePoolVO.getClusterId() == null) {
        String errMsg = "To create a non-managed volume from a managed snapshot, the destination storage pool must be cluster scoped.";
        handleError(errMsg, callback);
    }
    String errMsg = null;
    CopyCmdAnswer copyCmdAnswer = null;
    boolean usingBackendSnapshot = false;
    try {
        snapshotInfo.processEvent(Event.CopyingRequested);
        usingBackendSnapshot = usingBackendSnapshotFor(snapshotInfo);
        if (usingBackendSnapshot) {
            boolean computeClusterSupportsVolumeClone = clusterDao.getSupportsResigning(volumeStoragePoolVO.getClusterId());
            if (!computeClusterSupportsVolumeClone) {
                String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + volumeStoragePoolVO.getClusterId();
                LOGGER.warn(noSupportForResignErrMsg);
                throw new CloudRuntimeException(noSupportForResignErrMsg);
            }
            createVolumeFromSnapshot(snapshotInfo);
            HostVO hostVO = getHost(snapshotInfo.getDataCenterId(), HypervisorType.XenServer, true);
            copyCmdAnswer = performResignature(snapshotInfo, hostVO, null, true);
            verifyCopyCmdAnswer(copyCmdAnswer, snapshotInfo);
        }
        int primaryStorageDownloadWait = StorageManager.PRIMARY_STORAGE_DOWNLOAD_WAIT.value();
        CopyCommand copyCommand = new CopyCommand(snapshotInfo.getTO(), volumeInfo.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value());
        HostVO hostVO = getHostInCluster(volumeStoragePoolVO.getClusterId());
        if (!usingBackendSnapshot) {
            long snapshotStoragePoolId = snapshotInfo.getDataStore().getId();
            DataStore snapshotDataStore = dataStoreMgr.getDataStore(snapshotStoragePoolId, DataStoreRole.Primary);
            _volumeService.grantAccess(snapshotInfo, hostVO, snapshotDataStore);
        }
        Map<String, String> srcDetails = getSnapshotDetails(snapshotInfo);
        copyCommand.setOptions(srcDetails);
        copyCmdAnswer = (CopyCmdAnswer) agentManager.send(hostVO.getId(), copyCommand);
        if (!copyCmdAnswer.getResult()) {
            errMsg = copyCmdAnswer.getDetails();
            LOGGER.warn(errMsg);
            throw new CloudRuntimeException(errMsg);
        }
    } catch (Exception ex) {
        errMsg = "Copy operation failed in 'StorageSystemDataMotionStrategy.handleCreateNonManagedVolumeFromManagedSnapshot': " + ex.getMessage();
        throw new CloudRuntimeException(errMsg);
    } finally {
        try {
            HostVO hostVO = getHostInCluster(volumeStoragePoolVO.getClusterId());
            long snapshotStoragePoolId = snapshotInfo.getDataStore().getId();
            DataStore snapshotDataStore = dataStoreMgr.getDataStore(snapshotStoragePoolId, DataStoreRole.Primary);
            _volumeService.revokeAccess(snapshotInfo, hostVO, snapshotDataStore);
        } catch (Exception e) {
            LOGGER.debug("Failed to revoke access from dest volume", e);
        }
        if (usingBackendSnapshot) {
            deleteVolumeFromSnapshot(snapshotInfo);
        }
        try {
            if (StringUtils.isEmpty(errMsg)) {
                snapshotInfo.processEvent(Event.OperationSuccessed);
            } else {
                snapshotInfo.processEvent(Event.OperationFailed);
            }
        } catch (Exception ex) {
            LOGGER.warn("Error processing snapshot event: " + ex.getMessage(), ex);
        }
        if (copyCmdAnswer == null) {
            copyCmdAnswer = new CopyCmdAnswer(errMsg);
        }
        CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer);
        result.setResult(errMsg);
        callback.complete(result);
    }
}
Also used : CopyCommand(org.apache.cloudstack.storage.command.CopyCommand) HostVO(com.cloud.host.HostVO) EndPoint(org.apache.cloudstack.engine.subsystem.api.storage.EndPoint) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) OperationTimedoutException(com.cloud.exception.OperationTimedoutException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DataStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore) VMTemplateStoragePoolVO(com.cloud.storage.VMTemplateStoragePoolVO) StoragePoolVO(org.apache.cloudstack.storage.datastore.db.StoragePoolVO) CopyCommandResult(org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer)

Example 4 with CopyCommand

use of org.apache.cloudstack.storage.command.CopyCommand in project cloudstack by apache.

the class KVMStorageProcessor method backupSnapshotForObjectStore.

protected Answer backupSnapshotForObjectStore(final CopyCommand cmd) {
    final DataTO destData = cmd.getDestTO();
    final DataStoreTO imageStore = destData.getDataStore();
    final DataTO cacheData = cmd.getCacheTO();
    if (cacheData == null) {
        return new CopyCmdAnswer("Failed to copy to object store without cache store");
    }
    final DataStoreTO cacheStore = cacheData.getDataStore();
    ((SnapshotObjectTO) destData).setDataStore(cacheStore);
    final CopyCmdAnswer answer = (CopyCmdAnswer) backupSnapshot(cmd);
    if (!answer.getResult()) {
        return answer;
    }
    final SnapshotObjectTO snapshotOnCacheStore = (SnapshotObjectTO) answer.getNewData();
    snapshotOnCacheStore.setDataStore(cacheStore);
    ((SnapshotObjectTO) destData).setDataStore(imageStore);
    final CopyCommand newCpyCmd = new CopyCommand(snapshotOnCacheStore, destData, cmd.getWaitInMillSeconds(), cmd.executeInSequence());
    return copyToObjectStore(newCpyCmd);
}
Also used : SnapshotObjectTO(org.apache.cloudstack.storage.to.SnapshotObjectTO) PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) DataStoreTO(com.cloud.agent.api.to.DataStoreTO) DataTO(com.cloud.agent.api.to.DataTO) CopyCommand(org.apache.cloudstack.storage.command.CopyCommand) SnapshotAndCopyCommand(org.apache.cloudstack.storage.command.SnapshotAndCopyCommand) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer)

Example 5 with CopyCommand

use of org.apache.cloudstack.storage.command.CopyCommand in project cloudstack by apache.

the class VmwareStorageSubsystemCommandHandler method execute.

@Override
protected Answer execute(CopyCommand cmd) {
    DataTO srcData = cmd.getSrcTO();
    DataTO destData = cmd.getDestTO();
    DataStoreTO srcDataStore = srcData.getDataStore();
    DataStoreTO destDataStore = destData.getDataStore();
    int timeout = NumbersUtil.parseInt(cmd.getContextParam(VmwareManager.s_vmwareOVAPackageTimeout.key()), Integer.valueOf(VmwareManager.s_vmwareOVAPackageTimeout.defaultValue()) * VmwareManager.s_vmwareOVAPackageTimeout.multiplier());
    // if copied between s3 and nfs cache, go to resource
    boolean needDelegation = false;
    if (destDataStore instanceof NfsTO && destDataStore.getRole() == DataStoreRole.ImageCache) {
        if (srcDataStore instanceof S3TO || srcDataStore instanceof SwiftTO) {
            needDelegation = true;
        }
    }
    if (srcDataStore.getRole() == DataStoreRole.ImageCache && destDataStore.getRole() == DataStoreRole.Image) {
        // need to take extra processing for vmware, such as packing to ova, before sending to S3
        if (srcData.getObjectType() == DataObjectType.VOLUME) {
            NfsTO cacheStore = (NfsTO) srcDataStore;
            String parentPath = storageResource.getRootDir(cacheStore.getUrl(), _nfsVersion);
            VolumeObjectTO vol = (VolumeObjectTO) srcData;
            String path = vol.getPath();
            int index = path.lastIndexOf(File.separator);
            String name = path.substring(index + 1);
            storageManager.createOva(parentPath + File.separator + path, name, timeout);
            vol.setPath(path + File.separator + name + ".ova");
        } else if (srcData.getObjectType() == DataObjectType.TEMPLATE) {
            // sync template from NFS cache to S3 in NFS migration to S3 case
            storageManager.createOvaForTemplate((TemplateObjectTO) srcData, timeout);
        } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT) {
            // pack ova first
            // sync snapshot from NFS cache to S3 in NFS migration to S3 case
            String parentPath = storageResource.getRootDir(srcDataStore.getUrl(), _nfsVersion);
            SnapshotObjectTO snap = (SnapshotObjectTO) srcData;
            String path = snap.getPath();
            int index = path.lastIndexOf(File.separator);
            String name = path.substring(index + 1);
            String snapDir = path.substring(0, index);
            storageManager.createOva(parentPath + File.separator + snapDir, name, timeout);
            if (destData.getObjectType() == DataObjectType.TEMPLATE) {
                // create template from snapshot on src at first, then copy it to s3
                TemplateObjectTO cacheTemplate = (TemplateObjectTO) destData;
                cacheTemplate.setDataStore(srcDataStore);
                CopyCmdAnswer answer = (CopyCmdAnswer) processor.createTemplateFromSnapshot(cmd);
                if (!answer.getResult()) {
                    return answer;
                }
                cacheTemplate.setDataStore(destDataStore);
                TemplateObjectTO template = (TemplateObjectTO) answer.getNewData();
                template.setDataStore(srcDataStore);
                CopyCommand newCmd = new CopyCommand(template, destData, cmd.getWait(), cmd.executeInSequence());
                Answer result = storageResource.defaultAction(newCmd);
                // clean up template data on staging area
                try {
                    DeleteCommand deleteCommand = new DeleteCommand(template);
                    storageResource.defaultAction(deleteCommand);
                } catch (Exception e) {
                    s_logger.debug("Failed to clean up staging area:", e);
                }
                return result;
            }
        }
        needDelegation = true;
    }
    if (srcData.getObjectType() == DataObjectType.SNAPSHOT && srcData.getDataStore().getRole() == DataStoreRole.Primary) {
        // for back up snapshot, we need to do backup to cache, then to object store if object store is used.
        if (cmd.getCacheTO() != null) {
            cmd.setDestTO(cmd.getCacheTO());
            CopyCmdAnswer answer = (CopyCmdAnswer) processor.backupSnapshot(cmd);
            if (!answer.getResult()) {
                return answer;
            }
            NfsTO cacheStore = (NfsTO) cmd.getCacheTO().getDataStore();
            String parentPath = storageResource.getRootDir(cacheStore.getUrl(), _nfsVersion);
            SnapshotObjectTO newSnapshot = (SnapshotObjectTO) answer.getNewData();
            String path = newSnapshot.getPath();
            int index = path.lastIndexOf(File.separator);
            String name = path.substring(index + 1);
            String dir = path.substring(0, index);
            storageManager.createOva(parentPath + File.separator + dir, name, timeout);
            newSnapshot.setPath(newSnapshot.getPath() + ".ova");
            newSnapshot.setDataStore(cmd.getCacheTO().getDataStore());
            CopyCommand newCmd = new CopyCommand(newSnapshot, destData, cmd.getWait(), cmd.executeInSequence());
            Answer result = storageResource.defaultAction(newCmd);
            // clean up data on staging area
            try {
                newSnapshot.setPath(path);
                DeleteCommand deleteCommand = new DeleteCommand(newSnapshot);
                storageResource.defaultAction(deleteCommand);
            } catch (Exception e) {
                s_logger.debug("Failed to clean up staging area:", e);
            }
            return result;
        }
    }
    if (needDelegation) {
        return storageResource.defaultAction(cmd);
    } else {
        return super.execute(cmd);
    }
}
Also used : SnapshotObjectTO(org.apache.cloudstack.storage.to.SnapshotObjectTO) DataStoreTO(com.cloud.agent.api.to.DataStoreTO) SwiftTO(com.cloud.agent.api.to.SwiftTO) CopyCommand(org.apache.cloudstack.storage.command.CopyCommand) NfsTO(com.cloud.agent.api.to.NfsTO) DeleteCommand(org.apache.cloudstack.storage.command.DeleteCommand) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer) Answer(com.cloud.agent.api.Answer) DataTO(com.cloud.agent.api.to.DataTO) VolumeObjectTO(org.apache.cloudstack.storage.to.VolumeObjectTO) TemplateObjectTO(org.apache.cloudstack.storage.to.TemplateObjectTO) S3TO(com.cloud.agent.api.to.S3TO) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer)

Aggregations

CopyCommand (org.apache.cloudstack.storage.command.CopyCommand)29 EndPoint (org.apache.cloudstack.engine.subsystem.api.storage.EndPoint)17 Answer (com.cloud.agent.api.Answer)16 CopyCmdAnswer (org.apache.cloudstack.storage.command.CopyCmdAnswer)14 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)13 DataObject (org.apache.cloudstack.engine.subsystem.api.storage.DataObject)9 AgentUnavailableException (com.cloud.exception.AgentUnavailableException)8 OperationTimedoutException (com.cloud.exception.OperationTimedoutException)8 DataStore (org.apache.cloudstack.engine.subsystem.api.storage.DataStore)8 RemoteHostEndPoint (org.apache.cloudstack.storage.RemoteHostEndPoint)8 CopyCommandResult (org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult)7 ZoneScope (org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope)7 MigrateVolumeAnswer (com.cloud.agent.api.storage.MigrateVolumeAnswer)6 DataStoreTO (com.cloud.agent.api.to.DataStoreTO)6 DataTO (com.cloud.agent.api.to.DataTO)6 NfsTO (com.cloud.agent.api.to.NfsTO)6 HostVO (com.cloud.host.HostVO)6 TemplateObjectTO (org.apache.cloudstack.storage.to.TemplateObjectTO)6 ClusterScope (org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope)5 HostScope (org.apache.cloudstack.engine.subsystem.api.storage.HostScope)5