Search in sources :

Example 96 with VmwareContext

use of com.cloud.hypervisor.vmware.util.VmwareContext in project cloudstack by apache.

the class VmwareStorageProcessor method takeDownManagedStorageCopyTemplateFromSnapshot.

private void takeDownManagedStorageCopyTemplateFromSnapshot(CopyCommand cmd) throws Exception {
    VmwareContext context = hostService.getServiceContext(cmd);
    VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, cmd);
    ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
    ClusterMO clusterMO = new ClusterMO(context, morCluster);
    List<Pair<ManagedObjectReference, String>> lstHosts = clusterMO.getClusterHosts();
    final Map<String, String> options = cmd.getOptions();
    final String storageHost = options.get(DiskTO.STORAGE_HOST);
    final int storagePortNumber = Integer.parseInt(options.get(DiskTO.STORAGE_PORT));
    final String iScsiName = options.get(DiskTO.IQN);
    final String snapshotPath = options.get(DiskTO.VMDK);
    String datastoreName = getManagedDatastoreNameFromPath(snapshotPath);
    unmountVmfsDatastore(context, hyperHost, datastoreName, lstHosts);
    HostDiscoveryMethod hostDiscoveryMethod = getHostDiscoveryMethod(context, storageHost, lstHosts);
    List<HostMO> hostsUsingStaticDiscovery = hostDiscoveryMethod.getHostsUsingStaticDiscovery();
    if (hostsUsingStaticDiscovery != null && hostsUsingStaticDiscovery.size() > 0) {
        final List<HostInternetScsiHbaStaticTarget> lstTargets = getTargets(storageHost, storagePortNumber, trimIqn(iScsiName), null, null, null, null);
        addRemoveInternetScsiTargetsToAllHosts(false, lstTargets, hostsUsingStaticDiscovery);
        rescanAllHosts(context, lstHosts, true, false);
    }
}
Also used : HostMO(com.cloud.hypervisor.vmware.mo.HostMO) HostInternetScsiHbaStaticTarget(com.vmware.vim25.HostInternetScsiHbaStaticTarget) VmwareHypervisorHost(com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost) ClusterMO(com.cloud.hypervisor.vmware.mo.ClusterMO) VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference) Pair(com.cloud.utils.Pair)

Example 97 with VmwareContext

use of com.cloud.hypervisor.vmware.util.VmwareContext in project cloudstack by apache.

the class VmwareStorageProcessor method exportManagedStorageSnapshotToTemplate.

private void exportManagedStorageSnapshotToTemplate(CopyCommand cmd, String installFullPath, String snapshotPath, String exportName) throws Exception {
    DatastoreFile dsFile = new DatastoreFile(snapshotPath);
    VmwareContext context = hostService.getServiceContext(cmd);
    VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
    ManagedObjectReference dsMor = hyperHost.findDatastoreByName(dsFile.getDatastoreName());
    DatastoreMO dsMo = new DatastoreMO(context, dsMor);
    String workerVMName = hostService.getWorkerName(context, cmd, 0, dsMo);
    VirtualMachineMO workerVM = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName, null);
    if (workerVM == null) {
        throw new CloudRuntimeException("Failed to find the newly created worker VM: " + workerVMName);
    }
    workerVM.attachDisk(new String[] { snapshotPath }, dsMor);
    workerVM.exportVm(installFullPath, exportName, false, false);
    workerVM.detachAllDisksAndDestroy();
}
Also used : VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) DatastoreFile(com.cloud.hypervisor.vmware.mo.DatastoreFile) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VirtualMachineMO(com.cloud.hypervisor.vmware.mo.VirtualMachineMO) VmwareHypervisorHost(com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost) DatastoreMO(com.cloud.hypervisor.vmware.mo.DatastoreMO) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference)

Example 98 with VmwareContext

use of com.cloud.hypervisor.vmware.util.VmwareContext in project cloudstack by apache.

