Search in sources :

Example 16 with DatacenterMO

use of com.cloud.hypervisor.vmware.mo.DatacenterMO in project cloudstack by apache.

the class VmwareCleanupMaid method gcLeftOverVMs.

public static synchronized void gcLeftOverVMs(VmwareContext context) {
    List<VmwareCleanupMaid> l = s_leftoverDummyVMs.get(context.getServerAddress());
    VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
    assert (mgr != null);
    if (l != null && l.size() > 0) {
        for (VmwareCleanupMaid cleanupMaid : l) {
            try {
                VirtualMachineMO vmMo = null;
                if (cleanupMaid.getDatacenterMorValue() != null) {
                    DatacenterMO dcMo = new DatacenterMO(context, "Datacenter", cleanupMaid.getDatacenterMorValue());
                    vmMo = dcMo.findVm(cleanupMaid.getVmName());
                } else {
                    assert (cleanupMaid.getHostMorValue() != null);
                    HostMO hostMo = new HostMO(context, "HostSystem", cleanupMaid.getHostMorValue());
                    ClusterMO clusterMo = new ClusterMO(context, hostMo.getHyperHostCluster());
                    vmMo = clusterMo.findVmOnHyperHost(cleanupMaid.getVmName());
                }
                if (vmMo != null) {
                    s_logger.info("Found left over dummy VM " + cleanupMaid.getVmName() + ", destroy it");
                    vmMo.destroy();
                }
            } catch (Throwable e) {
                s_logger.warn("Unable to destroy left over dummy VM " + cleanupMaid.getVmName());
            } finally {
            // FIXME                    mgr.popCleanupCheckpoint(cleanupMaid.getCheckPoint());
            }
        }
        l.clear();
    }
}
Also used : VmwareManager(com.cloud.hypervisor.vmware.manager.VmwareManager) HostMO(com.cloud.hypervisor.vmware.mo.HostMO) VirtualMachineMO(com.cloud.hypervisor.vmware.mo.VirtualMachineMO) ClusterMO(com.cloud.hypervisor.vmware.mo.ClusterMO) DatacenterMO(com.cloud.hypervisor.vmware.mo.DatacenterMO)

Example 17 with DatacenterMO

use of com.cloud.hypervisor.vmware.mo.DatacenterMO in project cloudstack by apache.

the class VmwareContext method getDatastoreMorByPath.

// path in format of <datacenter name>/<datastore name>
public ManagedObjectReference getDatastoreMorByPath(String inventoryPath) throws Exception {
    assert (inventoryPath != null);
    String[] tokens;
    if (inventoryPath.startsWith("/"))
        tokens = inventoryPath.substring(1).split("/");
    else
        tokens = inventoryPath.split("/");
    if (tokens == null || tokens.length != 2) {
        s_logger.error("Invalid datastore inventory path. path: " + inventoryPath);
        return null;
    }
    DatacenterMO dcMo = new DatacenterMO(this, tokens[0]);
    if (dcMo.getMor() == null) {
        s_logger.error("Unable to locate the datacenter specified in path: " + inventoryPath);
        return null;
    }
    return dcMo.findDatastore(tokens[1]);
}
Also used : DatacenterMO(com.cloud.hypervisor.vmware.mo.DatacenterMO)

Example 18 with DatacenterMO

