Roy Golan has uploaded a new change for review. Change subject: core: Fail Add/Update Vm when CPU is unsupported ......................................................................
core: Fail Add/Update Vm when CPU is unsupported Change-Id: Id1d22994c59b16d1d71d2315882d41454079bf32 Bug-Url: https://bugzilla.redhat.com/1096851 Signed-off-by: Roy Golan <rgo...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CpuFlagsManagerHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 12 files changed, 102 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/30/33230/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java index 162d74d..820086a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java @@ -524,6 +524,14 @@ return false; } + if (!VmHandler.isCpuSupported( + vmFromParams.getVmOsId(), + getVdsGroup().getcompatibility_version(), + getVdsGroup().getcpu_name(), + getReturnValue().getCanDoActionMessages())) { + return false; + } + // Check if the display type is supported if (!VmHandler.isDisplayTypeSupported(getParameters().getVmStaticData().getOsId(), vmFromParams.getDefaultDisplayType(), diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CpuFlagsManagerHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CpuFlagsManagerHandler.java index 8f7b924..a55b760 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CpuFlagsManagerHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CpuFlagsManagerHandler.java @@ -34,7 +34,7 @@ log.info("Finished initializing dictionaries"); } - public static String GetVDSVerbDataByCpuName(String name, Version ver) { + public static String getCpuId(String name, Version ver) { final CpuFlagsManager cpuFlagsManager = _managersDictionary.get(ver); if (cpuFlagsManager != null) { return cpuFlagsManager.GetVDSVerbDataByCpuName(name); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java index 6194d05..d21f833 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java @@ -682,7 +682,7 @@ // get what cpu flags should be passed to vdsm according to cluster // cpu name getVm().setVdsGroupCpuFlagsData( - CpuFlagsManagerHandler.GetVDSVerbDataByCpuName(getVm().getVdsGroupCpuName(), getVm() + CpuFlagsManagerHandler.getCpuId(getVm().getVdsGroupCpuName(), getVm() .getVdsGroupCompatibilityVersion())); VmHandler.updateVmGuestAgentVersion(getVm()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java index 18badff..c1728e8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java @@ -483,6 +483,14 @@ return false; } + if (!VmHandler.isCpuSupported( + vmFromParams.getVmOsId(), + getVdsGroup().getcompatibility_version(), + getVdsGroup().getcpu_name(), + getReturnValue().getCanDoActionMessages())) { + return false; + } + if (vmFromParams.getSingleQxlPci() && !VmHandler.isSingleQxlDeviceLegal(vmFromParams.getDefaultDisplayType(), vmFromParams.getOs(), diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java index acf6b49..175a4e7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java @@ -843,4 +843,17 @@ return fieldList; } + + public static boolean isCpuSupported(int osId, Version version, String cpuName, ArrayList<String> canDoActionMessages) { + if (osRepository.isCpuSupported( + osId, + version, + CpuFlagsManagerHandler.getCpuId(cpuName, version))) { + return true; + } + String unsupportedCpus = osRepository.getUnsupportedCpus(osId, version).toString(); + canDoActionMessages.add(VdcBllMessages.CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS.name()); + canDoActionMessages.add("$unsupportedCpus " + StringUtils.strip(unsupportedCpus.toString(), "[]")); + return false; + } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java index bd1ed9c..93a4e6c 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java @@ -20,8 +20,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.junit.Before; import org.junit.Rule; @@ -57,6 +59,7 @@ import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend; import org.ovirt.engine.core.common.osinfo.OsRepository; +import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.utils.SimpleDependecyInjector; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; @@ -157,6 +160,7 @@ SimpleDependecyInjector.getInstance().bind(OsRepository.class, osRepository); VmHandler.init(); when(osRepository.isWindows(0)).thenReturn(true); + when(osRepository.isCpuSupported(anyInt(), any(Version.class), anyString())).thenReturn(true); } @Test @@ -275,6 +279,42 @@ assertFalse(command.validateSpaceRequirements()); } + @Test + public void testUnsupportedCpus() { + // prepare a command to pass canDo action + VM vm = createVm(); + vm.setVmOs(OsRepository.DEFAULT_X86_OS); + VDSGroup vdsGroup = createVdsGroup(); + + AddVmFromTemplateCommand<AddVmFromTemplateParameters> cmd = createVmFromTemplateCommand(vm); + + mockStorageDomainDAOGetForStoragePool(); + mockVmTemplateDAOReturnVmTemplate(); + mockDiskImageDAOGetSnapshotById(); + mockVerifyAddVM(cmd); + mockConfig(); + mockConfigSizeDefaults(); + mockMaxPciSlots(); + mockStorageDomainDaoGetAllStoragesForPool(20); + mockDisplayTypes(vm.getOs(), vdsGroup.getcompatibility_version()); + mockUninterestingMethods(cmd); + mockGetAllSnapshots(cmd); + when(osRepository.getArchitectureFromOS(0)).thenReturn(ArchitectureType.x86_64); + + // prepare the mock values + HashMap<Pair<Integer, Version>, Set<String>> unsupported = new HashMap<>(); + HashSet<String> value = new HashSet<>(); + value.add(null); + unsupported.put(new Pair<>(vm.getVmOsId(), vdsGroup.getcompatibility_version()), value); + + when(osRepository.isCpuSupported(vm.getVmOsId(), vdsGroup.getcompatibility_version(), null)).thenReturn(false); + when(osRepository.getUnsupportedCpus()).thenReturn(unsupported); + + CanDoActionTestUtils.runAndAssertCanDoActionFailure( + cmd, + VdcBllMessages.CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS); + } + private void mockDisplayTypes(int osId, Version clusterVersion) { Map<Integer, Map<Version, List<DisplayType>>> displayTypeMap = new HashMap<>(); diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java index 9fb9d91..1b1d037 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -16,6 +17,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.junit.Before; import org.junit.ClassRule; @@ -40,6 +42,7 @@ import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.osinfo.OsRepository; +import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.utils.SimpleDependecyInjector; import org.ovirt.engine.core.common.utils.customprop.ValidationError; import org.ovirt.engine.core.compat.Guid; @@ -120,6 +123,7 @@ when(osRepository.getMaximumRam(osId, null)).thenReturn(256); when(osRepository.isWindows(osId)).thenReturn(false); when(osRepository.getArchitectureFromOS(osId)).thenReturn(ArchitectureType.x86_64); + when(osRepository.isCpuSupported(anyInt(), any(Version.class), anyString())).thenReturn(true); Map<Integer, Map<Version, List<DisplayType>>> displayTypeMap = new HashMap<>(); displayTypeMap.put(osId, new HashMap<Version, List<DisplayType>>()); @@ -304,6 +308,24 @@ CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); } + @Test + public void testUnsupportedCpus() { + prepareVmToPassCanDoAction(); + + // prepare the mock values + HashMap<Pair<Integer, Version>, Set<String>> unsupported = new HashMap<>(); + HashSet<String> value = new HashSet<>(); + value.add(null); + unsupported.put(new Pair<>(0, Version.v3_0), value); + + when(osRepository.isCpuSupported(0, Version.v3_0, null)).thenReturn(false); + when(osRepository.getUnsupportedCpus()).thenReturn(unsupported); + + CanDoActionTestUtils.runAndAssertCanDoActionFailure( + command, + VdcBllMessages.CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS); + } + public void testCannotUpdateOSNotSupportVirtioScsi() { prepareVmToPassCanDoAction(); group.setcompatibility_version(Version.v3_3); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index d3ee139..85dace5 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -1057,7 +1057,9 @@ // Kdump detection KDUMP_DETECTION_NOT_ENABLED_FOR_VDS(ErrorType.BAD_PARAMETERS), - KDUMP_DETECTION_NOT_CONFIGURED_ON_VDS(ErrorType.BAD_PARAMETERS); + KDUMP_DETECTION_NOT_CONFIGURED_ON_VDS(ErrorType.BAD_PARAMETERS), + + CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS(ErrorType.BAD_PARAMETERS); private ErrorType messageType; diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index 274176c..338566e 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -1265,3 +1265,4 @@ KDUMP_DETECTION_NOT_ENABLED_FOR_VDS=Cannot ${action} ${type}. Kdump integration is not enabled for host '${VdsName}'. KDUMP_DETECTION_NOT_CONFIGURED_ON_VDS=Cannot ${action} ${type}. Kdump is not properly configured on host '${VdsName}'. +CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS=The guest OS doesn't support the following CPUs: ${unsupportedCpus}. Its possible to change the cluster cpu or set a different one per VM. diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index 5cd5dd8..60f81ec 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -3363,4 +3363,7 @@ @DefaultStringValue("Cannot ${action} ${type}. Plugged and unlinked VM network interface with external network is not supported.") String PLUGGED_UNLINKED_VM_INTERFACE_WITH_EXTERNAL_NETWORK_IS_NOT_SUPPORTED(); + + @DefaultStringValue("The guest OS doesn't support the following CPUs: ${unsupportedCpus}. Its possible to change the cluster cpu or set a different one per VM") + String CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS(); } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index b999f3e..b569c4c 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1052,3 +1052,4 @@ KDUMP_DETECTION_NOT_ENABLED_FOR_VDS=Cannot ${action} ${type}. Kdump integration is not enabled for host '${VdsName}'. KDUMP_DETECTION_NOT_CONFIGURED_ON_VDS=Cannot ${action} ${type}. Kdump is not properly configured on host '${VdsName}'. +CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS=The guest OS doesn't support the following CPUs: ${unsupportedCpus}. Its possible to change the cluster cpu or set a different one per VM diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 07c5c18..57940ba 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1226,3 +1226,4 @@ KDUMP_DETECTION_NOT_ENABLED_FOR_VDS=Cannot ${action} ${type}. Kdump integration is not enabled for host '${VdsName}'. KDUMP_DETECTION_NOT_CONFIGURED_ON_VDS=Cannot ${action} ${type}. Kdump is not properly configured on host '${VdsName}'. +CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS=The guest OS doesn't support the following CPUs: ${unsupportedCpus}. Its possible to change the cluster cpu or set a different one per VM -- To view, visit http://gerrit.ovirt.org/33230 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id1d22994c59b16d1d71d2315882d41454079bf32 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Roy Golan <rgo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches