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
