Search in sources :

Example 1 with SwiftTO

use of com.cloud.agent.api.to.SwiftTO 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();
    //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);
            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);
        } 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);
            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);
            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)

Example 2 with SwiftTO

use of com.cloud.agent.api.to.SwiftTO in project cloudstack by apache.

the class SwiftImageStoreDriverImpl method createEntityExtractUrl.

@Override
public String createEntityExtractUrl(DataStore store, String installPath, ImageFormat format, DataObject dataObject) {
    SwiftTO swiftTO = (SwiftTO) store.getTO();
    String tempKey = UUID.randomUUID().toString();
    boolean result = SwiftUtil.setTempKey(swiftTO, tempKey);
    if (!result) {
        String errMsg = "Unable to set Temp-Key: " + tempKey;
        s_logger.error(errMsg);
        throw new CloudRuntimeException(errMsg);
    }
    String containerName = SwiftUtil.getContainerName(dataObject.getType().toString(), dataObject.getId());
    String objectName = installPath.split("\\/")[1];
    // Get extract url expiration interval set in global configuration (in seconds)
    int urlExpirationInterval = Integer.parseInt(_configDao.getValue(Config.ExtractURLExpirationInterval.toString()));
    URL swiftUrl = SwiftUtil.generateTempUrl(swiftTO, containerName, objectName, tempKey, urlExpirationInterval);
    if (swiftUrl != null) {
        s_logger.debug("Swift temp-url: " + swiftUrl.toString());
        return swiftUrl.toString();
    }
    throw new CloudRuntimeException("Unable to create extraction URL");
}
Also used : SwiftTO(com.cloud.agent.api.to.SwiftTO) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) EndPoint(org.apache.cloudstack.engine.subsystem.api.storage.EndPoint) URL(java.net.URL)

Example 3 with SwiftTO

use of com.cloud.agent.api.to.SwiftTO in project cloudstack by apache.

the class BackupSnapshotCommandTest method testGetSwift.

@Test
public void testGetSwift() {
    SwiftTO s1 = new SwiftTO();
    bsc.setSwift(s1);
    SwiftTO s2 = bsc.getSwift();
    assertEquals(s1, s2);
}
Also used : SwiftTO(com.cloud.agent.api.to.SwiftTO) Test(org.junit.Test)

Example 4 with SwiftTO

use of com.cloud.agent.api.to.SwiftTO in project cloudstack by apache.

the class NfsSecondaryStorageResource method deleteVolume.