the class VmwareStorageProcessor method createVolume.

@Override
public Answer createVolume(CreateObjectCommand cmd) {
    VolumeObjectTO volume = (VolumeObjectTO) cmd.getData();
    DataStoreTO primaryStore = volume.getDataStore();
    String vSphereStoragePolicyId = volume.getvSphereStoragePolicyId();
    try {
        VmwareContext context = hostService.getServiceContext(null);
        VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
        DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
        ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, primaryStore.getUuid());
        if (morDatastore == null) {
            throw new Exception("Unable to find datastore in vSphere");
        }
        DatastoreMO dsMo = new DatastoreMO(context, morDatastore);
        // create data volume
        VirtualMachineMO vmMo = null;
        String volumeUuid = UUID.randomUUID().toString().replace("-", "");
        String volumeDatastorePath = VmwareStorageLayoutHelper.getDatastorePathBaseFolderFromVmdkFileName(dsMo, volumeUuid + ".vmdk");
        VolumeObjectTO newVol = new VolumeObjectTO();
        try {
            VirtualStorageObjectManagerMO vStorageObjectManagerMO = new VirtualStorageObjectManagerMO(context);
            VStorageObject virtualDisk = vStorageObjectManagerMO.createDisk(morDatastore, volume.getProvisioningType(), volume.getSize(), volumeDatastorePath, volumeUuid);
            DatastoreFile file = new DatastoreFile(((BaseConfigInfoDiskFileBackingInfo) virtualDisk.getConfig().getBacking()).getFilePath());
            newVol.setPath(file.getFileBaseName());
            newVol.setSize(volume.getSize());
        } catch (Exception e) {
            s_logger.debug("Create disk using vStorageObject manager failed due to exception " + e.getMessage() + ", retying using worker VM");
            String dummyVmName = hostService.getWorkerName(context, cmd, 0, dsMo);
            try {
                s_logger.info("Create worker VM " + dummyVmName);
                vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName, null);
                if (vmMo == null) {
                    throw new Exception("Unable to create a dummy VM for volume creation");
                }
                synchronized (this) {
                    try {
                        vmMo.createDisk(volumeDatastorePath, (int) (volume.getSize() / (1024L * 1024L)), morDatastore, vmMo.getScsiDeviceControllerKey(), vSphereStoragePolicyId);
                        vmMo.detachDisk(volumeDatastorePath, false);
                    } catch (Exception e1) {
                        s_logger.error("Deleting file " + volumeDatastorePath + " due to error: " + e1.getMessage());
                        VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, volumeUuid, dcMo, VmwareManager.s_vmwareSearchExcludeFolder.value());
                        throw new CloudRuntimeException("Unable to create volume due to: " + e1.getMessage());
                    }
                }
                newVol = new VolumeObjectTO();
                newVol.setPath(volumeUuid);
                newVol.setSize(volume.getSize());
                return new CreateObjectAnswer(newVol);
            } finally {
                s_logger.info("Destroy dummy VM after volume creation");
                if (vmMo != null) {
                    vmMo.detachAllDisksAndDestroy();
                }
            }
        }
        return new CreateObjectAnswer(newVol);
    } catch (Throwable e) {
        return new CreateObjectAnswer(hostService.createLogMessageException(e, cmd));
    }
}
Also used : VirtualStorageObjectManagerMO(com.cloud.hypervisor.vmware.mo.VirtualStorageObjectManagerMO) PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) DataStoreTO(com.cloud.agent.api.to.DataStoreTO) VirtualMachineMO(com.cloud.hypervisor.vmware.mo.VirtualMachineMO) CreateObjectAnswer(org.apache.cloudstack.storage.command.CreateObjectAnswer) VmwareHypervisorHost(com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) RemoteException(java.rmi.RemoteException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) DatastoreMO(com.cloud.hypervisor.vmware.mo.DatastoreMO) VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) DatastoreFile(com.cloud.hypervisor.vmware.mo.DatastoreFile) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VolumeObjectTO(org.apache.cloudstack.storage.to.VolumeObjectTO) DatacenterMO(com.cloud.hypervisor.vmware.mo.DatacenterMO) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference) VStorageObject(com.vmware.vim25.VStorageObject)

