Search in sources :

Example 21 with Task

use of com.xensource.xenapi.Task in project cloudstack by apache.

the class Xenserver625StorageProcessor method copyTemplateToPrimaryStorage.

@Override
public Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) {
    final DataTO srcData = cmd.getSrcTO();
    final DataTO destData = cmd.getDestTO();
    final int wait = cmd.getWait();
    final DataStoreTO srcStore = srcData.getDataStore();
    final Connection conn = hypervisorResource.getConnection();
    SR srcSr = null;
    SR destSr = null;
    boolean removeSrAfterCopy = false;
    Task task = null;
    try {
        if (srcStore instanceof NfsTO && srcData.getObjectType() == DataObjectType.TEMPLATE) {
            final NfsTO srcImageStore = (NfsTO) srcStore;
            final TemplateObjectTO srcTemplate = (TemplateObjectTO) srcData;
            final String storeUrl = srcImageStore.getUrl();
            final URI uri = new URI(storeUrl);
            String volumePath = srcData.getPath();
            volumePath = StringUtils.stripEnd(volumePath, "/");
            final String[] splits = volumePath.split("/");
            String volumeDirectory = volumePath;
            if (splits.length > 4) {
                // "template/tmpl/dcid/templateId/templatename"
                final int index = volumePath.lastIndexOf("/");
                volumeDirectory = volumePath.substring(0, index);
            }
            srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory);
            final Set<VDI> setVdis = srcSr.getVDIs(conn);
            if (setVdis.size() != 1) {
                return new CopyCmdAnswer("Expected 1 VDI template, but found " + setVdis.size() + " VDI templates on: " + uri.getHost() + ":" + uri.getPath() + "/" + volumeDirectory);
            }
            final VDI srcVdi = setVdis.iterator().next();
            boolean managed = false;
            String storageHost = null;
            String managedStoragePoolName = null;
            String managedStoragePoolRootVolumeName = null;
            String managedStoragePoolRootVolumeSize = null;
            String chapInitiatorUsername = null;
            String chapInitiatorSecret = null;
            final PrimaryDataStoreTO destStore = (PrimaryDataStoreTO) destData.getDataStore();
            Map<String, String> details = destStore.getDetails();
            if (details != null) {
                managed = Boolean.parseBoolean(details.get(PrimaryDataStoreTO.MANAGED));
                if (managed) {
                    storageHost = details.get(PrimaryDataStoreTO.STORAGE_HOST);
                    managedStoragePoolName = details.get(PrimaryDataStoreTO.MANAGED_STORE_TARGET);
                    managedStoragePoolRootVolumeName = details.get(PrimaryDataStoreTO.MANAGED_STORE_TARGET_ROOT_VOLUME);
                    managedStoragePoolRootVolumeSize = details.get(PrimaryDataStoreTO.VOLUME_SIZE);
                    chapInitiatorUsername = details.get(PrimaryDataStoreTO.CHAP_INITIATOR_USERNAME);
                    chapInitiatorSecret = details.get(PrimaryDataStoreTO.CHAP_INITIATOR_SECRET);
                    removeSrAfterCopy = Boolean.parseBoolean(details.get(PrimaryDataStoreTO.REMOVE_AFTER_COPY));
                }
            }
            if (managed) {
                details = new HashMap<String, String>();
                details.put(DiskTO.STORAGE_HOST, storageHost);
                details.put(DiskTO.IQN, managedStoragePoolName);
                details.put(DiskTO.VOLUME_SIZE, managedStoragePoolRootVolumeSize);
                details.put(DiskTO.CHAP_INITIATOR_USERNAME, chapInitiatorUsername);
                details.put(DiskTO.CHAP_INITIATOR_SECRET, chapInitiatorSecret);
                destSr = hypervisorResource.prepareManagedSr(conn, details);
            } else {
                final String srName = destStore.getUuid();
                final Set<SR> srs = SR.getByNameLabel(conn, srName);
                if (srs.size() != 1) {
                    final String msg = "There are " + srs.size() + " SRs with same name: " + srName;
                    s_logger.warn(msg);
                    return new CopyCmdAnswer(msg);
                } else {
                    destSr = srs.iterator().next();
                }
            }
            task = srcVdi.copyAsync(conn, destSr, null, null);
            // poll every 1 seconds ,
            hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
            hypervisorResource.checkForSuccess(conn, task);
            final VDI tmplVdi = Types.toVDI(task, conn);
            final String uuidToReturn;
            final Long physicalSize = tmplVdi.getPhysicalUtilisation(conn);
            if (managed) {
                uuidToReturn = tmplVdi.getUuid(conn);
                tmplVdi.setNameLabel(conn, managedStoragePoolRootVolumeName);
            } else {
                final VDI snapshotVdi = tmplVdi.snapshot(conn, new HashMap<String, String>());
                uuidToReturn = snapshotVdi.getUuid(conn);
                snapshotVdi.setNameLabel(conn, "Template " + srcTemplate.getName());
                tmplVdi.destroy(conn);
            }
            destSr.scan(conn);
            try {
                Thread.sleep(5000);
            } catch (final Exception e) {
            }
            final TemplateObjectTO newVol = new TemplateObjectTO();
            newVol.setUuid(uuidToReturn);
            newVol.setPath(uuidToReturn);
            if (physicalSize != null) {
                newVol.setSize(physicalSize);
            }
            newVol.setFormat(Storage.ImageFormat.VHD);
            return new CopyCmdAnswer(newVol);
        }
    } catch (final Exception e) {
        final String msg = "Catch Exception " + e.getClass().getName() + " for template due to " + e.toString();
        s_logger.warn(msg, e);
        return new CopyCmdAnswer(msg);
    } finally {
        if (task != null) {
            try {
                task.destroy(conn);
            } catch (final Exception e) {
                s_logger.debug("unable to destroy task (" + task.toWireString() + ") due to " + e.toString());
            }
        }
        if (srcSr != null) {
            hypervisorResource.removeSR(conn, srcSr);
        }
        if (removeSrAfterCopy && destSr != null) {
            hypervisorResource.removeSR(conn, destSr);
        }
    }
    return new CopyCmdAnswer("not implemented yet");
}
Also used : DataStoreTO(com.cloud.agent.api.to.DataStoreTO) PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) Task(com.xensource.xenapi.Task) Connection(com.xensource.xenapi.Connection) NfsTO(com.cloud.agent.api.to.NfsTO) URI(java.net.URI) InternalErrorException(com.cloud.exception.InternalErrorException) XmlRpcException(org.apache.xmlrpc.XmlRpcException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) XenAPIException(com.xensource.xenapi.Types.XenAPIException) DataTO(com.cloud.agent.api.to.DataTO) PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) VDI(com.xensource.xenapi.VDI) TemplateObjectTO(org.apache.cloudstack.storage.to.TemplateObjectTO) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer) SR(com.xensource.xenapi.SR)

Aggregations

Task (com.xensource.xenapi.Task)21 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)17 XenAPIException (com.xensource.xenapi.Types.XenAPIException)16 XmlRpcException (org.apache.xmlrpc.XmlRpcException)16 InternalErrorException (com.cloud.exception.InternalErrorException)15 VDI (com.xensource.xenapi.VDI)14 SR (com.xensource.xenapi.SR)13 Connection (com.xensource.xenapi.Connection)12 Types (com.xensource.xenapi.Types)10 TimeoutException (java.util.concurrent.TimeoutException)8 NfsTO (com.cloud.agent.api.to.NfsTO)7 IOException (java.io.IOException)7 MalformedURLException (java.net.MalformedURLException)7 URI (java.net.URI)7 URISyntaxException (java.net.URISyntaxException)7 HashMap (java.util.HashMap)7 ConfigurationException (javax.naming.ConfigurationException)7 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)7 CopyCmdAnswer (org.apache.cloudstack.storage.command.CopyCmdAnswer)7 SAXException (org.xml.sax.SAXException)7