Vitor de Lima has uploaded a new change for review.

Change subject: core, engine: Limit the number of SCSI and VirtIO blk devices
......................................................................

core, engine: Limit the number of SCSI and VirtIO blk devices

This change modifies the checkPciAndIdeLimit method to verify if the
VM being created or updated respects the maximum number of SCSI devices
that can be attached to both VirtIO SCSI and sPAPR VSCSI controllers.

The maximum allowed number of PCI devices is retrieved from the osinfo
in order to allow a larger value in architectures that have more
available virtual PCI slots than x86-64.

Change-Id: Ibd923ca7b48b65f700a1c7cf6d0d938f12ebe48c
Signed-off-by: Vitor de Lima <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractDiskVmCommand.java
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/UpdateVmDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/template/AddVmTemplateInterfaceCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepository.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImpl.java
M 
backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImplTest.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
M packaging/conf/osinfo-defaults.properties
20 files changed, 150 insertions(+), 34 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/30/20630/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractDiskVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractDiskVmCommand.java
index e98df03..325dcf1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractDiskVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractDiskVmCommand.java
@@ -104,11 +104,11 @@
         List<Disk> allVmDisks = new 
ArrayList<Disk>(getVm().getDiskMap().values());
         allVmDisks.add(diskInfo);
 
