Sergey Gotliv has uploaded a new change for review. Change subject: engine: Validate that IDE disk is not read-only ......................................................................
engine: Validate that IDE disk is not read-only Real IDE disks can't be read-only therefore Engine has to validate it. Change-Id: I441362adf2f4833b034ede4093fc8195debd2ed5 Bug-Url: https://bugzilla.redhat.com/1057546 Signed-off-by: Sergey Gotliv <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.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/validator/DiskValidator.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/UpdateVmDiskCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.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 11 files changed, 103 insertions(+), 15 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/58/24258/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java index 91d2428..10e3ca1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java @@ -100,20 +100,24 @@ return failCanDoAction(VdcBllMessages.CANNOT_ADD_FLOATING_DISK_WITH_PLUG_VM_SET); } + DiskValidator diskValidator = getDiskValidator(getParameters().getDiskInfo()); + if (!validate(diskValidator.isReadOnlyPropertyCompatibleWithInterface())) { + return false; + } + if (DiskStorageType.IMAGE == getParameters().getDiskInfo().getDiskStorageType()) { - return checkIfImageDiskCanBeAdded(vm); + return checkIfImageDiskCanBeAdded(vm, diskValidator); } if (DiskStorageType.LUN == getParameters().getDiskInfo().getDiskStorageType()) { - return checkIfLunDiskCanBeAdded(); + return checkIfLunDiskCanBeAdded(diskValidator); } return true; } - protected boolean checkIfLunDiskCanBeAdded() { + protected boolean checkIfLunDiskCanBeAdded(DiskValidator diskValidator) { LUNs lun = ((LunDisk) getParameters().getDiskInfo()).getLun(); - DiskValidator diskValidator = getDiskValidator(getParameters().getDiskInfo()); switch (lun.getLunType()) { case UNKNOWN: @@ -151,9 +155,8 @@ return true; } - private boolean checkIfImageDiskCanBeAdded(VM vm) { + private boolean checkIfImageDiskCanBeAdded(VM vm, DiskValidator diskValidator) { boolean returnValue; - DiskValidator diskValidator = getDiskValidator(getParameters().getDiskInfo()); StorageDomainValidator storageDomainValidator = createStorageDomainValidator(); // vm agnostic checks returnValue = 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 1d94e42..faeff2a 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 @@ -158,6 +158,7 @@ DiskValidator diskValidator = getDiskValidator(getNewDisk()); return validateCanUpdateShareable() && validateCanUpdateReadOnly() && validate(diskValidator.isVirtIoScsiValid(getVm())) && + validate(diskValidator.isReadOnlyPropertyCompatibleWithInterface()) && (getOldDisk().getDiskInterface() == getNewDisk().getDiskInterface() || validate(diskValidator.isDiskInterfaceSupported(getVm()))); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java index 244c1a7..855a4b8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/DiskValidator.java @@ -99,6 +99,14 @@ } + public ValidationResult isReadOnlyPropertyCompatibleWithInterface() { + if (Boolean.TRUE.equals(disk.getReadOnly()) && disk.getDiskInterface() == DiskInterface.IDE) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR); + } + + return ValidationResult.VALID; + } + protected VmDAO getVmDAO() { return DbFacade.getInstance().getVmDao(); } 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 999eddc..8086369 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 @@ -126,6 +126,7 @@ mockStorageDomain(storageId); mockStoragePoolIsoMap(); mockMaxPciSlots(); + when(diskValidator.isReadOnlyPropertyCompatibleWithInterface()).thenReturn(ValidationResult.VALID); when(diskValidator.isDiskInterfaceSupported(any(VM.class))).thenReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED)); when(diskValidator.isVirtIoScsiValid(any(VM.class))).thenReturn(ValidationResult.VALID); when(command.getDiskValidator(any(Disk.class))).thenReturn(diskValidator); @@ -588,7 +589,8 @@ parameters.setDiskInfo(disk); initializeCommand(Guid.newGuid(), parameters); when(diskLunMapDAO.getDiskIdByLunId(disk.getLun().getLUN_id())).thenReturn(null); - assertTrue("checkIfLunDiskCanBeAdded() failed for valid iscsi lun", command.checkIfLunDiskCanBeAdded()); + assertTrue("checkIfLunDiskCanBeAdded() failed for valid iscsi lun", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); } @Test @@ -598,7 +600,8 @@ parameters.setDiskInfo(disk); initializeCommand(Guid.newGuid(), parameters); disk.getLun().setLunType(StorageType.UNKNOWN); - assertFalse("checkIfLunDiskCanBeAdded() succeded for LUN with UNKNOWN type", command.checkIfLunDiskCanBeAdded()); + assertFalse("checkIfLunDiskCanBeAdded() succeded for LUN with UNKNOWN type", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); assertTrue("checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response", verifyCanDoActionMessagesContainMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_HAS_NO_VALID_TYPE)); } @@ -609,13 +612,15 @@ parameters.setDiskInfo(disk); initializeCommand(Guid.newGuid(), parameters); disk.getLun().getLunConnections().get(0).setiqn(null); - assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a null iqn", command.checkIfLunDiskCanBeAdded()); + assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a null iqn", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); assertTrue("checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response", verifyCanDoActionMessagesContainMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS)); clearCanDoActionMessages(); disk.getLun().getLunConnections().get(0).setiqn(""); - assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with an empty iqn", command.checkIfLunDiskCanBeAdded()); + assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with an empty iqn", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); assertTrue("checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response", verifyCanDoActionMessagesContainMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS)); } @@ -626,13 +631,15 @@ parameters.setDiskInfo(disk); initializeCommand(Guid.newGuid(), parameters); disk.getLun().getLunConnections().get(0).setconnection(null); - assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a null address", command.checkIfLunDiskCanBeAdded()); + assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a null address", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); assertTrue("checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response", verifyCanDoActionMessagesContainMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS)); clearCanDoActionMessages(); disk.getLun().getLunConnections().get(0).setconnection(""); - assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a empty address", command.checkIfLunDiskCanBeAdded()); + assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a empty address", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); assertTrue("checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response", verifyCanDoActionMessagesContainMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS)); } @@ -643,13 +650,15 @@ parameters.setDiskInfo(disk); initializeCommand(Guid.newGuid(), parameters); disk.getLun().getLunConnections().get(0).setport(null); - assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a null port", command.checkIfLunDiskCanBeAdded()); + assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a null port", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); assertTrue("checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response", verifyCanDoActionMessagesContainMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS)); clearCanDoActionMessages(); disk.getLun().getLunConnections().get(0).setport(""); - assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a empty port", command.checkIfLunDiskCanBeAdded()); + assertFalse("checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a empty port", + command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk))); assertTrue("checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response", verifyCanDoActionMessagesContainMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS)); } @@ -712,7 +721,7 @@ mockMaxPciSlots(); when(osRepository.getDiskInterfaces(any(Integer.class), any(Version.class))).thenReturn( - new ArrayList<>(Arrays.asList("VirtIO"))); + new ArrayList<>(Arrays.asList("VirtIO"))); DiskValidator diskValidator = spyDiskValidator(disk); doReturn(true).when(diskValidator).isVirtioScsiControllerAttached(any(Guid.class)); @@ -822,6 +831,25 @@ CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); } + @Test + public void testCanDoFailOnAddIDEReadOnlyDisk() { + DiskImage disk = new DiskImage(); + disk.setDiskInterface(DiskInterface.IDE); + disk.setReadOnly(true); + + AddDiskParameters parameters = createParameters(); + parameters.setDiskInfo(disk); + + initializeCommand(Guid.newGuid(), parameters); + doReturn(true).when(command).isDiskCanBeAddedToVm(any(Disk.class), any(VM.class)); + doReturn(true).when(command).isDiskPassPciAndIdeLimit(any(Disk.class)); + + mockVm(); + + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, + VdcBllMessages.ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR); + } + private void fillDiskMap(LunDisk disk, VM vm, int expectedMapSize) { Map<Guid, Disk> diskMap = new HashMap<Guid, Disk>(); for (int i = 0; i < expectedMapSize; i++) { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java index d092b08..366d013 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java @@ -350,6 +350,7 @@ initializeCommand(parameters); doReturn(true).when(command).validatePciAndIdeLimit(any(List.class)); + when(diskValidator.isReadOnlyPropertyCompatibleWithInterface()).thenReturn(ValidationResult.VALID); when(diskValidator.isDiskInterfaceSupported(any(VM.class))).thenReturn(new ValidationResult(VdcBllMessages.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED)); when(diskValidator.isVirtIoScsiValid(any(VM.class))).thenReturn(ValidationResult.VALID); when(command.getDiskValidator(any(Disk.class))).thenReturn(diskValidator); @@ -387,6 +388,24 @@ verify(vmDeviceDAO, never()).update(any(VmDevice.class)); } + @Test + public void testUpdateIDEDiskAsReadOnlyNotSupported() { + DiskImage updatedDisk = createDiskImage(); + updatedDisk.setReadOnly(true); + updatedDisk.setDiskInterface(DiskInterface.IDE); + + DiskImage diskFromDB = createDiskImage(); + diskFromDB.setReadOnly(false); + diskFromDB.setDiskInterface(DiskInterface.IDE); + + when(diskDao.get(diskImageGuid)).thenReturn(diskFromDB); + + initializeCommand(new UpdateVmDiskParameters(vmId, diskImageGuid, updatedDisk)); + + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, + VdcBllMessages.ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR); + } + private void initializeCommand(UpdateVmDiskParameters params) { initializeCommand(params, Collections.singletonList(createVmStatusDown())); } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java index d3627d4..5e82da2 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/DiskValidatorTest.java @@ -139,4 +139,24 @@ initializeOsRepository(vm.getOs(), DiskInterface.VirtIO); assertThat(validator.isDiskInterfaceSupported(vm), failsWith(VdcBllMessages.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED)); } + + @Test + public void readOnlyIsNotSupportedByDiskInterface() { + disk.setReadOnly(true); + disk.setDiskInterface(DiskInterface.IDE); + + assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), + failsWith(VdcBllMessages.ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR)); + } + + @Test + public void readOnlyIsSupportedByDiskInterface() { + disk.setReadOnly(true); + disk.setDiskInterface(DiskInterface.VirtIO); + assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid()); + + disk.setReadOnly(false); + disk.setDiskInterface(DiskInterface.IDE); + assertThat(validator.isReadOnlyPropertyCompatibleWithInterface(), isValid()); + } } 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 8e0629a..397bff5 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 @@ -138,6 +138,7 @@ ACTION_TYPE_FAILED_SHAREABLE_DISKS_NOT_SUPPORTED_ON_GLUSTER_DOMAIN(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DISKS_LOCKED(ErrorType.CONFLICT), ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED(ErrorType.BAD_PARAMETERS), + ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_DISKS_ILLEGAL(ErrorType.INTERNAL_ERROR), ACTION_TYPE_FAILED_MOVE_DISKS_MIXED_PLUGGED_STATUS(ErrorType.INTERNAL_ERROR), ACTION_TYPE_FAILED_IMPORT_DISKS_ALREADY_EXIST(ErrorType.CONFLICT), 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 6104eb7..f3e1147 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -1149,3 +1149,4 @@ ISCSI_BOND_NOT_EXIST=Cannot ${action} ${type}. The specified iSCSI bond doesn't exist. ISCSI_BOND_WITH_SAME_NAME_EXIST_IN_DATA_CENTER=Cannot ${action} ${type}. iSCSI bond with the same name already exists in the Data Center. +ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR=Cannot ${action} ${type}. An IDE disk can't be read-only. 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 8ef57d8..0367d8e 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 @@ -3057,4 +3057,7 @@ @DefaultStringValue("Cannot ${action} ${type}. The specified iSCSI bond doesn't exist.") String ISCSI_BOND_NOT_EXIST(); + + @DefaultStringValue("Cannot ${action} ${type}. An IDE disk can't be read-only.") + String ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR(); } 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 c07482a..85b5cab 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 @@ -982,3 +982,5 @@ ISCSI_BOND_NOT_EXIST=Cannot ${action} ${type}. The specified iSCSI bond doesn't exist. ISCSI_BOND_WITH_SAME_NAME_EXIST_IN_DATA_CENTER=Cannot ${action} ${type}. iSCSI bond with the same name already exists in the Data Center. + +ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR=Cannot ${action} ${type}. An IDE disk can't be read-only. 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 4d67d55..7757a9d 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 @@ -1119,3 +1119,5 @@ ISCSI_BOND_NOT_EXIST=Cannot ${action} ${type}. The specified iSCSI bond doesn't exist. ISCSI_BOND_WITH_SAME_NAME_EXIST_IN_DATA_CENTER=Cannot ${action} ${type}. iSCSI bond with the same name already exists in the Data Center. + +ACTION_TYPE_FAILED_IDE_INTERFACE_DOES_NOT_SUPPORT_READ_ONLY_ATTR=Cannot ${action} ${type}. An IDE disk can't be read-only. -- To view, visit http://gerrit.ovirt.org/24258 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I441362adf2f4833b034ede4093fc8195debd2ed5 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Sergey Gotliv <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
