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
