mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-02 20:02:29 +01:00
CLOUDSTACK-9386: Find vm on datacenter instead of randomly choosing a cluster
This commit is contained in:
parent
744cb2c502
commit
1384d748a7
@ -5535,17 +5535,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
||||
VmwareHypervisorHost hyperHost = getHyperHost(context, null);
|
||||
VolumeTO vol = cmd.getVolume();
|
||||
|
||||
ManagedObjectReference morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, vol.getPoolUuid());
|
||||
if (morDs == null) {
|
||||
String msg = "Unable to find datastore based on volume mount point " + vol.getMountPoint();
|
||||
s_logger.error(msg);
|
||||
throw new Exception(msg);
|
||||
}
|
||||
VirtualMachineMO vmMo = findVmOnDatacenter(context, hyperHost, vol);
|
||||
|
||||
ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
|
||||
ClusterMO clusterMo = new ClusterMO(context, morCluster);
|
||||
|
||||
VirtualMachineMO vmMo = clusterMo.findVmOnHyperHost(vol.getPath());
|
||||
if (vmMo != null && vmMo.isTemplate()) {
|
||||
if (s_logger.isInfoEnabled()) {
|
||||
s_logger.info("Destroy template volume " + vol.getPath());
|
||||
@ -5570,6 +5561,26 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use data center to look for vm, instead of randomly picking up a cluster<br/>
|
||||
* (in multiple cluster environments vm could not be found if wrong cluster was chosen)
|
||||
* @param context vmware context
|
||||
* @param hyperHost vmware hv host
|
||||
* @param vol volume
|
||||
* @return a virtualmachinemo if could be found on datacenter.
|
||||
* @throws Exception if there is an error while finding vm
|
||||
* @throws CloudRuntimeException if datacenter cannot be found
|
||||
*/
|
||||
protected VirtualMachineMO findVmOnDatacenter(VmwareContext context, VmwareHypervisorHost hyperHost, VolumeTO vol) throws Exception {
|
||||
DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
|
||||
if (dcMo.getMor() == null) {
|
||||
String msg = "Unable to find VMware DC";
|
||||
s_logger.error(msg);
|
||||
throw new CloudRuntimeException(msg);
|
||||
}
|
||||
return dcMo.findVm(vol.getPath());
|
||||
}
|
||||
|
||||
private String getAbsoluteVmdkFile(VirtualDisk disk) {
|
||||
String vmdkAbsFile = null;
|
||||
VirtualDeviceBackingInfo backingInfo = disk.getBacking();
|
||||
|
||||
@ -27,6 +27,8 @@ import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Matchers.eq;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import static org.powermock.api.mockito.PowerMockito.whenNew;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -45,6 +47,7 @@ import org.powermock.api.mockito.PowerMockito;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import com.vmware.vim25.ManagedObjectReference;
|
||||
import com.vmware.vim25.VirtualDevice;
|
||||
import com.vmware.vim25.VirtualDeviceConfigSpec;
|
||||
import com.vmware.vim25.VirtualMachineConfigSpec;
|
||||
@ -55,16 +58,22 @@ import com.cloud.agent.api.ScaleVmCommand;
|
||||
import com.cloud.agent.api.to.DataTO;
|
||||
import com.cloud.agent.api.to.NfsTO;
|
||||
import com.cloud.agent.api.to.VirtualMachineTO;
|
||||
import com.cloud.agent.api.to.VolumeTO;
|
||||
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
|
||||
import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
|
||||
import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost;
|
||||
import com.cloud.hypervisor.vmware.util.VmwareContext;
|
||||
import com.cloud.storage.resource.VmwareStorageProcessor;
|
||||
import com.cloud.storage.resource.VmwareStorageSubsystemCommandHandler;
|
||||
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest(CopyCommand.class)
|
||||
@PrepareForTest({CopyCommand.class, DatacenterMO.class, VmwareResource.class})
|
||||
public class VmwareResourceTest {
|
||||
|
||||
private static final String VOLUME_PATH = "XXXXXXXXXXXX";
|
||||
|
||||
@Mock
|
||||
VmwareStorageProcessor storageProcessor;
|
||||
@Mock
|
||||
@ -110,6 +119,12 @@ public class VmwareResourceTest {
|
||||
DataTO srcDataTO;
|
||||
@Mock
|
||||
NfsTO srcDataNfsTO;
|
||||
@Mock
|
||||
VolumeTO volume;
|
||||
@Mock
|
||||
ManagedObjectReference mor;
|
||||
@Mock
|
||||
DatacenterMO datacenter;
|
||||
|
||||
CopyCommand storageCmd;
|
||||
|
||||
@ -128,6 +143,7 @@ public class VmwareResourceTest {
|
||||
when(srcDataTO.getDataStore()).thenReturn(srcDataNfsTO);
|
||||
when(srcDataNfsTO.getNfsVersion()).thenReturn(NFS_VERSION);
|
||||
when(videoCard.getVideoRamSizeInKB()).thenReturn(VIDEO_CARD_MEMORY_SIZE);
|
||||
when(volume.getPath()).thenReturn(VOLUME_PATH);
|
||||
}
|
||||
|
||||
//Test successful scaling up the vm
|
||||
@ -258,4 +274,19 @@ public class VmwareResourceTest {
|
||||
verify(_resource, never()).examineStorageSubSystemCommandNfsVersion(storageCmd);
|
||||
}
|
||||
|
||||
}
|
||||
@Test(expected=CloudRuntimeException.class)
|
||||
public void testFindVmOnDatacenterNullHyperHostReference() throws Exception {
|
||||
when(hyperHost.getMor()).thenReturn(null);
|
||||
_resource.findVmOnDatacenter(context, hyperHost, volume);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindVmOnDatacenter() throws Exception {
|
||||
when(hyperHost.getHyperHostDatacenter()).thenReturn(mor);
|
||||
when(datacenter.getMor()).thenReturn(mor);
|
||||
when(datacenter.findVm(VOLUME_PATH)).thenReturn(vmMo);
|
||||
whenNew(DatacenterMO.class).withArguments(context, mor).thenReturn(datacenter);
|
||||
VirtualMachineMO result = _resource.findVmOnDatacenter(context, hyperHost, volume);
|
||||
assertEquals(vmMo, result);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user