-        return checkPciAndIdeLimit(getVm().getNumOfMonitors(),
+        return checkPciAndIdeLimit(getVm().getOs(),
+                getVm().getVdsGroupCompatibilityVersion(),
+                getVm().getNumOfMonitors(),
                 vmInterfaces,
-                allVmDisks,
-                isVirtioScsiControllerAttached(getVmId()),
-                getReturnValue().getCanDoActionMessages());
+                allVmDisks, isVirtioScsiControllerAttached(getVmId()), 
getReturnValue().getCanDoActionMessages());
     }
 
     protected boolean isVirtioScsiControllerAttached(Guid vmId) {
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 9ec850a..06e90b1 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
@@ -248,11 +248,11 @@
 
         returnValue =
                 returnValue
-                        && 
checkPciAndIdeLimit(getParameters().getVmStaticData().getNumOfMonitors(),
+                        && checkPciAndIdeLimit(getParameters().getVm().getOs(),
+                                getVdsGroup().getcompatibility_version(),
+                                
getParameters().getVmStaticData().getNumOfMonitors(),
                                 getVmInterfaces(),
-                                getVmDisks(),
-                                isVirtioScsiEnabled(),
-                                getReturnValue().getCanDoActionMessages())
+                                getVmDisks(), isVirtioScsiEnabled(), 
getReturnValue().getCanDoActionMessages())
                         && canAddVm(getReturnValue().getCanDoActionMessages(), 
destStorages.values())
                         && hostToRunExist();
         return returnValue;
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 95459f2..a97aa64 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
@@ -291,11 +291,11 @@
         if (vmFromDB.getNumOfMonitors() < vmFromParams.getNumOfMonitors()) {
             List<Disk> allDisks = 
DbFacade.getInstance().getDiskDao().getAllForVm(getVmId());
             List<VmNic> interfaces = getVmNicDao().getAllForVm(getVmId());
-            if (!checkPciAndIdeLimit(vmFromParams.getNumOfMonitors(),
+            if (!checkPciAndIdeLimit(vmFromParams.getOs(),
+                    getVdsGroup().getcompatibility_version(),
+                    vmFromParams.getNumOfMonitors(),
                     interfaces,
-                    allDisks,
-                    isVirtioScsiEnabled(),
-                    getReturnValue().getCanDoActionMessages())) {
+                    allDisks, isVirtioScsiEnabled(), 
getReturnValue().getCanDoActionMessages())) {
                 return false;
             }
         }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
index 76fa063..7ed830c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
@@ -163,7 +163,11 @@
             List<Disk> allVmDisks = new 
LinkedList<Disk>(getOtherVmDisks(vm.getId()));
             allVmDisks.add(getNewDisk());
 
-            if (!checkPciAndIdeLimit(vm.getNumOfMonitors(), allVmInterfaces, 
allVmDisks,
+            if (!checkPciAndIdeLimit(vm.getOs(),
+                    vm.getVdsGroupCompatibilityVersion(),
+                    vm.getNumOfMonitors(),
+                    allVmInterfaces,
+                    allVmDisks,
                     VmDeviceUtils.isVirtioScsiControllerAttached(vm.getId()),
                     getReturnValue().getCanDoActionMessages())) {
                 return false;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
index 444939d..06efe59 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
@@ -32,6 +32,7 @@
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.core.dao.DiskDao;
 import org.ovirt.engine.core.dao.DiskImageDAO;
 import org.ovirt.engine.core.dao.ImageDao;
@@ -102,22 +103,28 @@
         return getTagDao().getAllForVm((getParameters()).getVmId().toString());
     }
 
-    // 26 PCI slots: 31 total minus 5 saved for qemu (Host Bridge, ISA Bridge,
-    // IDE, Agent, ACPI)
-    public final static int MAX_PCI_SLOTS = 26;
     // 3 IDE slots: 4 total minus 1 for CD
     public final static int MAX_IDE_SLOTS = 3;
+    // The maximum number of VirtIO SCSI disks that libvirt
+    // allows without creating another controller
+    public final static int MAX_VIRTIO_SCSI_DISKS = 6;
+    // The maximum number of sPAPR VSCSI disks that
+    // can be detected by the Linux kernel of PPC64 guests
+    public final static int MAX_SPAPR_SCSI_DISKS = 8;
 
     /**
      * This method checks that with the given parameters, the max PCI and IDE 
limits defined are not passed.
-     *
+     * 
+     * @param osId
+     * @param clusterVersion
      * @param monitorsNumber
      * @param interfaces
      * @param disks
+     * 
      * @return
      */
-    public static <T extends Disk> boolean checkPciAndIdeLimit(int 
monitorsNumber, List<VmNic> interfaces,
-            List<T> disks, boolean virtioScsiEnabled, ArrayList<String> 
messages) {
+    public static <T extends Disk> boolean checkPciAndIdeLimit(int osId, 
Version clusterVersion,
+            int monitorsNumber, List<VmNic> interfaces, List<T> disks, boolean 
virtioScsiEnabled, ArrayList<String> messages) {
         boolean result = true;
         // this adds: monitors + 2 * (interfaces with type rtl_pv) + (all other
         // interfaces) + (all disks that are not IDE)
@@ -141,7 +148,11 @@
         // VirtIO SCSI controller requires one PCI slot
         pciInUse += virtioScsiEnabled ? 1 : 0;
 
-        if (pciInUse > MAX_PCI_SLOTS) {
+        OsRepository osRepository = 
SimpleDependecyInjector.getInstance().get(OsRepository.class);
+
+        int maxPciSlots = osRepository.getMaxPciDevices(osId, clusterVersion);
+
+        if (pciInUse > maxPciSlots) {
             result = false;
             
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_EXCEEDED_MAX_PCI_SLOTS.name());
         }
@@ -154,6 +165,24 @@
             result = false;
             
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_EXCEEDED_MAX_IDE_SLOTS.name());
         }
+        else if (MAX_VIRTIO_SCSI_DISKS < LinqUtils.filter(disks, new 
Predicate<T>() {
+            @Override
+            public boolean eval(T a) {
+                return a.getDiskInterface() == DiskInterface.VirtIO_SCSI;
+            }
+        }).size()) {
+            result = false;
+            
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_EXCEEDED_MAX_VIRTIO_SCSI_DISKS.name());
+        }
+        else if (MAX_SPAPR_SCSI_DISKS < LinqUtils.filter(disks, new 
Predicate<T>() {
+            @Override
+            public boolean eval(T a) {
+                return a.getDiskInterface() == DiskInterface.SPAPR_VSCSI;
+            }
+        }).size()) {
+            result = false;
+            
messages.add(VdcBllMessages.ACTION_TYPE_FAILED_EXCEEDED_MAX_SPAPR_VSCSI_DISKS.name());
+        }
         return result;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/template/AddVmTemplateInterfaceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/template/AddVmTemplateInterfaceCommand.java
index 99ac590..d016919 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/template/AddVmTemplateInterfaceCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/template/AddVmTemplateInterfaceCommand.java
@@ -59,11 +59,11 @@
 
         VmTemplateHandler.UpdateDisksFromDb(getVmTemplate());
 
-        if (!VmCommand.checkPciAndIdeLimit(getVmTemplate().getNumOfMonitors(),
-                
Collections.<VmNic>singletonList(getParameters().getInterface()),
-                new ArrayList<DiskImageBase>(getVmTemplate().getDiskList()),
-                    VmDeviceUtils.isVirtioScsiControllerAttached(getVmId()),
-                    getReturnValue().getCanDoActionMessages())) {
+        if (!VmCommand.checkPciAndIdeLimit(getVmTemplate().getOsId(),
+                getVdsGroup().getcompatibility_version(),
+                getVmTemplate().getNumOfMonitors(),
+                    
Collections.<VmNic>singletonList(getParameters().getInterface()),
+                    new 
ArrayList<DiskImageBase>(getVmTemplate().getDiskList()), 
VmDeviceUtils.isVirtioScsiControllerAttached(getVmId()), 
getReturnValue().getCanDoActionMessages())) {
             return false;
         }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java
index f4abe73..9477ae3 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java
@@ -13,8 +13,8 @@
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
-import org.ovirt.engine.core.common.businessentities.VmStatic;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
 import org.ovirt.engine.core.common.businessentities.network.VmNic;
 import org.ovirt.engine.core.common.config.Config;
@@ -80,12 +80,14 @@
                 getReturnValue().getCanDoActionMessages());
     }
 
-    protected boolean pciAndIdeWithinLimit(VmStatic vm, List<VmNic> 
allInterfaces) {
+    protected boolean pciAndIdeWithinLimit(VM vm, List<VmNic> allInterfaces) {
         List<Disk> allDisks = getDiskDao().getAllForVm(getVmId());
 
-        return checkPciAndIdeLimit(vm.getNumOfMonitors(), allInterfaces, 
allDisks,
-                VmDeviceUtils.isVirtioScsiControllerAttached(getVmId()),
-                getReturnValue().getCanDoActionMessages());
+        return checkPciAndIdeLimit(vm.getOs(),
+                vm.getVdsGroupCompatibilityVersion(),
+                vm.getNumOfMonitors(),
+                allInterfaces,
+                allDisks, 
VmDeviceUtils.isVirtioScsiControllerAttached(getVmId()), 
getReturnValue().getCanDoActionMessages());
     }
 
     protected ValidationResult vmTemplateEmpty() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java
index 8f5b89d..9fc54f1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java
@@ -122,7 +122,7 @@
         }
 
         // check that not exceeded PCI and IDE limit
-        if (!pciAndIdeWithinLimit(vm, Collections.<VmNic> 
singletonList(getInterface()))) {
+        if (!pciAndIdeWithinLimit(getVm(), Collections.<VmNic> 
singletonList(getInterface()))) {
             return false;
         }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java
index b8a54ab..2e22617 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java
@@ -183,7 +183,7 @@
         allInterfaces.add(getInterface());
         VmStatic vm = getVmStaticDAO().get(getVmId());
 
-        if (!pciAndIdeWithinLimit(vm, allInterfaces)) {
+        if (!pciAndIdeWithinLimit(getVm(), allInterfaces)) {
             return false;
         }
 
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java
index c6445cf..595d483 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddDiskToVmCommandTest.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.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
@@ -62,6 +63,7 @@
 public class AddDiskToVmCommandTest {
     private static int MAX_BLOCK_SIZE = 8192;
     private static int FREE_SPACE_CRITICAL_LOW_IN_GB = 5;
+    private static int MAX_PCI_SLOTS = 26;
 
     @ClassRule
     public static MockConfigRule mcr = new MockConfigRule(
@@ -107,6 +109,7 @@
         mockVm();
         mockStorageDomain(storageId);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         runAndAssertCanDoActionSuccess();
     }
@@ -119,6 +122,7 @@
         mockVmWithDisk(storageId);
         mockStorageDomain(storageId);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         runAndAssertCanDoActionSuccess();
     }
@@ -131,6 +135,7 @@
         mockVmWithDisk(storageId);
         mockStorageDomain(storageId);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         runAndAssertCanDoActionSuccess();
     }
@@ -143,6 +148,7 @@
         mockVmWithDisk(Guid.newGuid());
         mockStorageDomain(storageId);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         assertTrue(command.canDoAction());
     }
@@ -169,6 +175,7 @@
         mockVm();
         mockStorageDomain(sdid, availableSize, usedSize);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         assertTrue(command.canDoAction());
     }
@@ -183,6 +190,7 @@
         mockVm();
         mockStorageDomain(sdid, availableSize, usedSize);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         assertFalse(command.canDoAction());
         assertTrue(command.getReturnValue()
@@ -200,6 +208,8 @@
         mockVm();
         mockStorageDomain(sdid, availableSize, usedSize);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
+
         assertTrue(command.canDoAction());
     }
 
@@ -213,6 +223,7 @@
         mockVm();
         mockStorageDomain(sdid, availableSize, usedSize);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         assertFalse(command.canDoAction());
         assertTrue(command.getReturnValue()
@@ -233,6 +244,7 @@
         mockVm();
         mockStorageDomain(storageId, StorageType.ISCSI);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         runAndAssertCanDoActionSuccess();
     }
@@ -250,6 +262,7 @@
         mockVm();
         mockStorageDomain(storageId, StorageType.ISCSI);
         mockStoragePoolIsoMap();
+        mockMaxPciSlots();
 
         assertFalse(command.canDoAction());
         assertTrue(command.getReturnValue()
@@ -374,6 +387,11 @@
         
when(snapshotsValidator.vmNotDuringSnapshot(any(Guid.class))).thenReturn(ValidationResult.VALID);
         
when(snapshotsValidator.vmNotInPreview(any(Guid.class))).thenReturn(ValidationResult.VALID);
         return snapshotsValidator;
+    }
+
+    private void mockMaxPciSlots() {
+        SimpleDependecyInjector.getInstance().bind(OsRepository.class, 
osRepository);
+        doReturn(MAX_PCI_SLOTS).when(osRepository).getMaxPciDevices(anyInt(), 
any(Version.class));
     }
 
     private DiskValidator spyDiskValidator(Disk disk) {
@@ -589,6 +607,8 @@
         
when(diskLunMapDAO.getDiskIdByLunId(disk.getLun().getLUN_id())).thenReturn(null);
         VM vm = mockVm();
 
+        mockMaxPciSlots();
+
         // use maximum slots for IDE - canDo expected to succeed.
         fillDiskMap(disk, vm, VmCommand.MAX_IDE_SLOTS - 1);
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
@@ -608,8 +628,10 @@
         
when(diskLunMapDAO.getDiskIdByLunId(disk.getLun().getLUN_id())).thenReturn(null);
         VM vm = mockVm();
 
+        mockMaxPciSlots();
+
         // use maximum slots for PCI. canDo expected to succeed.
-        fillDiskMap(disk, vm, VmCommand.MAX_PCI_SLOTS - 2);
+        fillDiskMap(disk, vm, MAX_PCI_SLOTS - 2);
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
 
         vm.getDiskMap().put(Guid.newGuid(), disk);
@@ -637,6 +659,8 @@
         uniqueOsNames.put(7, "RHEL5");
         when(osRepository.getUniqueOsNames()).thenReturn(uniqueOsNames);
 
+        mockMaxPciSlots();
+
         vm.setVmOs(7);
 
         DiskValidator diskValidator = spyDiskValidator(disk);
@@ -659,6 +683,8 @@
 
         VM vm = mockVm();
         vm.setVdsGroupCompatibilityVersion(Version.v3_3);
+
+        mockMaxPciSlots();
 
         DiskValidator diskValidator = spyDiskValidator(disk);
         
doReturn(false).when(diskValidator).isVirtioScsiControllerAttached(any(Guid.class));
@@ -683,6 +709,8 @@
         VM vm = mockVm();
         vm.setVdsGroupCompatibilityVersion(Version.v3_3);
 
+        mockMaxPciSlots();
+
         DiskValidator diskValidator = spyDiskValidator(disk);
         
doReturn(true).when(diskValidator).isVirtioScsiControllerAttached(any(Guid.class));
 
@@ -703,6 +731,8 @@
         VM vm = mockVm();
         vm.setVdsGroupCompatibilityVersion(Version.v3_3);
 
+        mockMaxPciSlots();
+
         DiskValidator diskValidator = spyDiskValidator(disk);
         
doReturn(true).when(diskValidator).isVirtioScsiControllerAttached(any(Guid.class));
 
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 d943114..cdcf349 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
@@ -47,6 +47,8 @@
 import org.ovirt.engine.core.common.config.ConfigValues;
 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.SimpleDependecyInjector;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSParametersBase;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
@@ -67,6 +69,7 @@
     private static final int REQUIRED_DISK_SIZE_GB = 10;
     private static final int AVAILABLE_SPACE_GB = 11;
     private static final int USED_SPACE_GB = 4;
+    private static int MAX_PCI_SLOTS = 26;
     private static final Guid STORAGE_POOL_ID = Guid.newGuid();
     private static final Guid STORAGE_DOMAIN_ID = Guid.newGuid();
     private VmTemplate vmTemplate = null;
@@ -99,6 +102,9 @@
     @Mock
     SnapshotDao snapshotDao;
 
+    @Mock
+    OsRepository osRepository;
+
     @Test
     public void create10GBVmWith11GbAvailableAndA5GbBuffer() throws Exception {
         VM vm = createVm();
@@ -111,6 +117,7 @@
         mockVerifyAddVM(cmd);
         mockConfig();
         mockConfigSizeDefaults();
+        mockMaxPciSlots();
 
         mockStorageDomainDaoGetAllStoragesForPool(AVAILABLE_SPACE_GB);
         mockUninterestingMethods(cmd);
@@ -228,6 +235,11 @@
         doReturn(null).when(cmd).getVmFromConfiguration();
     }
 
+    private void mockMaxPciSlots() {
+        SimpleDependecyInjector.getInstance().bind(OsRepository.class, 
osRepository);
+        doReturn(MAX_PCI_SLOTS).when(osRepository).getMaxPciDevices(anyInt(), 
any(Version.class));
+    }
+
     private AddVmFromTemplateCommand<AddVmFromTemplateParameters> 
createVmFromTemplateCommand(VM vm) {
         AddVmFromTemplateParameters param = new AddVmFromTemplateParameters();
         param.setVm(vm);
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 db7e57c..4ca4619 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
@@ -159,6 +159,8 @@
     ACTION_TYPE_FAILED_DELETE_PROTECTION_ENABLED(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_EXCEEDED_MAX_PCI_SLOTS(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_EXCEEDED_MAX_IDE_SLOTS(ErrorType.CONFLICT),
+    ACTION_TYPE_FAILED_EXCEEDED_MAX_VIRTIO_SCSI_DISKS(ErrorType.CONFLICT),
+    ACTION_TYPE_FAILED_EXCEEDED_MAX_SPAPR_VSCSI_DISKS(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_DISK_BOOT_IN_USE(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_VMS_BOOT_IN_USE(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_DISK_ALREADY_ATTACHED(ErrorType.CONFLICT),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepository.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepository.java
index 80aad44..36d3033 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepository.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepository.java
@@ -117,6 +117,13 @@
     /**
      * @param osId
      * @param version
+     * @return the maximum allowed number of PCI devices
+     */
+    public int getMaxPciDevices(int osId, Version Version);
+
+    /**
+     * @param osId
+     * @param version
      * @return a specific Cd Interface for the given os.
      */
     String getCdInterface(int osId, Version version);
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImpl.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImpl.java
index 9d462c2..db954dc 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImpl.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImpl.java
@@ -194,6 +194,11 @@
     }
 
     @Override
+    public int getMaxPciDevices(int osId, Version version) {
+        return getInt(getValueByVersion(idToUnameLookup.get(osId), 
"devices.maxPciDevices", version), -1);
+    }
+
+    @Override
     public String getCdInterface(int osId, Version version) {
         return getValueByVersion(idToUnameLookup.get(osId), 
"devices.cdInterface", version);
     }
diff --git 
a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImplTest.java
 
b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImplTest.java
index e74d1fb..2853a97 100644
--- 
a/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImplTest.java
+++ 
b/backend/manager/modules/common/src/test/java/org/ovirt/engine/core/common/osinfo/OsRepositoryImplTest.java
@@ -15,6 +15,7 @@
     private static MapBackedPreferences preferences;
 
     public static final String NETWORK_DEVICES = "e100,pv";
+    public static final String MAX_PCI_DEVICES = "26";
     public static final String PATH_TO_SYSPREP = "/path/to/sysprep";
     public static final String SOME_PRODUCT_KEY = "some-product-key";
     public static final String SOUND_DEVICE = "ac97";
@@ -28,6 +29,7 @@
         preferences.node("/os/rhel7/family").put("value", "linux");
         preferences.node("/os/rhel7/bus").put("value", "64");
         preferences.node("/os/rhel7/devices/network").put("value", 
NETWORK_DEVICES);
+        preferences.node("/os/rhel7/devices/maxPciDevices").put("value", 
MAX_PCI_DEVICES);
         preferences.node("/os/rhel7/resources/minimum/ram").put("value", 
"1024");
         preferences.node("/os/rhel7/resources/minimum/ram").put("value.3.1", 
"512");
         preferences.node("/os/rhel7/resources/maximum/ram").put("value", 
"2048");
@@ -116,6 +118,11 @@
     }
 
     @Test
+    public void testGetMaxPciDevices() throws Exception {
+        assertTrue(OsRepositoryImpl.INSTANCE.getMaxPciDevices(777, null) == 
26);
+    }
+
+    @Test
     public void testHasSpiceSupport() throws Exception {
         
assertTrue(OsRepositoryImpl.INSTANCE.getSpiceSupportMatrix().get(777).get(null));
     }
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 aa2f264..1ed1ed8 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -339,6 +339,8 @@
 ACTION_TYPE_FAILED_CPU_NOT_FOUND=Cannot ${action} ${type}. The chosen CPU is 
not supported.
 ACTION_TYPE_FAILED_EXCEEDED_MAX_PCI_SLOTS=Cannot ${action} ${type}. Maximum 
PCI devices exceeded.
 ACTION_TYPE_FAILED_EXCEEDED_MAX_IDE_SLOTS=Cannot ${action} ${type}. Maximum 
IDE devices exceeded.
+ACTION_TYPE_FAILED_EXCEEDED_MAX_VIRTIO_SCSI_DISKS=Cannot ${action} ${type}. 
Maximum VirtIO SCSI devices exceeded.
+ACTION_TYPE_FAILED_EXCEEDED_MAX_SPAPR_VSCSI_DISKS=Cannot ${action} ${type}. 
Maximum sPAPR VSCSI devices exceeded.
 USER_CANNOT_ATTACH_TO_VM_ALREADY_ATTACHED=User is already attached to VM
 USER_CANNOT_ATTACH_TO_VM_NOT_ATTACHED=The user is not attached to this VM.
 USER_FAILED_TO_AUTHENTICATE=Login failed. Please verify your login information 
or contact the system administrator.
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 cec6a02..4574219 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
@@ -964,6 +964,12 @@
     @DefaultStringValue("Cannot ${action} ${type}. Maximum IDE devices 
exceeded.")
     String ACTION_TYPE_FAILED_EXCEEDED_MAX_IDE_SLOTS();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Maximum VirtIO SCSI devices 
exceeded.")
+    String ACTION_TYPE_FAILED_EXCEEDED_MAX_VIRTIO_SCSI_DISKS();
+
+    @DefaultStringValue("Cannot ${action} ${type}. Maximum sPAPR VSCSI devices 
exceeded.")
+    String ACTION_TYPE_FAILED_EXCEEDED_MAX_SPAPR_VSCSI_DISKS();
+
     @DefaultStringValue("User is already attached to VM")
     String USER_CANNOT_ATTACH_TO_VM_ALREADY_ATTACHED();
 
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 059d1aa..0266248 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
@@ -320,6 +320,8 @@
 ACTION_TYPE_FAILED_CPU_NOT_FOUND=Cannot ${action} ${type}. The chosen CPU is 
not supported.
 ACTION_TYPE_FAILED_EXCEEDED_MAX_PCI_SLOTS=Cannot ${action} ${type}. Maximum 
PCI devices exceeded.
 ACTION_TYPE_FAILED_EXCEEDED_MAX_IDE_SLOTS=Cannot ${action} ${type}. Maximum 
IDE devices exceeded.
+ACTION_TYPE_FAILED_EXCEEDED_MAX_VIRTIO_SCSI_DISKS=Cannot ${action} ${type}. 
Maximum VirtIO SCSI devices exceeded.
+ACTION_TYPE_FAILED_EXCEEDED_MAX_SPAPR_VSCSI_DISKS=Cannot ${action} ${type}. 
Maximum sPAPR VSCSI devices exceeded.
 USER_CANNOT_ATTACH_TO_VM_ALREADY_ATTACHED=User is already attached to VM
 USER_CANNOT_ATTACH_TO_VM_NOT_ATTACHED=The user is not attached to this VM.
 USER_FAILED_TO_AUTHENTICATE=Login failed. Please verify your login information 
or contact the system administrator.
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 33a4f56..bcfcfa7 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
@@ -342,6 +342,8 @@
 ACTION_TYPE_FAILED_CPU_NOT_FOUND=Cannot ${action} ${type}. The chosen CPU is 
not supported.
 ACTION_TYPE_FAILED_EXCEEDED_MAX_PCI_SLOTS=Cannot ${action} ${type}. Maximum 
PCI devices exceeded.
 ACTION_TYPE_FAILED_EXCEEDED_MAX_IDE_SLOTS=Cannot ${action} ${type}. Maximum 
IDE devices exceeded.
+ACTION_TYPE_FAILED_EXCEEDED_MAX_VIRTIO_SCSI_DISKS=Cannot ${action} ${type}. 
Maximum VirtIO SCSI devices exceeded.
+ACTION_TYPE_FAILED_EXCEEDED_MAX_SPAPR_VSCSI_DISKS=Cannot ${action} ${type}. 
Maximum sPAPR VSCSI devices exceeded.
 USER_CANNOT_ATTACH_TO_VM_ALREADY_ATTACHED=User is already attached to VM
 USER_CANNOT_ATTACH_TO_VM_NOT_ATTACHED=The user is not attached to this VM.
 USER_FAILED_TO_AUTHENTICATE=Login failed. Please verify your login information 
or contact the system administrator.
diff --git a/packaging/conf/osinfo-defaults.properties 
b/packaging/conf/osinfo-defaults.properties
index a031751..4bb4b56 100644
--- a/packaging/conf/osinfo-defaults.properties
+++ b/packaging/conf/osinfo-defaults.properties
@@ -52,6 +52,9 @@
 os.other.devices.cdInterface.value = ide
 os.other.devices.diskInterfaces.value = IDE, VirtIO
 os.other.devices.diskInterfaces.value.3.3 = IDE, VirtIO_SCSI, VirtIO
+# 26 PCI slots: 31 total minus 5 saved for qemu (Host Bridge, ISA Bridge,
+# IDE, Agent, ACPI)
+os.other.devices.maxPciDevices.value = 26
 
 # Other OS type to PPC64 Architecture
 os.other_ppc64.id.value = 1001
@@ -63,7 +66,10 @@
 os.other_ppc64.devices.network.value = pv
 os.other_ppc64.devices.cdInterface.value = scsi
 os.other_ppc64.devices.diskInterfaces.value = VirtIO, VirtIO_SCSI
-
+# In the ppc64 architecture there are only three devices occupying
+# virtual PCI slots in a newly created VM, the USB controller,
+# the VirtIO balloon and the VirtIO serial channel
+os.other_ppc64.devices.maxPciDevices.value = 29
 
 os.linux.id.value = 100
 os.linux.name.value = Linux


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibd923ca7b48b65f700a1c7cf6d0d938f12ebe48c
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Vitor de Lima <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to