use of com.cloud.hypervisor.vmware.mo.DatacenterMO 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();
    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 vmdkFileBaseName = null;
        if (srcStore == null) {
            // create a root volume for blank VM (created from ISO)
            String dummyVmName = hostService.getWorkerName(context, cmd, 0);
            try {
                vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName);
                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);
                    vmMo.createDisk(volumeDatastorePath, (int) (volume.getSize() / (1024L * 1024L)), morDatastore, -1);
                    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.detachAllDisks();
                    vmMo.destroy();
                }
            }
        } 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");
            }
            ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
            ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
            if (!_fullCloneFlag) {
                createVMLinkedClone(vmTemplate, dcMo, dsMo, vmdkName, morDatastore, morPool);
            } else {
                createVMFullClone(vmTemplate, dcMo, dsMo, vmdkName, morDatastore, morPool);
            }
            vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(vmdkName);
            assert (vmMo != null);
            // TO-DO: Support for base template containing multiple disks
            vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
            s_logger.info("Move volume out of volume-wrapper VM ");
            String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.VMWARE, !_fullCloneFlag);
            String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, !_fullCloneFlag);
            dsMo.moveDatastoreFile(vmwareLayoutFilePair[0], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[0], dcMo.getMor(), true);
            dsMo.moveDatastoreFile(vmwareLayoutFilePair[1], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[1], dcMo.getMor(), true);
            s_logger.info("detach disks from volume-wrapper VM " + vmdkName);
            vmMo.detachAllDisks();
            s_logger.info("destroy volume-wrapper VM " + vmdkName);
            vmMo.destroy();
            String srcFile = dsMo.getDatastorePath(vmdkName, true);
            dsMo.deleteFile(srcFile, dcMo.getMor(), true);
        }
        // restoreVM - move the new ROOT disk into corresponding VM folder
        VirtualMachineMO restoreVmMo = dcMo.findVm(volume.getVmName());
        if (restoreVmMo != null) {
            // 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);
            }
        }
        VolumeObjectTO newVol = new VolumeObjectTO();
        newVol.setPath(vmdkFileBaseName);
        newVol.setSize(volume.getSize());
        return new CopyCmdAnswer(newVol);
    } catch (Throwable e) {
        if (e instanceof RemoteException) {
            s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
            hostService.invalidateServiceContext(null);
        }
        String msg = "clone volume from base image failed due to " + VmwareHelper.getExceptionMessage(e);
        s_logger.error(msg, e);
        return new CopyCmdAnswer(e.toString());
    }
}
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) ClusterMO(com.cloud.hypervisor.vmware.mo.ClusterMO) RemoteException(java.rmi.RemoteException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) 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) RemoteException(java.rmi.RemoteException) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer) DatacenterMO(com.cloud.hypervisor.vmware.mo.DatacenterMO) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference)

Example 19 with DatacenterMO

use of com.cloud.hypervisor.vmware.mo.DatacenterMO in project cloudstack by apache.

the class VmwareStorageProcessor method deleteVolume.

