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

Reply via email to