This is an automated email from the ASF dual-hosted git repository.
andrijapanic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/master by this push:
new 479ef8a VMware: match hardware version for worker VM when taking a
snapshot (#4321)
479ef8a is described below
commit 479ef8aafaa6162daa1d26058d225d885065f4cc
Author: Spaceman1984 <[email protected]>
AuthorDate: Fri Oct 9 17:06:07 2020 +0200
VMware: match hardware version for worker VM when taking a snapshot (#4321)
* Add hardware version to worker VM
* Added worker VM hardware version when creating a template from a volume
and migrating a detached volume
* Add null parameter back that was removed by merge
---
.../vmware/manager/VmwareStorageManagerImpl.java | 8 ++++----
.../hypervisor/vmware/resource/VmwareResource.java | 4 ++--
.../storage/resource/VmwareStorageProcessor.java | 24 +++++++++++++---------
.../hypervisor/vmware/mo/HypervisorHostHelper.java | 11 ++++++++--
.../hypervisor/vmware/mo/VirtualMachineMO.java | 8 ++++----
5 files changed, 33 insertions(+), 22 deletions(-)
diff --git
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
index 369e5b6..d59fcfb 100644
---
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
+++
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
@@ -344,7 +344,7 @@ public class VmwareStorageManagerImpl implements
VmwareStorageManager {
dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
workerVMName = hostService.getWorkerName(context, cmd,
0);
- vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVMName);
+ vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVMName, null);
if (vmMo == null) {
throw new Exception("Failed to find the newly
create or relocated VM. vmName: " + workerVMName);
@@ -647,7 +647,7 @@ public class VmwareStorageManagerImpl implements
VmwareStorageManager {
}
// 4 MB is the minimum requirement for VM memory in VMware
- vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
volumeDeviceInfo.second(),
VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
+ vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
volumeDeviceInfo.second(),
VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), null);
clonedVm = vmMo.getRunningHost().findVmOnHyperHost(workerVmName);
if (clonedVm == null) {
String msg = "Unable to create dummy VM to export volume.
volume path: " + volumePath;
@@ -965,7 +965,7 @@ public class VmwareStorageManagerImpl implements
VmwareStorageManager {
if (clonedWorkerVMNeeded) {
// 4 MB is the minimum requirement for VM memory in VMware
- vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
volumeDeviceInfo.second(),
VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
+ vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
volumeDeviceInfo.second(),
VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), null);
clonedVm =
vmMo.getRunningHost().findVmOnHyperHost(workerVmName);
if (clonedVm == null) {
String msg = "Unable to create dummy VM to export volume.
volume path: " + volumePath;
@@ -1008,7 +1008,7 @@ public class VmwareStorageManagerImpl implements
VmwareStorageManager {
if (vmMo == null) {
// create a dummy worker vm for attaching the volume
DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(),
morDs);
- workerVm = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVmName);
+ workerVm = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVmName, null);
if (workerVm == null) {
String msg = "Unable to create worker VM to execute
CopyVolumeCommand";
diff --git
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 740e122..3ef1fc2 100644
---
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -763,7 +763,7 @@ public class VmwareResource implements StoragePoolResource,
ServerResource, Vmwa
s_logger.info("Create worker VM " + vmName);
// OfflineVmwareMigration: 2. create the worker with access to
the data(store)
- vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo,
vmName);
+ vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo,
vmName, null);
if (vmMo == null) {
// OfflineVmwareMigration: don't throw a general Exception
but think of a specific one
@@ -4595,7 +4595,7 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
dsMo = new DatastoreMO(hyperHost.getContext(), morSourceDS);
s_logger.info("Create worker VM " + vmName);
// OfflineVmwareMigration: 2. create the worker with access to the
data(store)
- vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo,
vmName);
+ vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo,
vmName, null);
if (vmMo == null) {
// OfflineVmwareMigration: don't throw a general Exception but
think of a specific one
throw new CloudRuntimeException("Unable to create a worker VM
for volume operation");
diff --git
a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
index f8b8f4c..df780e7 100644
---
a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
+++
b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
@@ -396,7 +396,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
if (vmName != null) {
String workerVmName = hostService.getWorkerName(context, cmd, 0);
- VirtualMachineMO vmMo =
HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName);
+ VirtualMachineMO vmMo =
HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName, null);
if (vmMo == null) {
throw new Exception("Unable to create a worker VM for volume
creation");
@@ -794,7 +794,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
String dummyVmName = hostService.getWorkerName(context, cmd,
0);
try {
- vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, dummyVmName);
+ vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, dummyVmName, null);
if (vmMo == null) {
throw new Exception("Unable to create a dummy VM for
volume creation");
}
@@ -995,7 +995,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
if (vmMo == null || VmwareResource.getVmState(vmMo) ==
PowerState.PowerOff) {
// create a dummy worker vm for attaching the volume
DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(),
morDs);
- workerVm = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVmName);
+ workerVm = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVmName, null);
if (workerVm == null) {
String msg = "Unable to create worker VM to execute
CopyVolumeCommand";
@@ -1130,9 +1130,11 @@ public class VmwareStorageProcessor implements
StorageProcessor {
throw new Exception(msg);
}
+ String hardwareVersion =
String.valueOf(vmMo.getVirtualHardwareVersion());
+
// 4 MB is the minimum requirement for VM memory in VMware
Pair<VirtualMachineMO, String[]> cloneResult =
- vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
volumeDeviceInfo.second(),
VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
+ vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
volumeDeviceInfo.second(),
VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), hardwareVersion);
clonedVm = cloneResult.first();
clonedVm.exportVm(secondaryMountPoint + "/" + installPath,
templateUniqueName, false, false);
@@ -1194,7 +1196,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
if (volume.getVmName() == null) {
ManagedObjectReference secMorDs =
HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost,
volume.getDataStore().getUuid());
DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(),
secMorDs);
- workerVmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, "workervm"+volume.getUuid());
+ workerVmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, "workervm"+volume.getUuid(), null);
if (workerVmMo == null) {
throw new Exception("Unable to find created worker VM");
}
@@ -1551,7 +1553,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
ManagedObjectReference dsMor =
hyperHost.findDatastoreByName(dsFile.getDatastoreName());
DatastoreMO dsMo = new DatastoreMO(context, dsMor);
- VirtualMachineMO workerVM =
HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName);
+ VirtualMachineMO workerVM =
HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName, null);
if (workerVM == null) {
throw new CloudRuntimeException("Failed to find the newly created
worker VM: " + workerVMName);
@@ -1716,12 +1718,14 @@ public class VmwareStorageProcessor implements
StorageProcessor {
throw new Exception(msg);
}
+ String virtualHardwareVersion =
String.valueOf(vmMo.getVirtualHardwareVersion());
+
String diskDevice = volumeDeviceInfo.second();
String disks[] =
vmMo.getCurrentSnapshotDiskChainDatastorePaths(diskDevice);
if (clonedWorkerVMNeeded) {
// 4 MB is the minimum requirement for VM memory in VMware
Pair<VirtualMachineMO, String[]> cloneResult =
- vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
diskDevice, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
+ vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4,
diskDevice, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()),
virtualHardwareVersion);
clonedVm = cloneResult.first();
clonedVm.exportVm(exportPath, exportName, false, false);
} else {
@@ -1798,7 +1802,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
if(vmMo == null) {
dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
workerVMName = hostService.getWorkerName(context, cmd, 0);
- vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVMName);
+ vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, workerVMName, null);
if (vmMo == null) {
throw new Exception("Failed to find the newly create
or relocated VM. vmName: " + workerVMName);
}
@@ -2251,7 +2255,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
String dummyVmName = hostService.getWorkerName(context, cmd, 0);
try {
s_logger.info("Create worker VM " + dummyVmName);
- vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo,
dummyVmName);
+ vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo,
dummyVmName, null);
if (vmMo == null) {
throw new Exception("Unable to create a dummy VM for
volume creation");
}
@@ -2934,7 +2938,7 @@ public class VmwareStorageProcessor implements
StorageProcessor {
String dummyVmName = hostService.getWorkerName(context, cmd, 0);
- VirtualMachineMO vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, dummyVmName);
+ VirtualMachineMO vmMo = HypervisorHostHelper.createWorkerVM(hyperHost,
dsMo, dummyVmName, null);
if (vmMo == null) {
throw new Exception("Unable to create a dummy VM for volume
creation");
diff --git
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
index c3143ae..1242d25 100644
---
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -1604,7 +1604,7 @@ public class HypervisorHostHelper {
return controllerSpec;
}
- public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost
hyperHost, DatastoreMO dsMo, String vmName) throws Exception {
+ public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost
hyperHost, DatastoreMO dsMo, String vmName, String hardwareVersion) throws
Exception {
// Allow worker VM to float within cluster so that we will have better
chance to
// create it successfully
@@ -1615,6 +1615,13 @@ public class HypervisorHostHelper {
VirtualMachineMO workingVM = null;
VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec();
vmConfig.setName(vmName);
+ if (hardwareVersion != null){
+ vmConfig.setVersion(("vmx-" + hardwareVersion));
+ } else {
+ ClusterMO clusterMo = new ClusterMO(hyperHost.getContext(),
hyperHost.getHyperHostCluster());
+ DatacenterMO dataCenterMo = new
DatacenterMO(hyperHost.getContext(), hyperHost.getHyperHostDatacenter());
+ setVMHardwareVersion(vmConfig, clusterMo, dataCenterMo);
+ }
vmConfig.setMemoryMB((long)4);
vmConfig.setNumCPUs(1);
vmConfig.setGuestId(VirtualMachineGuestOsIdentifier.OTHER_GUEST.value());
@@ -1933,7 +1940,7 @@ public class HypervisorHostHelper {
ManagedObjectReference morDs) throws Exception {
VmwareContext context = host.getContext();
ManagedObjectReference morOvf =
context.getServiceContent().getOvfManager();
- VirtualMachineMO workerVmMo =
HypervisorHostHelper.createWorkerVM(host, new DatastoreMO(context, morDs),
ovfName);
+ VirtualMachineMO workerVmMo =
HypervisorHostHelper.createWorkerVM(host, new DatastoreMO(context, morDs),
ovfName, null);
if (workerVmMo == null)
throw new Exception("Unable to find just-created worker VM");
diff --git
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index f417e4e..68bce53 100644
---
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -1959,21 +1959,21 @@ public class VirtualMachineMO extends BaseMO {
}
// return the disk chain (VMDK datastore paths) for cloned snapshot
- public Pair<VirtualMachineMO, String[]> cloneFromCurrentSnapshot(String
clonedVmName, int cpuSpeedMHz, int memoryMb, String diskDevice,
ManagedObjectReference morDs)
+ public Pair<VirtualMachineMO, String[]> cloneFromCurrentSnapshot(String
clonedVmName, int cpuSpeedMHz, int memoryMb, String diskDevice,
ManagedObjectReference morDs, String virtualHardwareVersion)
throws Exception {
assert (morDs != null);
String[] disks = getCurrentSnapshotDiskChainDatastorePaths(diskDevice);
- VirtualMachineMO clonedVm = cloneFromDiskChain(clonedVmName,
cpuSpeedMHz, memoryMb, disks, morDs);
+ VirtualMachineMO clonedVm = cloneFromDiskChain(clonedVmName,
cpuSpeedMHz, memoryMb, disks, morDs, virtualHardwareVersion);
return new Pair<VirtualMachineMO, String[]>(clonedVm, disks);
}
- public VirtualMachineMO cloneFromDiskChain(String clonedVmName, int
cpuSpeedMHz, int memoryMb, String[] disks, ManagedObjectReference morDs) throws
Exception {
+ public VirtualMachineMO cloneFromDiskChain(String clonedVmName, int
cpuSpeedMHz, int memoryMb, String[] disks, ManagedObjectReference morDs, String
cloneHardwareVersion) throws Exception {
assert (disks != null);
assert (disks.length >= 1);
HostMO hostMo = getRunningHost();
- VirtualMachineMO clonedVmMo =
HypervisorHostHelper.createWorkerVM(hostMo, new
DatastoreMO(hostMo.getContext(), morDs), clonedVmName);
+ VirtualMachineMO clonedVmMo =
HypervisorHostHelper.createWorkerVM(hostMo, new
DatastoreMO(hostMo.getContext(), morDs), clonedVmName, cloneHardwareVersion);
if (clonedVmMo == null)
throw new Exception("Unable to find just-created blank VM");