@Override
public Answer deleteVolume(DeleteCommand cmd) {
    if (s_logger.isInfoEnabled()) {
        s_logger.info("Executing resource DeleteCommand: " + _gson.toJson(cmd));
    }
    try {
        VmwareContext context = hostService.getServiceContext(null);
        VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
        VolumeObjectTO vol = (VolumeObjectTO) cmd.getData();
        DataStoreTO store = vol.getDataStore();
        PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO) store;
        Map<String, String> details = primaryDataStoreTO.getDetails();
        boolean isManaged = false;
        String managedDatastoreName = null;
        if (details != null) {
            isManaged = Boolean.parseBoolean(details.get(PrimaryDataStoreTO.MANAGED));
            if (isManaged) {
                managedDatastoreName = getManagedDatastoreNameFromPath(vol.getPath());
            }
        }
        ManagedObjectReference morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, isManaged ? managedDatastoreName : store.getUuid());
        if (morDs == null) {
            String msg = "Unable to find datastore based on volume mount point " + store.getUuid();
            s_logger.error(msg);
            throw new Exception(msg);
        }
        DatastoreMO dsMo = new DatastoreMO(context, morDs);
        ManagedObjectReference morDc = hyperHost.getHyperHostDatacenter();
        ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
        ClusterMO clusterMo = new ClusterMO(context, morCluster);
        if (vol.getVolumeType() == Volume.Type.ROOT) {
            String vmName = vol.getVmName();
            if (vmName != null) {
                VirtualMachineMO vmMo = clusterMo.findVmOnHyperHost(vmName);
                if (vmMo == null) {
                    // Volume might be on a zone-wide storage pool, look for VM in datacenter
                    DatacenterMO dcMo = new DatacenterMO(context, morDc);
                    vmMo = dcMo.findVm(vmName);
                }
                if (vmMo != null) {
                    if (s_logger.isInfoEnabled()) {
                        s_logger.info("Destroy root volume and VM itself. vmName " + vmName);
                    }
                    VirtualMachineDiskInfo diskInfo = null;
                    if (vol.getChainInfo() != null)
                        diskInfo = _gson.fromJson(vol.getChainInfo(), VirtualMachineDiskInfo.class);
                    HostMO hostMo = vmMo.getRunningHost();
                    List<NetworkDetails> networks = vmMo.getNetworksWithDetails();
                    // tear down all devices first before we destroy the VM to avoid accidently delete disk backing files
                    if (VmwareResource.getVmState(vmMo) != PowerState.PowerOff) {
                        vmMo.safePowerOff(_shutdownWaitMs);
                    }
                    // call this before calling detachAllDisksExcept
                    // when expunging a VM, we need to see if any of its disks are serviced by managed storage
                    // if there is one or more disk serviced by managed storage, remove the iSCSI connection(s)
                    // don't remove the iSCSI connection(s) until the supported disk(s) is/are removed from the VM
                    // (removeManagedTargetsFromCluster should be called after detachAllDisksExcept and vm.destroy)
                    List<VirtualDisk> virtualDisks = vmMo.getVirtualDisks();
                    List<String> managedIqns = getManagedIqnsFromVirtualDisks(virtualDisks);
                    List<String> detachedDisks = vmMo.detachAllDisksExcept(vol.getPath(), diskInfo != null ? diskInfo.getDiskDeviceBusName() : null);
                    VmwareStorageLayoutHelper.moveVolumeToRootFolder(new DatacenterMO(context, morDc), detachedDisks);
                    if (isManaged) {
                        vmMo.unregisterVm();
                    } else {
                        vmMo.destroy();
                    }
                    // this.hostService.handleDatastoreAndVmdkDetach(iScsiName, storageHost, storagePort);
                    if (managedIqns != null && !managedIqns.isEmpty()) {
                        removeManagedTargetsFromCluster(managedIqns);
                    }
                    for (NetworkDetails netDetails : networks) {
                        if (netDetails.getGCTag() != null && netDetails.getGCTag().equalsIgnoreCase("true")) {
                            if (netDetails.getVMMorsOnNetwork() == null || netDetails.getVMMorsOnNetwork().length == 1) {
                                resource.cleanupNetwork(hostMo, netDetails);
                            }
                        }
                    }
                }
                /*
                    if (s_logger.isInfoEnabled()) {
                        s_logger.info("Destroy volume by original name: " + vol.getPath() + ".vmdk");
                    }

                    VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, vol.getPath(), new DatacenterMO(context, morDc));
                     */
                return new Answer(cmd, true, "Success");
            }
            if (s_logger.isInfoEnabled()) {
                s_logger.info("Destroy root volume directly from datastore");
            }
        }
        VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, vol.getPath(), new DatacenterMO(context, morDc));
        return new Answer(cmd, true, "Success");
    } catch (Throwable e) {
        if (e instanceof RemoteException) {
            s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
            hostService.invalidateServiceContext(null);
        }
        String msg = "delete volume failed due to " + VmwareHelper.getExceptionMessage(e);
        s_logger.error(msg, e);
        return new Answer(cmd, false, msg);
    }
}
Also used : PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) DataStoreTO(com.cloud.agent.api.to.DataStoreTO) HostMO(com.cloud.hypervisor.vmware.mo.HostMO) VirtualMachineMO(com.cloud.hypervisor.vmware.mo.VirtualMachineMO) NetworkDetails(com.cloud.hypervisor.vmware.mo.NetworkDetails) VmwareHypervisorHost(com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost) ClusterMO(com.cloud.hypervisor.vmware.mo.ClusterMO) RemoteException(java.rmi.RemoteException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DatastoreMO(com.cloud.hypervisor.vmware.mo.DatastoreMO) VirtualDisk(com.vmware.vim25.VirtualDisk) VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) CreateObjectAnswer(org.apache.cloudstack.storage.command.CreateObjectAnswer) ResignatureAnswer(org.apache.cloudstack.storage.command.ResignatureAnswer) Answer(com.cloud.agent.api.Answer) SnapshotAndCopyAnswer(org.apache.cloudstack.storage.command.SnapshotAndCopyAnswer) CopyCmdAnswer(org.apache.cloudstack.storage.command.CopyCmdAnswer) AttachAnswer(org.apache.cloudstack.storage.command.AttachAnswer) PrimaryDataStoreTO(org.apache.cloudstack.storage.to.PrimaryDataStoreTO) VirtualMachineDiskInfo(org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo) VolumeObjectTO(org.apache.cloudstack.storage.to.VolumeObjectTO) RemoteException(java.rmi.RemoteException) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference) DatacenterMO(com.cloud.hypervisor.vmware.mo.DatacenterMO)