protected Answer deleteVolume(final DeleteCommand cmd) {
    DataTO obj = cmd.getData();
    DataStoreTO dstore = obj.getDataStore();
    if (dstore instanceof NfsTO) {
        NfsTO nfs = (NfsTO) dstore;
        String relativeVolumePath = obj.getPath();
        String parent = getRootDir(nfs.getUrl(), _nfsVersion);
        if (relativeVolumePath.startsWith(File.separator)) {
            relativeVolumePath = relativeVolumePath.substring(1);
        }
        if (!parent.endsWith(File.separator)) {
            parent += File.separator;
        }
        String absoluteVolumePath = parent + relativeVolumePath;
        File volPath = new File(absoluteVolumePath);
        File tmpltParent = null;
        if (volPath.exists() && volPath.isDirectory()) {
            // for vmware, absoluteVolumePath represents a directory where volume files are located.
            tmpltParent = volPath;
        } else {
            // for other hypervisors, the volume .vhd or .qcow2 file path is passed
            tmpltParent = new File(absoluteVolumePath).getParentFile();
        }
        String details = null;
        if (!tmpltParent.exists()) {
            details = "volume parent directory " + tmpltParent.getName() + " doesn't exist";
            s_logger.debug(details);
            return new Answer(cmd, true, details);
        }
        File[] tmpltFiles = tmpltParent.listFiles();
        if (tmpltFiles == null || tmpltFiles.length == 0) {
            details = "No files under volume parent directory " + tmpltParent.getName();
            s_logger.debug(details);
        } else {
            boolean found = false;
            for (File f : tmpltFiles) {
                if (!found && f.getName().equals("volume.properties")) {
                    found = true;
                }
                // Don't let this stop us from cleaning up the template
                if (f.isDirectory() && f.getName().equals("KVMHA")) {
                    s_logger.debug("Deleting KVMHA directory contents from template location");
                    File[] haFiles = f.listFiles();
                    for (File haFile : haFiles) {
                        haFile.delete();
                    }
                }
                if (!f.delete()) {
                    return new Answer(cmd, false, "Unable to delete file " + f.getName() + " under Volume path " + tmpltParent.getPath());
                }
            }
            if (!found) {
                details = "Can not find volume.properties under " + tmpltParent.getName();
                s_logger.debug(details);
            }
        }
        if (!tmpltParent.delete()) {
            details = "Unable to delete directory " + tmpltParent.getName() + " under Volume path " + tmpltParent.getPath();
            s_logger.debug(details);
            return new Answer(cmd, false, details);
        }
        return new Answer(cmd, true, null);
    } else if (dstore instanceof S3TO) {
        final S3TO s3 = (S3TO) dstore;
        final String path = obj.getPath();
        final String bucket = s3.getBucketName();
        try {
            S3Utils.deleteDirectory(s3, bucket, path);
            return new Answer(cmd, true, String.format("Deleted volume %1%s from bucket %2$s.", path, bucket));
        } catch (Exception e) {
            final String errorMessage = String.format("Failed to delete volume %1$s from bucket %2$s due to the following error: %3$s", path, bucket, e.getMessage());
            s_logger.error(errorMessage, e);
            return new Answer(cmd, false, errorMessage);
        }
    } else if (dstore instanceof SwiftTO) {
        Long volumeId = obj.getId();
        String path = obj.getPath();
        // assuming
        String filename = StringUtils.substringAfterLast(path, "/");
        // that
        // the
        // filename
        // is
        // the
        // last
        // section
        // in
        // the
        // path
        String result = swiftDelete((SwiftTO) dstore, "V-" + volumeId.toString(), filename);
        if (result != null) {
            String errMsg = "failed to delete volume " + filename + " , err=" + result;
            s_logger.warn(errMsg);
            return new Answer(cmd, false, errMsg);
        }
        return new Answer(cmd, true, "Deleted volume " + path + " from swift");
    } else {
        return new Answer(cmd, false, "Unsupported image data store: " + dstore);
    }
}
Also used : ListTemplateAnswer(com.cloud.agent.api.storage.ListTemplateAnswer) UploadStatusAnswer(org.apache.cloudstack.storage.command.UploadStatusAnswer) GetStorageStatsAnswer(com.cloud.agent.api.GetStorageStatsAnswer) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer) ListVolumeAnswer(com.cloud.agent.api.storage.ListVolumeAnswer) DownloadAnswer(com.cloud.agent.api.storage.DownloadAnswer) Answer(com.cloud.agent.api.Answer) CheckHealthAnswer(com.cloud.agent.api.CheckHealthAnswer) ReadyAnswer(com.cloud.agent.api.ReadyAnswer) SecStorageSetupAnswer(com.cloud.agent.api.SecStorageSetupAnswer) DataStoreTO(com.cloud.agent.api.to.DataStoreTO) DataTO(com.cloud.agent.api.to.DataTO) SwiftTO(com.cloud.agent.api.to.SwiftTO) NfsTO(com.cloud.agent.api.to.NfsTO) File(java.io.File) S3Utils.putFile(com.cloud.utils.storage.S3.S3Utils.putFile) S3TO(com.cloud.agent.api.to.S3TO) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) InternalErrorException(com.cloud.exception.InternalErrorException) ConfigurationException(javax.naming.ConfigurationException)

Example 5 with SwiftTO

use of com.cloud.agent.api.to.SwiftTO in project cloudstack by apache.

the class NfsSecondaryStorageResource method registerTemplateOnSwift.

