Daniel Erez has uploaded a new change for review.

Change subject: core,ui: prevent cow shareable disk creation (#848021)
......................................................................

core,ui: prevent cow shareable disk creation (#848021)

https://bugzilla.redhat.com/848021

Preventing creation of shareable DiskImage that is COW formatted
(since the combination is unsupported).
core:
* Added validations to AddDiskCommand and UpdateVmDiskCommand
  (updated tests accordingly).
* Added error messages in VdcBllMessages and AppErrors.
ui:
* Added validations to 'Add Disk' dialog
  (I.e. disabled Shareable check-box for unsupported combinations).

Change-Id: Ie9594978c0b509fd540803e9dc4137266bd0501b
Signed-off-by: Daniel Erez <[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/AddDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.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/dal/src/main/java/org/ovirt/engine/core/dal/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/DiskModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Constants.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
12 files changed, 230 insertions(+), 29 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/62/7462/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 bba7ab4..36a0a4c 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
@@ -15,6 +15,7 @@
 import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.businessentities.VmNetworkInterface;
+import org.ovirt.engine.core.common.businessentities.VolumeFormat;
 import 
org.ovirt.engine.core.common.businessentities.storage_server_connections;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
@@ -108,6 +109,10 @@
         return true;
     }
 
+    protected boolean isVolumeFormatSupportedForShareable(VolumeFormat 
volumeFormat) {
+        return volumeFormat == VolumeFormat.RAW;
+    }
+
     protected boolean isVmUpOrDown() {
         if (getVm().getstatus() != VMStatus.Up && getVm().getstatus() != 
VMStatus.Down) {
             
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_STATUS_ILLEGAL);
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 071987b..6e20cd7 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
@@ -128,11 +128,17 @@
                     String.format("$max_disk_size %1$s", Config.<Integer> 
GetValue(ConfigValues.MaxBlockDiskSize)));
             returnValue = false;
         }
-        if (returnValue && getParameters().getDiskInfo().isShareable()
-                && !Config.<Boolean> 
GetValue(ConfigValues.ShareableDiskEnabled,
-                        
getStoragePool().getcompatibility_version().getValue())) {
-            returnValue = false;
-            
addCanDoActionMessage(VdcBllMessages.ACTION_NOT_SUPPORTED_FOR_CLUSTER_POOL_LEVEL);
+        if (getParameters().getDiskInfo().isShareable()) {
+            if (returnValue && !Config.<Boolean> 
GetValue(ConfigValues.ShareableDiskEnabled,
+                            
getStoragePool().getcompatibility_version().getValue())) {
+                returnValue = false;
+                
addCanDoActionMessage(VdcBllMessages.ACTION_NOT_SUPPORTED_FOR_CLUSTER_POOL_LEVEL);
+            }
+            else if (returnValue && !isVolumeFormatSupportedForShareable(
+                    ((DiskImage) 
getParameters().getDiskInfo()).getvolume_format())) {
+                returnValue = false;
+                
addCanDoActionMessage(VdcBllMessages.SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT);
+            }
         }
         return returnValue && (vm == null || 
validate(getSnapshotValidator().vmNotDuringSnapshot(vm.getId())));
     }
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 7bfa443..d47d41a 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
@@ -19,6 +19,7 @@
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.DiskImageBase;
 import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum;
+import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotStatus;
 import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
@@ -168,7 +169,7 @@
         boolean isDiskShareable = _oldDisk.isShareable();
 
         // Check if VM is not during snapshot.
-        if (ImagesHandler.isVmInPreview(getVmId())) {
+        if (getSnapshotDao().exists(getVmId(), SnapshotStatus.IN_PREVIEW)) {
             
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_IN_PREVIEW);
             return false;
         }
@@ -191,7 +192,13 @@
                 return false;
             }
 
