Idan Shaby has uploaded a new change for review. Change subject: engine: Forbid Bootable and Shareable Disks ......................................................................
engine: Forbid Bootable and Shareable Disks A disk cannot be both bootable and shareable. Changes have been made in the backend and frontend. Also, an SQL script was added to packaging/dbscripts/upgrade. Change-Id: I8e221d6534b71db96d0c58442220d249b305079b Bug-Url: https://bugzilla.redhat.com/1084103 Signed-off-by: Idan Shaby <[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/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.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 A packaging/dbscripts/upgrade/03_06_0230_update_disk_bootable_shareable.sql 14 files changed, 162 insertions(+), 5 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/14/31714/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 297260d..5386b1f 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 @@ -115,6 +115,10 @@ return false; } + if (!validate(diskValidator.areBootableAndSharableCompatibleWithDisk())) { + return false; + } + if (DiskStorageType.IMAGE == getParameters().getDiskInfo().getDiskStorageType()) { return checkIfImageDiskCanBeAdded(vm, diskValidator); } 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 e6ec353..20b5e3c 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 @@ -168,7 +168,8 @@ return validateCanUpdateShareable() && validateCanUpdateReadOnly(diskValidator) && validate(diskValidator.isVirtIoScsiValid(getVm())) && (getOldDisk().getDiskInterface() == getNewDisk().getDiskInterface() - || validate(diskValidator.isDiskInterfaceSupported(getVm()))); + || validate(diskValidator.isDiskInterfaceSupported(getVm()))) && + validate(diskValidator.areBootableAndSharableCompatibleWithDisk()); } @Override 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 ce10244..f4f93d7 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 @@ -137,6 +137,13 @@ return ValidationResult.VALID; } + public ValidationResult areBootableAndSharableCompatibleWithDisk() { + if (disk.isShareable() && disk.isBoot()) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE); + } + return ValidationResult.VALID; + } + private static OsRepository getOsRepository() { return SimpleDependecyInjector.getInstance().get(OsRepository.class); } 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 f14691b..1ff2822 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 @@ -125,6 +125,7 @@ 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(diskValidator.areBootableAndSharableCompatibleWithDisk()).thenReturn(ValidationResult.VALID); when(command.getDiskValidator(any(Disk.class))).thenReturn(diskValidator); assertFalse(command.canDoAction()); @@ -849,11 +850,39 @@ doReturn(true).when(command).isDiskPassPciAndIdeLimit(any(Disk.class)); doReturn(true).when(command).checkIfImageDiskCanBeAdded(any(VM.class), any(DiskValidator.class)); doReturn(ValidationResult.VALID).when(diskValidator).isReadOnlyPropertyCompatibleWithInterface(); + when(diskValidator.areBootableAndSharableCompatibleWithDisk()).thenReturn(ValidationResult.VALID); doReturn(diskValidator).when(command).getDiskValidator(any(Disk.class)); CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); } + @Test + public void canDoActionFailsWhenDiskIsBothShareableAndBootable() { + prepareForDiskShareableBootableTest( + new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE)); + CanDoActionTestUtils.runAndAssertCanDoActionFailure( + command, VdcBllMessages.ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE); + } + + @Test + public void canDoActionSucceedsWhenDiskIsNotBothShareableAndBootable() { + prepareForDiskShareableBootableTest(ValidationResult.VALID); + CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); + } + + private void prepareForDiskShareableBootableTest(ValidationResult isDiskShareableAndBootableValidationResult) { + Guid storageId = Guid.newGuid(); + initializeCommand(storageId); + + VM vm = mockVm(); + mockMaxPciSlots(); + + when(diskValidator.areBootableAndSharableCompatibleWithDisk()).thenReturn(isDiskShareableAndBootableValidationResult); + when(diskValidator.isReadOnlyPropertyCompatibleWithInterface()).thenReturn(ValidationResult.VALID); + doReturn(true).when(command).checkIfImageDiskCanBeAdded(vm, diskValidator); + doReturn(diskValidator).when(command).getDiskValidator(any(Disk.class)); + } + 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 cc28c7a..1a3971f 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 @@ -417,7 +417,7 @@ public Object answer(InvocationOnMock invocationOnMock) throws Throwable { final DiskImage oldDisk = createDiskImage(); oldDisk.setDiskInterface(DiskInterface.VirtIO); - assertNotSame (oldDisk.getDiskInterface(), parameters.getDiskInfo().getDiskInterface()); + assertNotSame(oldDisk.getDiskInterface(), parameters.getDiskInfo().getDiskInterface()); return oldDisk; } }); @@ -555,6 +555,32 @@ ("wrong failure", command, VdcBllMessages.ACTION_TYPE_FAILED_CANNOT_RESIZE_READ_ONLY_DISK); } + @Test + public void canDoActionFailsWhenDiskIsBothShareableAndBootable() { + prepareForDiskShareableBootableTest( + new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE)); + CanDoActionTestUtils.runAndAssertCanDoActionFailure( + command, VdcBllMessages.ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE); + } + + @Test + public void canDoActionSucceedsWhenDiskIsNotBothShareableAndBootable() { + prepareForDiskShareableBootableTest(ValidationResult.VALID); + CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); + } + + private void prepareForDiskShareableBootableTest(ValidationResult isDiskShareableAndBootableValidationResult) { + UpdateVmDiskParameters parameters = createParameters(); + initializeCommand(parameters); + + DiskImage oldDisk = createDiskImage(); + doReturn(oldDisk).when(command).getOldDisk(); + + when(diskValidator.areBootableAndSharableCompatibleWithDisk()).thenReturn(isDiskShareableAndBootableValidationResult); + doReturn(true).when(command).validateCanUpdateReadOnly(diskValidator); + doReturn(diskValidator).when(command).getDiskValidator(any(Disk.class)); + } + 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 e9c918a..2b0dfa0 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 @@ -199,4 +199,33 @@ lunDisk.setDiskInterface(DiskInterface.IDE); assertThat(lunValidator.isReadOnlyPropertyCompatibleWithInterface(), isValid()); } + + @Test + public void bootableAndShareableDiskFail() { + disk.setBoot(true); + disk.setShareable(true); + assertThat(validator.areBootableAndSharableCompatibleWithDisk(), + failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE)); + } + + @Test + public void bootableAndNotShareableDiskSuccess() { + disk.setBoot(true); + disk.setShareable(false); + assertThat(validator.areBootableAndSharableCompatibleWithDisk(), isValid()); + } + + @Test + public void shareableAndNotBootableDiskSuccess() { + disk.setShareable(true); + disk.setBoot(false); + assertThat(validator.areBootableAndSharableCompatibleWithDisk(), isValid()); + } + + @Test + public void notBootableAndNotShareableDiskSuccess() { + disk.setBoot(false); + disk.setShareable(false); + assertThat(validator.areBootableAndSharableCompatibleWithDisk(), 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 4dc8112..10cc2a9 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 @@ -183,6 +183,7 @@ 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_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE(ErrorType.CONFLICT), ACTION_TYPE_FAILED_VMS_BOOT_IN_USE(ErrorType.CONFLICT), ACTION_TYPE_FAILED_DISK_ALREADY_ATTACHED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_NOT_SHAREABLE_DISK_ALREADY_ATTACHED(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 5f48dfc..03dd4a8 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -716,6 +716,7 @@ ACTION_TYPE_FAILED_IMPORTED_TEMPLATE_IS_MISSING=Cannot import and collapse VM, Template is missing in domain ${DomainName} VM_POOL_CANNOT_CREATE_WITH_NO_VMS=Cannot create Pool with 0 VMs ACTION_TYPE_FAILED_DISK_BOOT_IN_USE=Cannot ${action} ${type}. Disk ${DiskName} in VM ${VmName} is already marked as boot. +ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE=Cannot set a disk to be both shareable and bootable. ACTION_TYPE_FAILED_VMS_BOOT_IN_USE=Cannot ${action} ${type}. The VMs ${VmsName} already have a disk marked as boot. VDS_GROUP_CANNOT_UPDATE_CPU_WHEN_RUNNING_VMS=Cannot change cpu level when VMs are running. VM_OR_TEMPLATE_ILLEGAL_PRIORITY_VALUE=VM priority value passed the permitted max value, value should be between 0 and ${MaxValue}. 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 cc39bab..b41e51b 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 @@ -1953,6 +1953,9 @@ @DefaultStringValue("Cannot ${action} ${type}. Disk ${DiskName} in VM ${VmName} already marked as boot.") String ACTION_TYPE_FAILED_DISK_BOOT_IN_USE(); + @DefaultStringValue("Cannot set a disk to be both shareable and bootable.") + String ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE(); + @DefaultStringValue("Cannot ${action} ${type}. The VMs ${VmsName} already have a disk marked as boot.") String ACTION_TYPE_FAILED_VMS_BOOT_IN_USE(); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java index cc6d564..6e6def7 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/AbstractDiskModel.java @@ -80,6 +80,7 @@ private VolumeFormat volumeFormat; private boolean previousWipeAfterDeleteEntity; private boolean previousIsQuotaAvailable; + private boolean isVmContainBootableDisk; private SystemTreeItemModel systemTreeSelectedItem; private String hash; @@ -283,9 +284,11 @@ setIsBootable(new EntityModel<Boolean>()); getIsBootable().setEntity(false); + getIsBootable().getEntityChangedEvent().addListener(this); setIsShareable(new EntityModel<Boolean>()); getIsShareable().setEntity(false); + getIsShareable().getEntityChangedEvent().addListener(this); setIsPlugged(new EntityModel<Boolean>()); getIsPlugged().setEntity(true); @@ -488,11 +491,13 @@ public void onSuccess(Object target, Object returnValue) { AbstractDiskModel diskModel = (AbstractDiskModel) target; ArrayList<Disk> disks = (ArrayList<Disk>) returnValue; + isVmContainBootableDisk = false; diskModel.getIsBootable().setEntity(true); if (getDisk() == null || !getDisk().isDiskSnapshot()) { for (Disk disk : disks) { if (disk.isBoot() && !disk.equals(getDisk())) { + isVmContainBootableDisk = true; diskModel.getIsBootable().setEntity(false); if (!disk.isDiskSnapshot()) { diskModel.getIsBootable().setChangeProhibitionReason(CONSTANTS.onlyOneBootableDisk()); @@ -514,8 +519,10 @@ boolean isShareableDiskEnabled = (Boolean) AsyncDataProvider.getConfigValuePreConverted( ConfigurationValues.ShareableDiskEnabled, datacenter.getcompatibility_version().getValue()); - getIsShareable().setChangeProhibitionReason(CONSTANTS.shareableDiskNotSupported()); - getIsShareable().setIsChangable(isShareableDiskEnabled && isEditEnabled()); + if (getIsShareable().getIsChangable()) { + getIsShareable().setChangeProhibitionReason(CONSTANTS.shareableDiskNotSupported()); + getIsShareable().setIsChangable(isShareableDiskEnabled && isEditEnabled()); + } } private void updateDirectLunDiskEnabled(StoragePool datacenter) { @@ -537,7 +544,7 @@ getIsShareable().setIsChangable(false); getIsShareable().setEntity(false); } - else { + else if (getIsShareable().getIsChangable()) { getIsShareable().setIsChangable(isEditEnabled()); } } @@ -652,6 +659,27 @@ getQuota().setIsAvailable(isInternal ? previousIsQuotaAvailable : false); updateDatacenters(); + } + + private void isBootable_EntityChanged() { + boolean isBootable = getIsBootable().getEntity(); + if (getIsShareable().getIsChangable() || !isBootable) { + getIsShareable().setIsChangable(!isBootable); + getIsShareable().setChangeProhibitionReason(CONSTANTS.cannotEnableShareableForBootableDisk()); + } + } + + private void isShareable_EntityChanged() { + // When the "isShareable" entity value changes, there are two main cases + // in which we want to handle the changeability of the "isBootable" entity: + // 1. "isBootable" is changeable. + // 2. "isBootable" is not changeable because the disk is already shareable. + // Note - if the VM already contains a bootable disk, the changeability of "isBootable" should not change. + boolean isShareable = getIsShareable().getEntity(); + if (getIsBootable().getIsChangable() || (!isVmContainBootableDisk && !isShareable)) { + getIsBootable().setIsChangable(!isShareable); + getIsBootable().setChangeProhibitionReason(CONSTANTS.cannotEnableBootableForShareableDisk()); + } } protected void volumeType_SelectedItemChanged() { @@ -951,6 +979,10 @@ updateReadOnlyChangeability(); } else if (sender == getIsInternal()) { isInternal_EntityChanged(); + } else if (sender == getIsBootable()) { + isBootable_EntityChanged(); + } else if (sender == getIsShareable()) { + isShareable_EntityChanged(); } } else if (ev.matchesDefinition(ListModel.selectedItemChangedEventDefinition) && sender == getVolumeType()) diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java index 8ee6284..7ecf8d3 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java @@ -2261,9 +2261,18 @@ @DefaultStringValue("Privileged SCSI I/O can be set only when SCSI pass-through is enabled.") String cannotEnableSgioWhenScsiPassthroughDisabled(); + @DefaultStringValue("A VirtIO-ISCSI direct LUN disk can't be read-only.") + String cannotEnableVirtIoScsiInterfaceForLunReadOnlyDisk(); + @DefaultStringValue("SCSI pass-through is not supported for read-only disks.") String cannotEnableScsiPassthroughForLunReadOnlyDisk(); + @DefaultStringValue("A shareable disk cannot be bootable.") + String cannotEnableBootableForShareableDisk(); + + @DefaultStringValue("A bootable disk cannot be shareable.") + String cannotEnableShareableForBootableDisk(); + @DefaultStringValue("Global Maintenance Enabled") String haGlobalMaintenance(); 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 7aed7d2..1eb6e9d 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 @@ -683,6 +683,7 @@ ACTION_TYPE_FAILED_IMPORTED_TEMPLATE_IS_MISSING=Cannot import and collapse VM, Template is missing in domain ${DomainName} VM_POOL_CANNOT_CREATE_WITH_NO_VMS=Cannot create Pool with 0 VMs ACTION_TYPE_FAILED_DISK_BOOT_IN_USE=Cannot ${action} ${type}. Disk ${DiskName} in VM ${VmName} is already marked as boot. +ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE=Cannot set a disk to be both shareable and bootable. ACTION_TYPE_FAILED_VMS_BOOT_IN_USE=Cannot ${action} ${type}. The VMs ${VmsName} already have a disk marked as boot. VDS_GROUP_CANNOT_UPDATE_CPU_WHEN_RUNNING_VMS=Cannot change cpu level when VMs are running. VM_OR_TEMPLATE_ILLEGAL_PRIORITY_VALUE=VM priority value passed the permitted max value, value should be between 0 and ${MaxValue}. 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 7f8fc91..82197509 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 @@ -716,6 +716,7 @@ ACTION_TYPE_FAILED_IMPORTED_TEMPLATE_IS_MISSING=Cannot import and collapse VM, Template is missing in domain ${DomainName} VM_POOL_CANNOT_CREATE_WITH_NO_VMS=Cannot create Pool with 0 VMs ACTION_TYPE_FAILED_DISK_BOOT_IN_USE=Cannot ${action} ${type}. Disk ${DiskName} in VM ${VmName} is already marked as boot. +ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE=Cannot set a disk to be both shareable and bootable. ACTION_TYPE_FAILED_VMS_BOOT_IN_USE=Cannot ${action} ${type}. The VMs ${VmsName} already have a disk marked as boot. VDS_GROUP_CANNOT_UPDATE_CPU_WHEN_RUNNING_VMS=Cannot change cpu level when VMs are running. VM_OR_TEMPLATE_ILLEGAL_PRIORITY_VALUE=VM priority value passed the permitted max value, value should be between 0 and ${MaxValue}. diff --git a/packaging/dbscripts/upgrade/03_06_0230_update_disk_bootable_shareable.sql b/packaging/dbscripts/upgrade/03_06_0230_update_disk_bootable_shareable.sql new file mode 100644 index 0000000..1c846d8 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_06_0230_update_disk_bootable_shareable.sql @@ -0,0 +1,13 @@ +-- Since we don't allow disks to be both bootable and shareable, +-- we need to set these disks "boot" value to false in base_disks, +-- and boot_order to 0 in vm_device. + +UPDATE vm_device +SET boot_order = 0 +WHERE device_id IN (SELECT disk_id + FROM base_disks + WHERE boot AND shareable); + +UPDATE base_disks +SET boot = FALSE +WHERE boot AND shareable; -- To view, visit http://gerrit.ovirt.org/31714 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8e221d6534b71db96d0c58442220d249b305079b Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Idan Shaby <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
