vmware: Explicitly controlling VMware VM hardware version (#4117)

Set the VM hardware version on new VM deployments as set by the administrator on vCenter at cluster or datacenter level by the 'Edit Default VM Compatibility' action.

On VM deployments:
- Check cluster level VM hardware version If it is set, then is used as the new VM hardware version
- If cluster level VM hardware version not set, check the datacenter VM hardware version. If it is set, then it is used as the new VM hardware version.
- If both cluster or datacenter VM hardware version not set, then VM hardware version not set for the new VM
This commit is contained in:
Nicolas Vazquez 2020-07-07 04:13:41 -03:00 committed by GitHub
parent 5040283db9
commit d66690fe82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 78 additions and 2 deletions

View File

@ -94,7 +94,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
return null; return null;
} }
private ClusterConfigInfoEx getClusterConfigInfo() throws Exception { public ClusterConfigInfoEx getClusterConfigInfo() throws Exception {
ClusterConfigInfoEx configInfo = (ClusterConfigInfoEx)_context.getVimClient().getDynamicProperty(_mor, "configurationEx"); ClusterConfigInfoEx configInfo = (ClusterConfigInfoEx)_context.getVimClient().getDynamicProperty(_mor, "configurationEx");
return configInfo; return configInfo;
} }

View File

@ -24,6 +24,7 @@ import java.util.List;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.vmware.vim25.CustomFieldStringValue; import com.vmware.vim25.CustomFieldStringValue;
import com.vmware.vim25.DatacenterConfigInfo;
import com.vmware.vim25.DVPortgroupConfigInfo; import com.vmware.vim25.DVPortgroupConfigInfo;
import com.vmware.vim25.DistributedVirtualSwitchPortConnection; import com.vmware.vim25.DistributedVirtualSwitchPortConnection;
import com.vmware.vim25.DynamicProperty; import com.vmware.vim25.DynamicProperty;
@ -508,4 +509,9 @@ public class DatacenterMO extends BaseMO {
CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context, _context.getServiceContent().getCustomFieldsManager()); CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context, _context.getServiceContent().getCustomFieldsManager());
return cfmMo.ensureCustomFieldDef("Datacenter", fieldName) > 0; return cfmMo.ensureCustomFieldDef("Datacenter", fieldName) > 0;
} }
public DatacenterConfigInfo getDatacenterConfigInfo() throws Exception {
DatacenterConfigInfo configInfo = (DatacenterConfigInfo)_context.getVimClient().getDynamicProperty(_mor, "configuration");
return configInfo;
}
} }

View File