-            ((DiskImage)_oldDisk).setvm_snapshot_id(null);
+            DiskImage diskImage = (DiskImage) getParameters().getDiskInfo();
+            if 
(!isVolumeFormatSupportedForShareable(diskImage.getvolume_format())) {
+                
addCanDoActionMessage(VdcBllMessages.SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT);
+                return false;
+            }
+
+            diskImage.setvm_snapshot_id(null);
         } else if (isDiskShareable && !isDiskUpdatedToShareable) {
             if (getVmDAO().getVmsListForDisk(_oldDisk.getId()).size() > 1) {
                 
addCanDoActionMessage(VdcBllMessages.DISK_IS_ALREADY_SHARED_BETWEEN_VMS);
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 50e2778..30903b9 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
@@ -35,6 +35,7 @@
 import org.ovirt.engine.core.common.businessentities.storage_pool_iso_map;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.core.dal.VdcBllMessages;
 import 
org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBaseMockUtils;
 import org.ovirt.engine.core.dao.StorageDomainDAO;
@@ -57,7 +58,8 @@
     public static MockConfigRule mcr = new MockConfigRule(
             mockConfig(ConfigValues.MaxBlockDiskSize, MAX_BLOCK_SIZE),
             mockConfig(ConfigValues.FreeSpaceLow, FREE_SPACE_LOW),
-            mockConfig(ConfigValues.FreeSpaceCriticalLowInGB, 
FREE_SPACE_CRITICAL_LOW_IN_GB)
+            mockConfig(ConfigValues.FreeSpaceCriticalLowInGB, 
FREE_SPACE_CRITICAL_LOW_IN_GB),
+            mockConfig(ConfigValues.ShareableDiskEnabled, 
Version.v3_1.toString(), true)
             );
 
     @Mock
@@ -282,6 +284,49 @@
     }
 
     /**
+     * CanDoAction should succeed when creating a Shareable Disk with RAW 
volume format
+     */
+    @Test
+    public void canDoActionShareableDiskVolumeFormatSucceeds() {
+        DiskImage image = createShareableDiskImage();
+        image.setvolume_format(VolumeFormat.RAW);
+
+        AddDiskParameters parameters = createParameters();
+        parameters.setDiskInfo(image);
+        Guid storageId = Guid.NewGuid();
+        initializeCommand(storageId, parameters);
+
+        mockVm();
+        mockStorageDomain(storageId, Version.v3_1);
+        mockStoragePoolIsoMap();
+
+        runAndAssertCanDoActionSuccess();
+    }
+
+    /**
+     * CanDoAction should fail when creating a Shareable Disk with COW volume 
format
+     */
+    @Test
+    public void canDoActionShareableDiskVolumeFormatFails() {
+        DiskImage image = createShareableDiskImage();
+        image.setvolume_format(VolumeFormat.COW);
+
+        AddDiskParameters parameters = createParameters();
+        parameters.setDiskInfo(image);
+        Guid storageId = Guid.NewGuid();
+        initializeCommand(storageId, parameters);
+
+        mockVm();
+        mockStorageDomain(storageId, Version.v3_1);
+        mockStoragePoolIsoMap();
+
+        assertFalse(command.canDoAction());
+        assertTrue(command.getReturnValue()
+                .getCanDoActionMessages()
+                
.contains(VdcBllMessages.SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT.toString()));
+    }
+
+    /**
      * Initialize the command for testing, using the given storage domain id 
for the parameters.
      *
      * @param storageId
@@ -358,28 +403,47 @@
     }
 
     /**
+     * Mock a {@link storage_pool}.
+     *
+     * @param compatibilityVersion
+     * @return
+     */
+    private storage_pool mockStoragePool(Version compatibilityVersion) {
+        Guid storagePoolId = Guid.NewGuid();
+        storage_pool storagePool = new storage_pool();
+        storagePool.setId(storagePoolId);
+        storagePool.setcompatibility_version(compatibilityVersion);
+        when(storagePoolDAO.get(storagePoolId)).thenReturn(storagePool);
+
+        return storagePool;
+    }
+
+    /**
      * Mock a {@link storage_domains}.
      *
      * @param storageId
      *            Id of the domain.
      */
     private storage_domains mockStorageDomain(Guid storageId) {
-        return mockStorageDomain(storageId, 6, 4, StorageType.UNKNOWN);
+        return mockStorageDomain(storageId, 6, 4, StorageType.UNKNOWN, new 
Version());
     }
 
     private storage_domains mockStorageDomain(Guid storageId, StorageType 
storageType) {
-        return mockStorageDomain(storageId, 6, 4, storageType);
+        return mockStorageDomain(storageId, 6, 4, storageType, new Version());
     }
 
     private storage_domains mockStorageDomain(Guid storageId, int 
availableSize, int usedSize) {
-        return mockStorageDomain(storageId, 6, 4, StorageType.UNKNOWN);
+        return mockStorageDomain(storageId, 6, 4, StorageType.UNKNOWN, new 
Version());
     }
 
-    private storage_domains mockStorageDomain(Guid storageId, int 
availableSize, int usedSize, StorageType storageType) {
-        Guid storagePoolId = Guid.NewGuid();
-        storage_pool sp = new storage_pool();
-        sp.setId(storagePoolId);
-        when(storagePoolDAO.get(storagePoolId)).thenReturn(sp);
+    private storage_domains mockStorageDomain(Guid storageId, Version version) 
{
+        return mockStorageDomain(storageId, 6, 4, StorageType.UNKNOWN, 
version);
+    }
+
+    private storage_domains mockStorageDomain(Guid storageId, int 
availableSize, int usedSize,
+            StorageType storageType, Version version) {
+        storage_pool storagePool = mockStoragePool(version);
+        Guid storagePoolId = storagePool.getId();
 
         storage_domains sd = new storage_domains();
         sd.setavailable_disk_size(availableSize);
@@ -434,6 +498,12 @@
         return image;
     }
 
+    private static DiskImage createShareableDiskImage() {
+        DiskImage image = new DiskImage();
+        image.setShareable(true);
+        return image;
+    }
+
     private void mockStorageDomainSpaceChecker(storage_domains domain, boolean 
succeeded) {
         
doReturn(succeeded).when(command).isStorageDomainBelowThresholds(domain);
     }
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 6f79dde..d04ecb2 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
@@ -5,11 +5,14 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
+import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -20,14 +23,22 @@
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
+import org.ovirt.engine.core.common.businessentities.VolumeFormat;
+import org.ovirt.engine.core.common.businessentities.storage_pool;
+import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.core.dal.VdcBllMessages;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import 
org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBaseMockUtils;
 import org.ovirt.engine.core.dao.DiskDao;
+import org.ovirt.engine.core.dao.DiskImageDAO;
+import org.ovirt.engine.core.dao.SnapshotDao;
+import org.ovirt.engine.core.dao.StoragePoolDAO;
 import org.ovirt.engine.core.dao.VdsDAO;
 import org.ovirt.engine.core.dao.VmDAO;
 import org.ovirt.engine.core.dao.VmNetworkInterfaceDAO;
+import org.ovirt.engine.core.utils.MockConfigRule;
 
 @RunWith(MockitoJUnitRunner.class)
 public class UpdateVmDiskCommandTest {
@@ -43,6 +54,19 @@
     private DiskDao diskDao;
     @Mock
     private VmNetworkInterfaceDAO vmNetworkInterfaceDAO;
+    @Mock
+    private SnapshotDao snapshotDao;
+    @Mock
+    private DiskImageDAO diskImageDao;
+    @Mock
+    private StoragePoolDAO storagePoolDao;
+    @Mock
+    private DbFacade dbFacade;
+
+    @Rule
+    public static MockConfigRule mcr = new MockConfigRule(
+            mockConfig(ConfigValues.ShareableDiskEnabled, 
Version.v3_1.toString(), true)
+            );
 
     /**
      * The command under test.
@@ -70,8 +94,28 @@
                 
.contains(VdcBllMessages.ACTION_TYPE_FAILED_DISK_NOT_EXIST.toString()));
     }
 
-    protected void initializeCommand() {
-        command = spy(new 
UpdateVmDiskCommand<UpdateVmDiskParameters>(createParameters()) {
+    @Test
+    public void canDoActionFailedShareableDiskVolumeFormatUnsupported() throws 
Exception {
+        UpdateVmDiskParameters parameters = createParameters();
+        parameters.setDiskInfo(createShareableCowDisk());
+
+        when(diskDao.get(diskImageGuid)).thenReturn(createDiskImage());
+        initializeCommand(parameters);
+
+        mockVmStatusUp();
+
+        assertFalse(command.canDoAction());
+        assertTrue(command.getReturnValue()
+                .getCanDoActionMessages()
+                
.contains(VdcBllMessages.SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT.toString()));
+    }
+
+    private void initializeCommand() {
+        initializeCommand(createParameters());
+    }
+
+    protected void initializeCommand(UpdateVmDiskParameters params) {
+        command = spy(new UpdateVmDiskCommand<UpdateVmDiskParameters>(params) {
             // Overridden here and not during spying, since it's called in the 
constructor
             @SuppressWarnings("synthetic-access")
             @Override
@@ -80,13 +124,18 @@
             }
 
         });
+        doReturn(true).when(command).acquireLockInternal();
         
doReturn(vmNetworkInterfaceDAO).when(command).getVmNetworkInterfaceDAO();
+        doReturn(snapshotDao).when(command).getSnapshotDao();
+        doReturn(diskImageDao).when(command).getDiskImageDao();
+        doReturn(storagePoolDao).when(command).getStoragePoolDAO();
         mockVds();
     }
 
     private void mockNullVm() {
         AuditLogableBaseMockUtils.mockVmDao(command, vmDAO);
         mockGetForDisk(null);
+        mockGetVmsListForDisk(null);
         when(vmDAO.get(command.getParameters().getVmId())).thenReturn(null);
     }
 
@@ -97,8 +146,12 @@
         VM vm = new VM();
         vm.setstatus(VMStatus.Down);
         vm.setguest_os("rhel6");
+        vm.setId(vmId);
         AuditLogableBaseMockUtils.mockVmDao(command, vmDAO);
-        mockGetForDisk(new VM());
+        mockGetForDisk(vm);
+        mockGetVmsListForDisk(vm);
+        storage_pool storagePool = mockStoragePool(Version.v3_1);
+        vm.setstorage_pool_id(storagePool.getId());
         when(vmDAO.get(command.getParameters().getVmId())).thenReturn(vm);
         return vm;
     }
@@ -111,6 +164,12 @@
         when(vmDAO.getForDisk(diskImageGuid)).thenReturn(vmsMap);
     }
 
+    private void mockGetVmsListForDisk(VM vm) {
+        List<VM> vms = new ArrayList<VM>();
+        vms.add(vm);
+        when(vmDAO.getVmsListForDisk(diskImageGuid)).thenReturn(vms);
+    }
+
     /**
      * Mock VDS
      */
@@ -120,6 +179,22 @@
         command.setVdsId(Guid.Empty);
         doReturn(vdsDao).when(command).getVdsDAO();
         when(vdsDao.get(Guid.Empty)).thenReturn(vds);
+    }
+
+    /**
+     * Mock a {@link storage_pool}.
+     *
+     * @param compatibilityVersion
+     * @return
+     */
+    private storage_pool mockStoragePool(Version compatibilityVersion) {
+        Guid storagePoolId = Guid.NewGuid();
+        storage_pool storagePool = new storage_pool();
+        storagePool.setId(storagePoolId);
+        storagePool.setcompatibility_version(compatibilityVersion);
+        when(storagePoolDao.get(storagePoolId)).thenReturn(storagePool);
+
+        return storagePool;
     }
 
     /**
@@ -138,6 +213,26 @@
     }
 
     /**
+     * The following method will create a new DiskImage
+     */
+    private DiskImage createDiskImage() {
+        DiskImage disk = new DiskImage();
+        disk.setId(diskImageGuid);
+        return disk;
+    }
+
+    /**
+     * The following method will create a Shareable DiskImage that is COW 
formatted
+     */
+    private DiskImage createShareableCowDisk() {
+        DiskImage disk = new DiskImage();
+        disk.setId(diskImageGuid);
+        disk.setvolume_format(VolumeFormat.COW);
+        disk.setShareable(true);
+        return disk;
+    }
+
+    /**
      * The following method will create a VirtIO disk , which is marked as 
unplugged
      * @return
      */
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
index 43bf52a..0689cc6 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
@@ -582,6 +582,7 @@
     HOT_UNPLUG_DISK_IS_NOT_PLUGGED,
     HOT_PLUG_NIC_VM_STATUS_ILLEGAL,
     SHAREABLE_DISK_IS_NOT_SUPPORTED_FOR_DISK,
+    SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT,
     ERROR_CANNOT_DETACH_DISK_WITH_SNAPSHOT,
     DISK_IS_ALREADY_SHARED_BETWEEN_VMS,
     VM_CANNOT_RUN_FROM_DISK_WITHOUT_PLUGGED_DISK,
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 2cf402c..6345e5e 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -693,6 +693,7 @@
 HOT_PLUG_NIC_VM_STATUS_ILLEGAL=Cannot activate/deactivate VM Network Interface 
due to VM status. The VM status must be Down or Up.
 VM_CANNOT_RUN_FROM_DISK_WITHOUT_PLUGGED_DISK=Cannot ${action} ${type} without 
at least one active disk.\nPlease activate a disk and rerun the VM.
 SHAREABLE_DISK_IS_NOT_SUPPORTED_FOR_DISK=Cannot ${action} ${type}. Disk cannot 
be shareable if it depends on a snapshot. In order to share it, remove the 
disk's snapshots.
+SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT=Cannot ${action} ${type}. 
Disk's volume format is not supported for shareable disk.
 ERROR_CANNOT_DETACH_DISK_WITH_SNAPSHOT=Cannot ${action} ${type}. The disk is 
already configured in a snapshot. In order to detach it, remove the disk's 
snapshots.
 DISK_IS_ALREADY_SHARED_BETWEEN_VMS=Cannot ${action} ${type}. Disk is shared 
between vms and cannot become unshareable . Detach the disk from the rest of 
the vms it is attached to and then update the disk to be unshareable.
 
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 1cbab82..7a9ac61 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
@@ -1855,6 +1855,9 @@
     @DefaultStringValue("Cannot ${action} ${type}. Disk cannot be shareable if 
it depends on a snapshot. In order to share it, remove the disk's snapshots.")
     String SHAREABLE_DISK_IS_NOT_SUPPORTED_FOR_DISK();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Disk's volume format is not 
supported for shareable disk.")
+    String SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT();
+
     @DefaultStringValue("Cannot ${action} ${type}. The disk is already 
configured in a snapshot. In order to detach it, remove the disk's snapshots.")
     String ERROR_CANNOT_DETACH_DISK_WITH_SNAPSHOT();
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/DiskModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/DiskModel.java
index fcea749..e205310 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/DiskModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/DiskModel.java
@@ -784,17 +784,16 @@
         }
     }
 
-    private void UpdateVolumeFormat()
+    private void updateVolumeFormat(VolumeType volumeType, StorageType 
storageType)
     {
-        VolumeType volumeType =
-                getVolumeType().getSelectedItem() == null ? 
org.ovirt.engine.core.common.businessentities.VolumeType.Unassigned
-                        : (VolumeType) getVolumeType().getSelectedItem();
-
-        StorageType storageType =
-                getStorageDomain().getSelectedItem() == null ? 
StorageType.UNKNOWN
-                        : ((storage_domains) 
getStorageDomain().getSelectedItem()).getstorage_type();
-
         setVolumeFormat(DataProvider.GetDiskVolumeFormat(volumeType, 
storageType));
+    }
+
+    private void updateShareable(VolumeType volumeType, StorageType 
storageType) {
+        getIsShareable().setEntity(false);
+        getIsShareable().setIsChangable(!(storageType.isBlockDomain() && 
volumeType == VolumeType.Sparse));
+        getIsShareable().getChangeProhibitionReasons().add(
+                
ConstantsManager.getInstance().getConstants().shareableDiskNotSupportedByConfiguration());
     }
 
     private boolean isDatacenterAvailable(storage_pool dataCenter)
@@ -858,7 +857,16 @@
 
     private void VolumeType_SelectedItemChanged()
     {
-        UpdateVolumeFormat();
+        VolumeType volumeType =
+                getVolumeType().getSelectedItem() == null ? 
VolumeType.Unassigned
+                        : (VolumeType) getVolumeType().getSelectedItem();
+
+        StorageType storageType =
+                getStorageDomain().getSelectedItem() == null ? 
StorageType.UNKNOWN
+                        : ((storage_domains) 
getStorageDomain().getSelectedItem()).getstorage_type();
+
+        updateVolumeFormat(volumeType, storageType);
+        updateShareable(volumeType, storageType);
     }
 
     private void WipeAfterDelete_EntityChanged(EventArgs e)
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Constants.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Constants.java
index bac772d..3360172 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Constants.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/Constants.java
@@ -1439,6 +1439,9 @@
     @DefaultStringValue("Shareable Disk is not supported by the Data Center 
Compatibility Version")
     String shareableDiskNotSupported();
 
+    @DefaultStringValue("Shareable Disk is not supported by the selected 
configuration")
+    String shareableDiskNotSupportedByConfiguration();
+
     @DefaultStringValue("Cannot remove more than one brick from a Replicate 
volume at a time")
     String cannotRemoveBricksReplicateVolume();
 
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 f98c602..53c512d 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
@@ -687,6 +687,7 @@
 HOT_PLUG_NIC_VM_STATUS_ILLEGAL=Cannot activate/deactivate VM Network Interface 
due to VM status. The VM status must be Down or Up.
 VM_CANNOT_RUN_FROM_DISK_WITHOUT_PLUGGED_DISK=Cannot ${action} ${type} without 
at least one active disk.\nPlease activate a disk and rerun the VM.
 SHAREABLE_DISK_IS_NOT_SUPPORTED_FOR_DISK=Cannot ${action} ${type}. Disk cannot 
be shareable if it depends on a snapshot. In order to share it, remove the 
disk's snapshots.
+SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT=Cannot ${action} ${type}. 
Disk's volume format is not supported for shareable disk.
 ERROR_CANNOT_DETACH_DISK_WITH_SNAPSHOT=Cannot ${action} ${type}. The disk is 
already configured in a snapshot. In order to detach it, remove the disk's 
snapshots.
 DISK_IS_ALREADY_SHARED_BETWEEN_VMS=Cannot ${action} ${type}. Disk is shared 
between vms and cannot become unshareable . Detach the disk from the rest of 
the vms it is attached to and then update the disk to be unshareable.
 
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 a8b8dd9..347d7a5 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
@@ -687,6 +687,7 @@
 HOT_PLUG_NIC_VM_STATUS_ILLEGAL=Cannot activate/deactivate VM Network Interface 
due to VM status. The VM status must be Down or Up.
 VM_CANNOT_RUN_FROM_DISK_WITHOUT_PLUGGED_DISK=Cannot ${action} ${type} without 
at least one active disk.\nPlease activate a disk and rerun the VM.
 SHAREABLE_DISK_IS_NOT_SUPPORTED_FOR_DISK=Cannot ${action} ${type}. Disk cannot 
be shareable if it depends on a snapshot. In order to share it, remove the 
disk's snapshots.
+SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT=Cannot ${action} ${type}. 
Disk's volume format is not supported for shareable disk.
 ERROR_CANNOT_DETACH_DISK_WITH_SNAPSHOT=Cannot ${action} ${type}. The disk is 
already configured in a snapshot. In order to detach it, remove the disk's 
snapshots.
 DISK_IS_ALREADY_SHARED_BETWEEN_VMS=Cannot ${action} ${type}. Disk is shared 
between vms and cannot become unshareable . Detach the disk from the rest of 
the vms it is attached to and then update the disk to be unshareable.
 


--
To view, visit http://gerrit.ovirt.org/7462
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie9594978c0b509fd540803e9dc4137266bd0501b
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to