Daniel Erez has uploaded a new change for review.

Change subject: core: block virtio-scsi for unsupported OSes
......................................................................

core: block virtio-scsi for unsupported OSes

Block VirtIO-SCSI for unsupported operation systems:
* Added isOsTypeSupportedForVirtioScsi method to VmHandler.
* Added an appropriate VdcBllMessage.
* Modified AddVmCommand and UpdateVmCommand accordingly.
* Updated tests.

Change-Id: Id9907d35b53c0447662bc638146c4c61ac5cce8a
Bug-Url: https://bugzilla.redhat.com/1038613
Signed-off-by: Daniel Erez <de...@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/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
10 files changed, 107 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/22648/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 8e83341..d4bf8b0 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
@@ -22,6 +22,7 @@
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.bll.validator.VmWatchdogValidator;
+import org.ovirt.engine.core.bll.validator.VmValidationUtils;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.VdcObjectType;
@@ -459,9 +460,17 @@
             return failCanDoAction(VdcBllMessages.QOS_CPU_SHARES_OUT_OF_RANGE);
         }
 
-        if (Boolean.TRUE.equals(getParameters().isVirtioScsiEnabled()) &&
-                
!FeatureSupported.virtIoScsi(getVdsGroup().getcompatibility_version())) {
-            return 
failCanDoAction(VdcBllMessages.VIRTIO_SCSI_INTERFACE_IS_NOT_AVAILABLE_FOR_CLUSTER_LEVEL);
+        if (Boolean.TRUE.equals(getParameters().isVirtioScsiEnabled())) {
+            // Verify cluster compatibility
+            if 
(!FeatureSupported.virtIoScsi(getVdsGroup().getcompatibility_version())) {
+                return 
failCanDoAction(VdcBllMessages.VIRTIO_SCSI_INTERFACE_IS_NOT_AVAILABLE_FOR_CLUSTER_LEVEL);
+            }
+
+            // Verify OS compatibility
+            if 
(!VmHandler.isOsTypeSupportedForVirtioScsi(vmFromParams.getOs(), 
getVdsGroup().getcompatibility_version(),
+                    getReturnValue().getCanDoActionMessages())) {
+                return false;
+            }
         }
 
         return true;
@@ -1048,8 +1057,11 @@
 
     protected boolean isVirtioScsiEnabled() {
         Boolean virtioScsiEnabled = getParameters().isVirtioScsiEnabled();
+        boolean isOsSupportedForVirtIoScsi = 
VmValidationUtils.isOsSupportedForVirtIoScsi(
+                getParameters().getVm().getOs(), 
getVdsGroup().getcompatibility_version());
+
         return virtioScsiEnabled != null ? virtioScsiEnabled :
-                
FeatureSupported.virtIoScsi(getVdsGroup().getcompatibility_version());
+                
FeatureSupported.virtIoScsi(getVdsGroup().getcompatibility_version()) && 
isOsSupportedForVirtIoScsi;
     }
 
     protected boolean hasWatchdog() {
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 921bef7..0790f54 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
@@ -367,9 +367,17 @@
             return failCanDoAction(VdcBllMessages.QOS_CPU_SHARES_OUT_OF_RANGE);
         }
 
-        if (Boolean.TRUE.equals(getParameters().isVirtioScsiEnabled()) &&
-                
!FeatureSupported.virtIoScsi(getVdsGroup().getcompatibility_version())) {
-            return 
failCanDoAction(VdcBllMessages.VIRTIO_SCSI_INTERFACE_IS_NOT_AVAILABLE_FOR_CLUSTER_LEVEL);
+        if (Boolean.TRUE.equals(getParameters().isVirtioScsiEnabled()) || 
isVirtioScsiEnabledForVm(getVmId())) {
+            // Verify cluster compatibility
+            if 
(!FeatureSupported.virtIoScsi(getVdsGroup().getcompatibility_version())) {
+                return 
failCanDoAction(VdcBllMessages.VIRTIO_SCSI_INTERFACE_IS_NOT_AVAILABLE_FOR_CLUSTER_LEVEL);
+            }
+
+            // Verify OS compatibility
+            if 
(!VmHandler.isOsTypeSupportedForVirtioScsi(vmFromParams.getOs(), 
getVdsGroup().getcompatibility_version(),
+                    getReturnValue().getCanDoActionMessages())) {
+                return false;
+            }
         }
 
         if (Boolean.FALSE.equals(getParameters().isVirtioScsiEnabled())) {
@@ -545,8 +553,11 @@
 
     protected boolean isVirtioScsiEnabled() {
         Boolean virtioScsiEnabled = getParameters().isVirtioScsiEnabled();
-        return virtioScsiEnabled != null ? virtioScsiEnabled :
-                VmDeviceUtils.isVirtioScsiControllerAttached(getVmId());
+        return virtioScsiEnabled != null ? virtioScsiEnabled : 
isVirtioScsiEnabledForVm(getVmId());
+    }
+
+    public boolean isVirtioScsiEnabledForVm(Guid vmId) {
+        return VmDeviceUtils.isVirtioScsiControllerAttached(vmId);
     }
 
     protected boolean hasWatchdog() {
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 ec7a2b7..5da78ca 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
@@ -392,6 +392,27 @@
     }
 
     /**
+     * Check if the OS type is supported for VirtIO-SCSI.
+     *
+     * @param osId
+     *            Type of the OS
+     * @param clusterVersion
+     *            Cluster's version
+     * @param reasons
+     *            Reasons List
+     * @return
+     */
+    public static boolean isOsTypeSupportedForVirtioScsi(int osId,
+                                            Version clusterVersion,
+                                            List<String> reasons) {
+        boolean result = VmValidationUtils.isOsSupportedForVirtIoScsi(osId, 
clusterVersion);
+        if (!result) {
+            
reasons.add(VdcBllMessages.ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI.toString());
+        }
+        return result;
+    }
+
+    /**
      * Check if the interface name is not duplicate in the list of interfaces.
      *
      * @param interfaces
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 6df2a9e..b395558 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
@@ -221,9 +221,37 @@
     }
 
     @Test
+    public void canAddVmWithVirtioScsiControllerNotSupportedOs() {
+        VM vm = createVm();
+        AddVmFromTemplateCommand<AddVmFromTemplateParameters> cmd = 
createVmFromTemplateCommand(vm);
+
+        mockOsRepository();
+        mockStorageDomainDAOGetForStoragePool();
+        mockVmTemplateDAOReturnVmTemplate();
+        mockDiskImageDAOGetSnapshotById();
+        mockVerifyAddVM(cmd);
+        mockConfig();
+        mockConfigSizeDefaults();
+        mockStorageDomainDaoGetAllStoragesForPool(20);
+        mockUninterestingMethods(cmd);
+        doReturn(true).when(cmd).checkCpuSockets();
+
+        doReturn(createVdsGroup()).when(cmd).getVdsGroup();
+        cmd.getParameters().setVirtioScsiEnabled(true);
+        when(osRepository.getDiskInterfaces(any(Integer.class), 
any(Version.class))).thenReturn(
+                new ArrayList<>(Arrays.asList("VirtIO")));
+
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd,
+                
VdcBllMessages.ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI);
+    }
+
+    @Test
     public void isVirtioScsiEnabledDefaultedToTrue() {
+        mockOsRepository();
         AddVmCommand<VmManagementParametersBase> cmd = setupCanAddVmTests(0, 
0);
         doReturn(createVdsGroup()).when(cmd).getVdsGroup();
+        when(osRepository.getDiskInterfaces(any(Integer.class), 
any(Version.class))).thenReturn(
+                new ArrayList<>(Arrays.asList("VirtIO_SCSI")));
         assertTrue("isVirtioScsiEnabled hasn't been defaulted to true on 
cluster >= 3.3.", cmd.isVirtioScsiEnabled());
     }
 
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 828bc92..84f365b 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
@@ -9,6 +9,7 @@
 import static org.mockito.Mockito.when;
 import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
@@ -78,6 +79,9 @@
             mockConfig(ConfigValues.MaxNumOfVmCpus, "3.0", 16),
             mockConfig(ConfigValues.MaxNumOfVmSockets, "3.0", 16),
             mockConfig(ConfigValues.MaxNumOfCpuPerSocket, "3.0", 16),
+            mockConfig(ConfigValues.MaxNumOfVmCpus, "3.3", 16),
+            mockConfig(ConfigValues.MaxNumOfVmSockets, "3.3", 16),
+            mockConfig(ConfigValues.MaxNumOfCpuPerSocket, "3.3", 16),
             mockConfig(ConfigValues.VirtIoScsiEnabled, 
Version.v3_3.toString(), true)
             );
 
@@ -111,6 +115,8 @@
             }
         });
         doReturn(vm).when(command).getVm();
+
+        
doReturn(false).when(command).isVirtioScsiEnabledForVm(any(Guid.class));
     }
 
     @Test
@@ -235,6 +241,19 @@
                 VdcBllMessages.CANNOT_DISABLE_VIRTIO_SCSI_PLUGGED_DISKS);
     }
 
+    @Test
+    public void testCannotUpdateOSNotSupportVirtioScsi() {
+        prepareVmToPassCanDoAction();
+        group.setcompatibility_version(Version.v3_3);
+
+        
when(command.isVirtioScsiEnabledForVm(any(Guid.class))).thenReturn(true);
+        when(osRepository.getDiskInterfaces(any(Integer.class), 
any(Version.class))).thenReturn(
+                new ArrayList<>(Arrays.asList("VirtIO")));
+
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(command,
+                
VdcBllMessages.ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI);
+    }
+
     private void prepareVmToPassCanDoAction() {
         vmStatic.setName("vm1");
         vmStatic.setMemSizeMb(256);
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 fd7125c..1e6d0a1 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
@@ -229,6 +229,7 @@
     
ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_DISPLAY_TYPE(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_NOT_SUPPORTED_BY_ARCHITECTURE_TYPE(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_ILLEGAL_WATCHDOG_MODEL_IS_NOT_SUPPORTED_BY_OS(ErrorType.BAD_PARAMETERS),
+    
ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_OS_TYPE(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_INCOMPATIBLE_VERSION(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_ILLEGAL_DOMAIN_NAME(ErrorType.BAD_PARAMETERS),
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 1f13889..2515055 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -601,6 +601,7 @@
 ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_DISPLAY_TYPE=Cannot ${action} 
${type}. Cannot set single display device via VNC display.
 
ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_NOT_SUPPORTED_BY_ARCHITECTURE_TYPE=Cannot 
${action} ${type}. Selected operating system is not supported by the 
architecture.
 ACTION_TYPE_FAILED_ILLEGAL_WATCHDOG_MODEL_IS_NOT_SUPPORTED_BY_OS=Cannot 
${action} ${type}. Selected watchdog model is not supported by the operating 
system.
+ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI=Cannot 
${action} ${type}. Selected operating system does not support VirtIO-SCSI. 
Please disable VirtIO-SCSI for the VM.
 ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_INCOMPATIBLE_VERSION=Cannot ${action} 
${type}. Cluster does not support Single Qxl Pci devices.
 ACTION_TYPE_FAILED_ILLEGAL_DOMAIN_NAME=Cannot ${action} ${type}. Illegal 
Domain name: ${Domain}. Domain name has unsupported special character ${Char}.
 ACTION_TYPE_FAILED_ILLEGAL_ARCHITECTURE_TYPE_INCOMPATIBLE=Cannot ${action} 
${type}. Architecture does not match the expected value.
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 17a88a0..6efe329 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
@@ -1627,6 +1627,9 @@
     @DefaultStringValue("Cannot ${action} ${type}. Selected watchdog model is 
not supported by the operating system.")
     String ACTION_TYPE_FAILED_ILLEGAL_WATCHDOG_MODEL_IS_NOT_SUPPORTED_BY_OS();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Selected operating system 
does not support VirtIO-SCSI. Please disable VirtIO-SCSI for the VM.")
+    String 
ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI();
+
     @DefaultStringValue("Cannot ${action} ${type}. Cannot set single display 
device to non Linux operating system.")
     String ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_OS_TYPE();
 
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 63c2905..3fb2e24 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
@@ -582,6 +582,7 @@
 ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_DISPLAY_TYPE=Cannot ${action} 
${type}. Cannot set single display device via VNC display.
 
ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_NOT_SUPPORTED_BY_ARCHITECTURE_TYPE=Cannot 
${action} ${type}. Selected operating system is not supported by the 
architecture.
 ACTION_TYPE_FAILED_ILLEGAL_WATCHDOG_MODEL_IS_NOT_SUPPORTED_BY_OS=Cannot 
${action} ${type}. Selected watchdog model is not supported by the operating 
system.
+ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI=Cannot 
${action} ${type}. Selected operating system does not support VirtIO-SCSI. 
Please disable VirtIO-SCSI for the VM.
 ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_INCOMPATIBLE_VERSION=Cannot ${action} 
${type}. Cluster does not support Single Qxl Pci devices.
 ACTION_TYPE_FAILED_ILLEGAL_DOMAIN_NAME=Cannot ${action} ${type}. Illegal 
Domain name: ${Domain}. Domain name has unsupported special character ${Char}.
 ACTION_TYPE_FAILED_ILLEGAL_ARCHITECTURE_TYPE_INCOMPATIBLE=Cannot ${action} 
${type}. Architecture does not match the expected value.
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 d656ae3..7994be6 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
@@ -601,6 +601,7 @@
 ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_DISPLAY_TYPE=Cannot ${action} 
${type}. Cannot set single display device via VNC display.
 
ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_NOT_SUPPORTED_BY_ARCHITECTURE_TYPE=Cannot 
${action} ${type}. Selected operating system is not supported by the 
architecture.
 ACTION_TYPE_FAILED_ILLEGAL_WATCHDOG_MODEL_IS_NOT_SUPPORTED_BY_OS=Cannot 
${action} ${type}. Selected watchdog model is not supported by the operating 
system.
+ACTION_TYPE_FAILED_ILLEGAL_OS_TYPE_IS_DOES_NOT_SUPPORT_VIRTIO_SCSI=Cannot 
${action} ${type}. Selected operating system does not support VirtIO-SCSI. 
Please disable VirtIO-SCSI for the VM.
 ACTION_TYPE_FAILED_ILLEGAL_SINGLE_DEVICE_INCOMPATIBLE_VERSION=Cannot ${action} 
${type}. Cluster does not support Single Qxl Pci devices.
 ACTION_TYPE_FAILED_ILLEGAL_DOMAIN_NAME=Cannot ${action} ${type}. Illegal 
Domain name: ${Domain}. Domain name has unsupported special character ${Char}.
 ACTION_TYPE_FAILED_ILLEGAL_ARCHITECTURE_TYPE_INCOMPATIBLE=Cannot ${action} 
${type}. Architecture does not match the expected value.


-- 
To view, visit http://gerrit.ovirt.org/22648
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id9907d35b53c0447662bc638146c4c61ac5cce8a
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <de...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to