Skip to content

Commit 7e6d38e

Browse files
nvazquezshwstppr
authored andcommitted
[KDDI-4.9.1.0-shapeblue17.1] Fix for volume snapshots hardware version (#43)
* Fix for volume snapshots hardware version * Refactor number formatting * Renaming * Refactor and add unit tests
1 parent aea9851 commit 7e6d38e

File tree

4 files changed

+63
-31
lines changed

4 files changed

+63
-31
lines changed

plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -1118,11 +1118,12 @@ private Ternary<String, Long, Long> createTemplateFromVolume(VirtualMachineMO vm
11181118
throw new Exception(msg);
11191119
}
11201120

1121-
String hardwareVersion = String.valueOf(vmMo.getVirtualHardwareVersion());
1121+
String vmxFormattedHardwareVersion = VirtualMachineMO.getVmxFormattedVirtualHardwareVersion(vmMo.getVirtualHardwareVersion());
11221122

11231123
// 4 MB is the minimum requirement for VM memory in VMware
11241124
Pair<VirtualMachineMO, String[]> cloneResult =
1125-
vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), hardwareVersion);
1125+
vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), vmxFormattedHardwareVersion);
1126+
11261127
clonedVm = cloneResult.first();
11271128

11281129
clonedVm.exportVm(secondaryMountPoint + "/" + installPath, templateUniqueName, false, false);
@@ -1685,11 +1686,11 @@ private Pair<String, String[]> exportVolumeToSecondaryStroage(VirtualMachineMO v
16851686
throw new Exception(msg);
16861687
}
16871688

1688-
String virtualHardwareVersion = String.valueOf(vmMo.getVirtualHardwareVersion());
1689+
String vmxFormattedHardwareVersion = VirtualMachineMO.getVmxFormattedVirtualHardwareVersion(vmMo.getVirtualHardwareVersion());
16891690

16901691
// 4 MB is the minimum requirement for VM memory in VMware
16911692
Pair<VirtualMachineMO, String[]> cloneResult =
1692-
vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), virtualHardwareVersion);
1693+
vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), vmxFormattedHardwareVersion);
16931694
clonedVm = cloneResult.first();
16941695
String disks[] = cloneResult.second();
16951696

vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1642,7 +1642,7 @@ private static VirtualDeviceConfigSpec getControllerSpec(String diskController,
16421642

16431643
return controllerSpec;
16441644
}
1645-
public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost hyperHost, DatastoreMO dsMo, String vmName, String hardwareVersion) throws Exception {
1645+
public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost hyperHost, DatastoreMO dsMo, String vmName, String vmxFormattedHardwareVersion) throws Exception {
16461646

16471647
// Allow worker VM to float within cluster so that we will have better chance to
16481648
// create it successfully
@@ -1653,8 +1653,8 @@ public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost hyperHost, Da
16531653
VirtualMachineMO workingVM = null;
16541654
VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec();
16551655
vmConfig.setName(vmName);
1656-
if (hardwareVersion != null){
1657-
vmConfig.setVersion("vmx-" + hardwareVersion);
1656+
if (StringUtils.isNotBlank(vmxFormattedHardwareVersion)) {
1657+
vmConfig.setVersion(vmxFormattedHardwareVersion);
16581658
} else {
16591659
ClusterMO clusterMo = new ClusterMO(hyperHost.getContext(), hyperHost.getHyperHostCluster());
16601660
DatacenterMO dataCenterMo = new DatacenterMO(hyperHost.getContext(), hyperHost.getHyperHostDatacenter());

vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java

+21-9
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@
3737
import org.apache.commons.collections.CollectionUtils;
3838
import org.apache.log4j.Logger;
3939

40+
import com.cloud.hypervisor.vmware.mo.SnapshotDescriptor.SnapshotInfo;
41+
import com.cloud.hypervisor.vmware.util.VmwareContext;
42+
import com.cloud.hypervisor.vmware.util.VmwareHelper;
43+
import com.cloud.utils.ActionDelegate;
44+
import com.cloud.utils.Pair;
45+
import com.cloud.utils.Ternary;
46+
import com.cloud.utils.concurrency.NamedThreadFactory;
47+
import com.cloud.utils.exception.CloudRuntimeException;
48+
import com.cloud.utils.script.Script;
4049
import com.google.gson.Gson;
4150
import com.vmware.vim25.ArrayOfManagedObjectReference;
4251
import com.vmware.vim25.ChoiceOption;
@@ -105,15 +114,6 @@
105114
import com.vmware.vim25.VirtualSCSIController;
106115
import com.vmware.vim25.VirtualSCSISharing;
107116

108-
import com.cloud.hypervisor.vmware.mo.SnapshotDescriptor.SnapshotInfo;
109-
import com.cloud.hypervisor.vmware.util.VmwareContext;
110-
import com.cloud.hypervisor.vmware.util.VmwareHelper;
111-
import com.cloud.utils.ActionDelegate;
112-
import com.cloud.utils.Pair;
113-
import com.cloud.utils.Ternary;
114-
import com.cloud.utils.concurrency.NamedThreadFactory;
115-
import com.cloud.utils.script.Script;
116-
117117
public class VirtualMachineMO extends BaseMO {
118118
private static final Logger s_logger = Logger.getLogger(VirtualMachineMO.class);
119119
private static final ExecutorService MonitorServiceExecutor = Executors.newCachedThreadPool(new NamedThreadFactory("VM-Question-Monitor"));
@@ -3247,6 +3247,18 @@ public int getVirtualHardwareVersion() throws Exception {
32473247
return vhOption.getHwVersion();
32483248
}
32493249

3250+
/**
3251+
* Return a hardware version string in the format expected by Vmware
3252+
* Format: "vmx-DD" where DD represents the hardware version number
3253+
* @param virtualHardwareVersion numeric virtual hardware version
3254+
*/
3255+
public static String getVmxFormattedVirtualHardwareVersion(int virtualHardwareVersion) {
3256+
if (virtualHardwareVersion < 1) {
3257+
throw new CloudRuntimeException("Invalid hardware version: " + virtualHardwareVersion);
3258+
}
3259+
return String.format("vmx-%02d", virtualHardwareVersion);
3260+
}
3261+
32503262
public VirtualHardwareOption getVirtualHardwareOption() throws Exception {
32513263
VirtualMachineConfigOption vmConfigOption = _context.getService().queryConfigOption(getEnvironmentBrowser(), null, null);
32523264
return vmConfigOption.getHardwareOptions();

vmware-base/test/com/cloud/hypervisor/vmware/mo/VirtualMachineMOTest.java

+34-15
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,16 @@
1616
// under the License.
1717
package com.cloud.hypervisor.vmware.mo;
1818

19+
import static org.junit.Assert.fail;
20+
import static org.mockito.Matchers.any;
21+
import static org.mockito.Mockito.when;
22+
23+
import java.util.ArrayList;
24+
import java.util.List;
1925

20-
import com.cloud.hypervisor.vmware.util.VmwareClient;
21-
import com.cloud.hypervisor.vmware.util.VmwareContext;
22-
import com.vmware.vim25.ManagedObjectReference;
23-
import com.vmware.vim25.VirtualDevice;
24-
import com.vmware.vim25.VirtualLsiLogicController;
25-
import com.vmware.vim25.VirtualLsiLogicSASController;
26-
import com.vmware.vim25.VirtualSCSIController;
27-
import com.vmware.vim25.VirtualSCSISharing;
2826
import org.junit.After;
2927
import org.junit.AfterClass;
28+
import org.junit.Assert;
3029
import org.junit.Before;
3130
import org.junit.BeforeClass;
3231
import org.junit.Test;
@@ -35,12 +34,15 @@
3534
import org.mockito.MockitoAnnotations;
3635
import org.mockito.runners.MockitoJUnitRunner;
3736

38-
import java.util.ArrayList;
39-
import java.util.List;
40-
41-
import static org.junit.Assert.fail;
42-
import static org.mockito.Matchers.any;
43-
import static org.mockito.Mockito.when;
37+
import com.cloud.hypervisor.vmware.util.VmwareClient;
38+
import com.cloud.hypervisor.vmware.util.VmwareContext;
39+
import com.cloud.utils.exception.CloudRuntimeException;
40+
import com.vmware.vim25.ManagedObjectReference;
41+
import com.vmware.vim25.VirtualDevice;
42+
import com.vmware.vim25.VirtualLsiLogicController;
43+
import com.vmware.vim25.VirtualLsiLogicSASController;
44+
import com.vmware.vim25.VirtualSCSIController;
45+
import com.vmware.vim25.VirtualSCSISharing;
4446

4547
@RunWith(MockitoJUnitRunner.class)
4648
public class VirtualMachineMOTest {
@@ -117,4 +119,21 @@ public void TestEnsureLsiLogicDeviceControllers() {
117119
}
118120

119121
}
120-
}
122+
123+
@Test
124+
public void testGetVmxFormattedVirtualHardwareVersionOneDigit() {
125+
String vmxHwVersion = VirtualMachineMO.getVmxFormattedVirtualHardwareVersion(8);
126+
Assert.assertEquals("vmx-08", vmxHwVersion);
127+
}
128+
129+
@Test
130+
public void testGetVmxFormattedVirtualHardwareVersionTwoDigits() {
131+
String vmxHwVersion = VirtualMachineMO.getVmxFormattedVirtualHardwareVersion(11);
132+
Assert.assertEquals("vmx-11", vmxHwVersion);
133+
}
134+
135+
@Test(expected = CloudRuntimeException.class)
136+
public void testGetVmxFormattedVirtualHardwareVersionInvalid() {
137+
VirtualMachineMO.getVmxFormattedVirtualHardwareVersion(-1);
138+
}
139+
}

0 commit comments

Comments
 (0)