Example 99 with VmwareContext

use of com.cloud.hypervisor.vmware.util.VmwareContext in project cloudstack by apache.

the class VmwareStorageProcessor method syncVolumePath.

@Override
public Answer syncVolumePath(SyncVolumePathCommand cmd) {
    DiskTO disk = cmd.getDisk();
    VolumeObjectTO volumeTO = (VolumeObjectTO) disk.getData();
    DataStoreTO primaryStore = volumeTO.getDataStore();
    String volumePath = volumeTO.getPath();
    String vmName = volumeTO.getVmName();
    boolean datastoreChangeObserved = false;
    boolean volumePathChangeObserved = false;
    String chainInfo = null;
    try {
        VmwareContext context = hostService.getServiceContext(null);
        VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
        VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName);
        if (vmMo == null) {
            vmMo = hyperHost.findVmOnPeerHyperHost(vmName);
            if (vmMo == null) {
                String msg = "Unable to find the VM to execute SyncVolumePathCommand, vmName: " + vmName;
                s_logger.error(msg);
                throw new Exception(msg);
            }
        }
        String datastoreUUID = primaryStore.getUuid();
        if (disk.getDetails().get(DiskTO.PROTOCOL_TYPE) != null && disk.getDetails().get(DiskTO.PROTOCOL_TYPE).equalsIgnoreCase("DatastoreCluster")) {
            VirtualMachineDiskInfo matchingExistingDisk = getMatchingExistingDisk(hyperHost, context, vmMo, disk);
            VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
            if (diskInfoBuilder != null && matchingExistingDisk != null) {
                String[] diskChain = matchingExistingDisk.getDiskChain();
                assert (diskChain.length > 0);
                DatastoreFile file = new DatastoreFile(diskChain[0]);
                if (!file.getFileBaseName().equalsIgnoreCase(volumePath)) {
                    if (s_logger.isInfoEnabled())
                        s_logger.info("Detected disk-chain top file change on volume: " + volumeTO.getId() + " " + volumePath + " -> " + file.getFileBaseName());
                    volumePathChangeObserved = true;
                    volumePath = file.getFileBaseName();
                    volumeTO.setPath(volumePath);
                    chainInfo = _gson.toJson(matchingExistingDisk);
                }
                DatastoreMO diskDatastoreMofromVM = getDiskDatastoreMofromVM(hyperHost, context, vmMo, disk, diskInfoBuilder);
                if (diskDatastoreMofromVM != null) {
                    String actualPoolUuid = diskDatastoreMofromVM.getCustomFieldValue(CustomFieldConstants.CLOUD_UUID);
                    if (!actualPoolUuid.equalsIgnoreCase(primaryStore.getUuid())) {
                        s_logger.warn(String.format("Volume %s found to be in a different storage pool %s", volumePath, actualPoolUuid));
                        datastoreChangeObserved = true;
                        datastoreUUID = actualPoolUuid;
                        chainInfo = _gson.toJson(matchingExistingDisk);
                    }
                }
            }
        }
        SyncVolumePathAnswer answer = new SyncVolumePathAnswer(disk);
        if (datastoreChangeObserved) {
            answer.setContextParam("datastoreName", datastoreUUID);
        }
        if (volumePathChangeObserved) {
            answer.setContextParam("volumePath", volumePath);
        }
        if (chainInfo != null && !chainInfo.isEmpty()) {
            answer.setContextParam("chainInfo", chainInfo);
        }
        return answer;
    } catch (Throwable e) {
        return new SyncVolumePathAnswer(hostService.createLogMessageException(e, cmd));
    }
}
Also used : PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) DataStoreTO(com.cloud.agent.api.to.DataStoreTO) VirtualMachineMO(com.cloud.hypervisor.vmware.mo.VirtualMachineMO) VirtualMachineDiskInfoBuilder(com.cloud.hypervisor.vmware.mo.VirtualMachineDiskInfoBuilder) VmwareHypervisorHost(com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) RemoteException(java.rmi.RemoteException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) DatastoreMO(com.cloud.hypervisor.vmware.mo.DatastoreMO) SyncVolumePathAnswer(org.apache.cloudstack.storage.command.SyncVolumePathAnswer) VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) DatastoreFile(com.cloud.hypervisor.vmware.mo.DatastoreFile) VirtualMachineDiskInfo(org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo) VolumeObjectTO(org.apache.cloudstack.storage.to.VolumeObjectTO) DiskTO(com.cloud.agent.api.to.DiskTO)

