Idan Shaby has uploaded a new change for review. Change subject: core: Forbid Bootable and Shareable Disks ......................................................................
core: 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_0070_update_disk_bootable_shareable.sql 14 files changed, 166 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/42/31142/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 90f7c94..73671d1 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.isDiskShareableAndBootable())) { + 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..2fad083 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.isDiskShareableAndBootable()); } @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 772d6d1..61d8e0f 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 @@ -133,6 +133,13 @@ return ValidationResult.VALID; } + public ValidationResult isDiskShareableAndBootable() { + 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..c9bb7f1 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.isDiskShareableAndBootable()).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.isDiskShareableAndBootable()).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.isDiskShareableAndBootable()).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 5a67a4f..1d6e7b4 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 @@ -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.isDiskShareableAndBootable()).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 dee52b2..0d9de28 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.isDiskShareableAndBootable(), + failsWith(VdcBllMessages.ACTION_TYPE_FAILED_DISK_CANNOT_BE_BOTH_SHAREABLE_AND_BOOTABLE)); + } + + @Test + public void bootableAndNotShareableDiskSuccess() { + disk.setBoot(true); + disk.setShareable(false); + assertThat(validator.isDiskShareableAndBootable(), isValid()); + } + + @Test + public void shareableAndNotBootableDiskSuccess() { + disk.setShareable(true); + disk.setBoot(false); + assertThat(validator.isDiskShareableAndBootable(), isValid()); + } + + @Test + public void notBootableAndNotShareableDiskSuccess() { + disk.setBoot(false); + disk.setShareable(false); + assertThat(validator.isDiskShareableAndBootable(), 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 3fc6733..c4c8226 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 @@ -181,6 +181,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 c0fa772..4bf8734 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -710,6 +710,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 95be55f..668c019 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 @@ -1938,6 +1938,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 68cf26a..05282f1 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 @@ -79,6 +79,7 @@ private VolumeFormat volumeFormat; private boolean previousWipeAfterDeleteEntity; private boolean previousIsQuotaAvailable; + private boolean containsBootableDisk; private SystemTreeItemModel systemTreeSelectedItem; private String hash; @@ -274,9 +275,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); @@ -471,11 +474,13 @@ public void onSuccess(Object target, Object returnValue) { AbstractDiskModel diskModel = (AbstractDiskModel) target; ArrayList<Disk> disks = (ArrayList<Disk>) returnValue; + containsBootableDisk = false; diskModel.getIsBootable().setEntity(true); if (getDisk() == null || !getDisk().isDiskSnapshot()) { for (Disk disk : disks) { if (disk.isBoot() && !disk.equals(getDisk())) { + containsBootableDisk = true; diskModel.getIsBootable().setEntity(false); if (!disk.isDiskSnapshot()) { diskModel.getIsBootable().setChangeProhibitionReason(CONSTANTS.onlyOneBootableDisk()); @@ -497,8 +502,10 @@ boolean isShareableDiskEnabled = (Boolean) AsyncDataProvider.getInstance().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) { @@ -520,7 +527,7 @@ getIsShareable().setIsChangable(false); getIsShareable().setEntity(false); } - else { + else if (getIsShareable().getIsChangable()) { getIsShareable().setIsChangable(isEditEnabled()); } } @@ -635,6 +642,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() || (!containsBootableDisk && !isShareable)) { + getIsBootable().setIsChangable(!isShareable); + getIsBootable().setChangeProhibitionReason(CONSTANTS.cannotEnableBootableForShareableDisk()); + } } protected void volumeType_SelectedItemChanged() { @@ -910,6 +938,14 @@ { isInternal_EntityChanged(); } + else if (ev.matchesDefinition(ListModel.entityChangedEventDefinition) && sender == getIsBootable()) + { + isBootable_EntityChanged(); + } + else if (ev.matchesDefinition(ListModel.entityChangedEventDefinition) && sender == getIsShareable()) + { + isShareable_EntityChanged(); + } else if (ev.matchesDefinition(ListModel.selectedItemChangedEventDefinition) && sender == getVolumeType()) { volumeType_SelectedItemChanged(); 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 edb57a8..9937ae7 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 @@ -2255,6 +2255,12 @@ @DefaultStringValue("An IDE disk can't be read-only.") String cannotEnableIdeInterfaceForReadOnlyDisk(); + @DefaultStringValue("A shareable disk cannot be bootable.") + String cannotEnableBootableForShareableDisk(); + + @DefaultStringValue("A bootable disk cannot be shareable.") + String cannotEnableShareableForBootableDisk(); + @DefaultStringValue("A VirtIO-ISCSI direct LUN disk can't be read-only.") String cannotEnableVirtIoScsiInterfaceForLunReadOnlyDisk(); 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 88dd5e9..e499047 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 @@ -679,6 +679,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 4e33da1..8ff0318 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 @@ -711,6 +711,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_0070_update_disk_bootable_shareable.sql b/packaging/dbscripts/upgrade/03_06_0070_update_disk_bootable_shareable.sql new file mode 100644 index 0000000..8c604eb --- /dev/null +++ b/packaging/dbscripts/upgrade/03_06_0070_update_disk_bootable_shareable.sql @@ -0,0 +1,17 @@ +-- 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. + +BEGIN TRANSACTION; + +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; + +COMMIT; -- To view, visit http://gerrit.ovirt.org/31142 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8e221d6534b71db96d0c58442220d249b305079b Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Idan Shaby <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