protected Answer registerTemplateOnSwift(DownloadCommand cmd) {
    SwiftTO swiftTO = (SwiftTO) cmd.getDataStore();
    String path = cmd.getInstallPath();
    DataStoreTO cacheStore = cmd.getCacheStore();
    if (cacheStore == null || !(cacheStore instanceof NfsTO)) {
        return new DownloadAnswer("cache store can't be null", VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR);
    }
    File file = null;
    try {
        NfsTO nfsCacheStore = (NfsTO) cacheStore;
        String fileName = cmd.getName() + "." + cmd.getFormat().getFileExtension();
        file = downloadFromUrlToNfs(cmd.getUrl(), nfsCacheStore, path, fileName);
        String container = "T-" + cmd.getId();
        String swiftPath = SwiftUtil.putObject(swiftTO, file, container, null);
        long virtualSize = getVirtualSize(file, getTemplateFormat(file.getName()));
        long size = file.length();
        String uniqueName = cmd.getName();
        //put metda file
        File uniqDir = _storage.createUniqDir();
        String metaFileName = uniqDir.getAbsolutePath() + File.separator + _tmpltpp;
        _storage.create(uniqDir.getAbsolutePath(), _tmpltpp);
        File metaFile = swiftWriteMetadataFile(metaFileName, uniqueName, fileName, size, virtualSize);
        SwiftUtil.putObject(swiftTO, metaFile, container, _tmpltpp);
        metaFile.delete();
        uniqDir.delete();
        String md5sum = null;
        try (FileInputStream fs = new FileInputStream(file)) {
            md5sum = DigestUtils.md5Hex(fs);
        } catch (IOException e) {
            s_logger.debug("Failed to get md5sum: " + file.getAbsoluteFile());
        }
        DownloadAnswer answer = new DownloadAnswer(null, 100, null, VMTemplateStorageResourceAssoc.Status.DOWNLOADED, swiftPath, swiftPath, virtualSize, file.length(), md5sum);
        return answer;
    } catch (IOException e) {
        s_logger.debug("Failed to register template into swift", e);
        return new DownloadAnswer(e.toString(), VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR);
    } finally {
        if (file != null) {
            file.delete();
        }
    }
}
Also used : DataStoreTO(com.cloud.agent.api.to.DataStoreTO) SwiftTO(com.cloud.agent.api.to.SwiftTO) IOException(java.io.IOException) DownloadAnswer(com.cloud.agent.api.storage.DownloadAnswer) NfsTO(com.cloud.agent.api.to.NfsTO) File(java.io.File) S3Utils.putFile(com.cloud.utils.storage.S3.S3Utils.putFile) FileInputStream(java.io.FileInputStream)

Aggregations

SwiftTO (com.cloud.agent.api.to.SwiftTO)18 DataStoreTO (com.cloud.agent.api.to.DataStoreTO)14 NfsTO (com.cloud.agent.api.to.NfsTO)13 S3TO (com.cloud.agent.api.to.S3TO)12 CopyCmdAnswer (org.apache.cloudstack.storage.command.CopyCmdAnswer)12 DataTO (com.cloud.agent.api.to.DataTO)10 DownloadAnswer (com.cloud.agent.api.storage.DownloadAnswer)8 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)8 Answer (com.cloud.agent.api.Answer)7 GetStorageStatsAnswer (com.cloud.agent.api.GetStorageStatsAnswer)7 ListTemplateAnswer (com.cloud.agent.api.storage.ListTemplateAnswer)7 InternalErrorException (com.cloud.exception.InternalErrorException)7 CheckHealthAnswer (com.cloud.agent.api.CheckHealthAnswer)6 ReadyAnswer (com.cloud.agent.api.ReadyAnswer)6 SecStorageSetupAnswer (com.cloud.agent.api.SecStorageSetupAnswer)6 ListVolumeAnswer (com.cloud.agent.api.storage.ListVolumeAnswer)6 S3Utils.putFile (com.cloud.utils.storage.S3.S3Utils.putFile)6 File (java.io.File)6 IOException (java.io.IOException)6 UploadStatusAnswer (org.apache.cloudstack.storage.command.UploadStatusAnswer)6