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

Reply via email to