Example 100 with VmwareContext

use of com.cloud.hypervisor.vmware.util.VmwareContext in project cloudstack by apache.

the class VmwareStorageProcessor method cloneVolumeFromBaseTemplate.

@Override
public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
    DataTO srcData = cmd.getSrcTO();
    TemplateObjectTO template = (TemplateObjectTO) srcData;
    DataTO destData = cmd.getDestTO();
    VolumeObjectTO volume = (VolumeObjectTO) destData;
    DataStoreTO primaryStore = volume.getDataStore();
    DataStoreTO srcStore = template.getDataStore();
    String searchExcludedFolders = cmd.getContextParam("searchexludefolders");
    try {
        VmwareContext context = hostService.getServiceContext(null);
        VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
        DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
        VirtualMachineMO vmMo = null;
        ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, primaryStore.getUuid());
        if (morDatastore == null) {
            throw new Exception("Unable to find datastore in vSphere");
        }
        DatastoreMO dsMo = new DatastoreMO(context, morDatastore);
        String vmdkName = volume.getName();
        String vmName = volume.getVmName();
        String vmdkFileBaseName = null;
        if (template.isDeployAsIs() && volume.getVolumeType() == Volume.Type.ROOT) {
            VirtualMachineMO existingVm = dcMo.findVm(vmName);
            if (volume.getDeviceId().equals(0L)) {
                if (existingVm != null) {
                    s_logger.info(String.format("Found existing VM wth name [%s] before cloning from template, destroying it", vmName));
                    existingVm.detachAllDisksAndDestroy();
                }
                s_logger.info("ROOT Volume from deploy-as-is template, cloning template");
                cloneVMFromTemplate(hyperHost, template.getPath(), vmName, primaryStore.getUuid());
            } else {
                s_logger.info("ROOT Volume from deploy-as-is template, volume already created at this point");
            }
        } else {
            if (srcStore == null) {
                // create a root volume for blank VM (created from ISO)
                String dummyVmName = hostService.getWorkerName(context, cmd, 0, dsMo);
                try {
                    vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName, null);
                    if (vmMo == null) {
                        throw new Exception("Unable to create a dummy VM for volume creation");
                    }
                    vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
                    // we only use the first file in the pair, linked or not will not matter
                    String[] vmdkFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true);
                    String volumeDatastorePath = vmdkFilePair[0];
                    synchronized (this) {
                        s_logger.info("Delete file if exists in datastore to clear the way for creating the volume. file: " + volumeDatastorePath);
                        VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, vmdkName, dcMo, searchExcludedFolders);
                        vmMo.createDisk(volumeDatastorePath, (long) (volume.getSize() / (1024L * 1024L)), morDatastore, -1, null);
                        vmMo.detachDisk(volumeDatastorePath, false);
                    }
                } finally {
                    s_logger.info("Destroy dummy VM after volume creation");
                    if (vmMo != null) {
                        s_logger.warn("Unable to destroy a null VM ManagedObjectReference");
                        vmMo.detachAllDisksAndDestroy();
                    }
                }
            } else {
                String templatePath = template.getPath();
                VirtualMachineMO vmTemplate = VmwareHelper.pickOneVmOnRunningHost(dcMo.findVmByNameAndLabel(templatePath), true);
                if (vmTemplate == null) {
                    s_logger.warn("Template host in vSphere is not in connected state, request template reload");
                    return new CopyCmdAnswer("Template host in vSphere is not in connected state, request template reload");
                }
                if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
                    vmdkFileBaseName = cloneVMforVvols(context, hyperHost, template, vmTemplate, volume, dcMo, dsMo);
                } else {
                    vmdkFileBaseName = createVMAndFolderWithVMName(context, hyperHost, template, vmTemplate, volume, dcMo, dsMo, searchExcludedFolders);
                }
            }
            // restoreVM - move the new ROOT disk into corresponding VM folder
            VirtualMachineMO restoreVmMo = dcMo.findVm(volume.getVmName());
            if (restoreVmMo != null) {
                if (!dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
                    // VM folder name in datastore will be VM's name in vCenter.
                    String vmNameInVcenter = restoreVmMo.getName();
                    if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmNameInVcenter)) {
                        VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmNameInVcenter, dsMo, vmdkFileBaseName, searchExcludedFolders);
                    }
                }
            }
        }
        VolumeObjectTO newVol = new VolumeObjectTO();
        newVol.setPath(vmdkFileBaseName);
        if (template.isDeployAsIs()) {
            newVol.setSize(volume.getSize());
        } else if (template.getSize() != null) {
            newVol.setSize(template.getSize());
        } else {
            newVol.setSize(volume.getSize());
        }
        return new CopyCmdAnswer(newVol);
    } catch (Throwable e) {
        return new CopyCmdAnswer(hostService.createLogMessageException(e, cmd));
    }
}
Also used : PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) DataStoreTO(com.cloud.agent.api.to.DataStoreTO) VirtualMachineMO(com.cloud.hypervisor.vmware.mo.VirtualMachineMO) VmwareHypervisorHost(com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) RemoteException(java.rmi.RemoteException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) DatastoreMO(com.cloud.hypervisor.vmware.mo.DatastoreMO) VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) DataTO(com.cloud.agent.api.to.DataTO) VolumeObjectTO(org.apache.cloudstack.storage.to.VolumeObjectTO) TemplateObjectTO(org.apache.cloudstack.storage.to.TemplateObjectTO) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer) DatacenterMO(com.cloud.hypervisor.vmware.mo.DatacenterMO) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference)