Example 20 with DatacenterMO

use of com.cloud.hypervisor.vmware.mo.DatacenterMO 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();
    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 = dsMo.getDatastorePath(volumeUuid + ".vmdk");
        String dummyVmName = hostService.getWorkerName(context, cmd, 0);
        try {
            s_logger.info("Create worker VM " + dummyVmName);
            vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName);
            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());
                    vmMo.detachDisk(volumeDatastorePath, false);
                } catch (Exception e) {
                    s_logger.error("Deleting file " + volumeDatastorePath + " due to error: " + e.getMessage());
                    VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, volumeUuid.toString(), dcMo);
                    throw new CloudRuntimeException("Unable to create volume due to: " + e.getMessage());
                }
            }
            VolumeObjectTO 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.detachAllDisks();
                vmMo.destroy();
            }
        }
    } catch (Throwable e) {
        if (e instanceof RemoteException) {
            s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
            hostService.invalidateServiceContext(null);
        }
        String msg = "create volume failed due to " + VmwareHelper.getExceptionMessage(e);
        s_logger.error(msg, e);
        return new CreateObjectAnswer(e.toString());
    }
}
Also used : 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) RemoteException(java.rmi.RemoteException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DatastoreMO(com.cloud.hypervisor.vmware.mo.DatastoreMO) VmwareContext(com.cloud.hypervisor.vmware.util.VmwareContext) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VolumeObjectTO(org.apache.cloudstack.storage.to.VolumeObjectTO) RemoteException(java.rmi.RemoteException) DatacenterMO(com.cloud.hypervisor.vmware.mo.DatacenterMO) ManagedObjectReference(com.vmware.vim25.ManagedObjectReference)

Aggregations

DatacenterMO (com.cloud.hypervisor.vmware.mo.DatacenterMO)20 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)16 RemoteException (java.rmi.RemoteException)16 ManagedObjectReference (com.vmware.vim25.ManagedObjectReference)14 VirtualMachineMO (com.cloud.hypervisor.vmware.mo.VirtualMachineMO)13 VmwareHypervisorHost (com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost)13 UnsupportedEncodingException (java.io.UnsupportedEncodingException)13 VmwareContext (com.cloud.hypervisor.vmware.util.VmwareContext)11 IOException (java.io.IOException)9 ConfigurationException (javax.naming.ConfigurationException)9 CloudException (com.cloud.exception.CloudException)8 InternalErrorException (com.cloud.exception.InternalErrorException)8 ConnectException (java.net.ConnectException)8 DatastoreMO (com.cloud.hypervisor.vmware.mo.DatastoreMO)7 DataStoreTO (com.cloud.agent.api.to.DataStoreTO)6 PrimaryDataStoreTO (org.apache.cloudstack.storage.to.PrimaryDataStoreTO)6 HostMO (com.cloud.hypervisor.vmware.mo.HostMO)5 ClusterMO (com.cloud.hypervisor.vmware.mo.ClusterMO)4 CopyCmdAnswer (org.apache.cloudstack.storage.command.CopyCmdAnswer)4 TemplateObjectTO (org.apache.cloudstack.storage.to.TemplateObjectTO)4