@ -73,6 +73,8 @@ import com.vmware.vim25.OvfCreateDescriptorResult;
import com.vmware.vim25.AlreadyExistsFaultMsg; import com.vmware.vim25.AlreadyExistsFaultMsg;
import com.vmware.vim25.BoolPolicy; import com.vmware.vim25.BoolPolicy;
import com.vmware.vim25.CustomFieldStringValue; import com.vmware.vim25.CustomFieldStringValue;
import com.vmware.vim25.ClusterConfigInfoEx;
import com.vmware.vim25.DatacenterConfigInfo;
import com.vmware.vim25.DVPortSetting; import com.vmware.vim25.DVPortSetting;
import com.vmware.vim25.DVPortgroupConfigInfo; import com.vmware.vim25.DVPortgroupConfigInfo;
import com.vmware.vim25.DVPortgroupConfigSpec; import com.vmware.vim25.DVPortgroupConfigSpec;
@ -1520,6 +1522,10 @@ public class HypervisorHostHelper {
vmConfig.getDeviceChange().add(videoDeviceSpec); vmConfig.getDeviceChange().add(videoDeviceSpec);
ClusterMO clusterMo = new ClusterMO(host.getContext(), host.getHyperHostCluster());
DatacenterMO dataCenterMo = new DatacenterMO(host.getContext(), host.getHyperHostDatacenter());
setVMHardwareVersion(vmConfig, clusterMo, dataCenterMo);
if (host.createVm(vmConfig)) { if (host.createVm(vmConfig)) {
// Here, when attempting to find the VM, we need to use the name // Here, when attempting to find the VM, we need to use the name
// with which we created it. This is the only such place where // with which we created it. This is the only such place where
@ -1548,6 +1554,28 @@ public class HypervisorHostHelper {
return false; return false;
} }
/**
* Set the VM hardware version based on the information retrieved by the cluster and datacenter:
* - If the cluster hardware version is set, then it is set to this hardware version on vmConfig
* - If the cluster hardware version is not set, check datacenter hardware version. If it is set, then it is set to vmConfig
* - In case both cluster and datacenter hardware version are not set, hardware version is not set to vmConfig
*/
protected static void setVMHardwareVersion(VirtualMachineConfigSpec vmConfig, ClusterMO clusterMO, DatacenterMO datacenterMO) throws Exception {
ClusterConfigInfoEx clusterConfigInfo = clusterMO != null ? clusterMO.getClusterConfigInfo() : null;
String clusterHardwareVersion = clusterConfigInfo != null ? clusterConfigInfo.getDefaultHardwareVersionKey() : null;
if (StringUtils.isNotBlank(clusterHardwareVersion)) {
s_logger.debug("Cluster hardware version found: " + clusterHardwareVersion + ". Creating VM with this hardware version");
vmConfig.setVersion(clusterHardwareVersion);
} else {
DatacenterConfigInfo datacenterConfigInfo = datacenterMO != null ? datacenterMO.getDatacenterConfigInfo() : null;
String datacenterHardwareVersion = datacenterConfigInfo != null ? datacenterConfigInfo.getDefaultHardwareVersionKey() : null;
if (StringUtils.isNotBlank(datacenterHardwareVersion)) {
s_logger.debug("Datacenter hardware version found: " + datacenterHardwareVersion + ". Creating VM with this hardware version");
vmConfig.setVersion(datacenterHardwareVersion);
}
}
}
private static VirtualDeviceConfigSpec getControllerSpec(String diskController, int busNum) { private static VirtualDeviceConfigSpec getControllerSpec(String diskController, int busNum) {
VirtualDeviceConfigSpec controllerSpec = new VirtualDeviceConfigSpec(); VirtualDeviceConfigSpec controllerSpec = new VirtualDeviceConfigSpec();
VirtualController controller = null; VirtualController controller = null;

View File

@ -23,6 +23,8 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -39,6 +41,9 @@ import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering;
import com.vmware.vim25.AboutInfo; import com.vmware.vim25.AboutInfo;
import com.vmware.vim25.BoolPolicy; import com.vmware.vim25.BoolPolicy;
import com.vmware.vim25.ClusterConfigInfoEx;
import com.vmware.vim25.DatacenterConfigInfo;
import com.vmware.vim25.VirtualMachineConfigSpec;
import com.vmware.vim25.DVPortgroupConfigInfo; import com.vmware.vim25.DVPortgroupConfigInfo;
import com.vmware.vim25.DVPortgroupConfigSpec; import com.vmware.vim25.DVPortgroupConfigSpec;
import com.vmware.vim25.DVSSecurityPolicy; import com.vmware.vim25.DVSSecurityPolicy;
@ -62,6 +67,16 @@ public class HypervisorHostHelperTest {
ServiceContent serviceContent; ServiceContent serviceContent;
@Mock @Mock
AboutInfo aboutInfo; AboutInfo aboutInfo;
@Mock
private VirtualMachineConfigSpec vmSpec;
@Mock
private ClusterMO clusterMO;
@Mock
private DatacenterMO datacenterMO;
@Mock
private ClusterConfigInfoEx clusterConfigInfo;
@Mock
private DatacenterConfigInfo datacenterConfigInfo;
String vSwitchName; String vSwitchName;
Integer networkRateMbps; Integer networkRateMbps;
@ -70,10 +85,12 @@ public class HypervisorHostHelperTest {
String svlanId = null; String svlanId = null;
@Before @Before
public void setup() { public void setup() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(context.getServiceContent()).thenReturn(serviceContent); when(context.getServiceContent()).thenReturn(serviceContent);
when(serviceContent.getAbout()).thenReturn(aboutInfo); when(serviceContent.getAbout()).thenReturn(aboutInfo);
when(clusterMO.getClusterConfigInfo()).thenReturn(clusterConfigInfo);
when(datacenterMO.getDatacenterConfigInfo()).thenReturn(datacenterConfigInfo);
} }
@BeforeClass @BeforeClass
@ -883,4 +900,29 @@ public class HypervisorHostHelperTest {
assertTrue(((VmwareDistributedVirtualSwitchTrunkVlanSpec) spec).getVlanId().get(0).getStart() == 0); assertTrue(((VmwareDistributedVirtualSwitchTrunkVlanSpec) spec).getVlanId().get(0).getStart() == 0);
assertTrue(((VmwareDistributedVirtualSwitchTrunkVlanSpec) spec).getVlanId().get(0).getEnd() == 0); assertTrue(((VmwareDistributedVirtualSwitchTrunkVlanSpec) spec).getVlanId().get(0).getEnd() == 0);
} }
@Test
public void testSetVMHardwareVersionClusterLevel() throws Exception {
when(clusterConfigInfo.getDefaultHardwareVersionKey()).thenReturn("vmx-11");
when(datacenterConfigInfo.getDefaultHardwareVersionKey()).thenReturn("vmx-9");
HypervisorHostHelper.setVMHardwareVersion(vmSpec, clusterMO, datacenterMO);
verify(vmSpec).setVersion("vmx-11");
verify(vmSpec, never()).setVersion("vmx-9");
}
@Test
public void testSetVMHardwareVersionDatacenterLevel() throws Exception {
when(clusterConfigInfo.getDefaultHardwareVersionKey()).thenReturn(null);
when(datacenterConfigInfo.getDefaultHardwareVersionKey()).thenReturn("vmx-9");
HypervisorHostHelper.setVMHardwareVersion(vmSpec, clusterMO, datacenterMO);
verify(vmSpec).setVersion("vmx-9");
}
@Test
public void testSetVMHardwareVersionUnset() throws Exception {
when(clusterConfigInfo.getDefaultHardwareVersionKey()).thenReturn(null);
when(datacenterConfigInfo.getDefaultHardwareVersionKey()).thenReturn(null);
HypervisorHostHelper.setVMHardwareVersion(vmSpec, clusterMO, datacenterMO);
verify(vmSpec, never()).setVersion(any());
}
} }