Aggregations

VmwareContext (com.cloud.hypervisor.vmware.util.VmwareContext)106 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)66 VmwareHypervisorHost (com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost)65 RemoteException (java.rmi.RemoteException)53 ManagedObjectReference (com.vmware.vim25.ManagedObjectReference)49 UnsupportedEncodingException (java.io.UnsupportedEncodingException)48 VirtualMachineMO (com.cloud.hypervisor.vmware.mo.VirtualMachineMO)39 IOException (java.io.IOException)38 CloudException (com.cloud.exception.CloudException)36 ConfigurationException (javax.naming.ConfigurationException)34 InternalErrorException (com.cloud.exception.InternalErrorException)31 ConnectException (java.net.ConnectException)31 DatastoreMO (com.cloud.hypervisor.vmware.mo.DatastoreMO)26 HostMO (com.cloud.hypervisor.vmware.mo.HostMO)23 DatacenterMO (com.cloud.hypervisor.vmware.mo.DatacenterMO)21 Pair (com.cloud.utils.Pair)20 ClusterMO (com.cloud.hypervisor.vmware.mo.ClusterMO)15 VmwareManager (com.cloud.hypervisor.vmware.manager.VmwareManager)14 DataStoreTO (com.cloud.agent.api.to.DataStoreTO)13 PrimaryDataStoreTO (org.apache.cloudstack.storage.to.PrimaryDataStoreTO)13