Daniel Erez has uploaded a new change for review. Change subject: core: LUNs validation on storage creation ......................................................................
core: LUNs validation on storage creation On create/extend storage domain, validate that the specified LUNs aren't already part of another storage domain. Change-Id: Ia39a19374169fce20850b187a6d4201ff34ef0d8 Bug-Url: https://bugzilla.redhat.com/955661 Signed-off-by: Daniel Erez <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBaseTest.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/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 9 files changed, 75 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/33/19633/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java index 099b3e1..39a3865 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java @@ -93,6 +93,9 @@ .isEmpty(getStorageDomain().getStorage()))) { return failCanDoAction(VdcBllMessages.ERROR_CANNOT_CREATE_STORAGE_DOMAIN_WITHOUT_VG_LV); } + if (isLunsAlreadyPartOfStorageDomains(getParameters().getLunIds())) { + return false; + } return true; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java index 84ae32a..2794a0cf 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java @@ -65,6 +65,11 @@ protected boolean canDoAction() { super.canDoAction(); addCanDoActionMessage(VdcBllMessages.VAR__ACTION__EXTEND); + + if (isLunsAlreadyPartOfStorageDomains(getParameters().getLunIds())) { + return false; + } + boolean returnValue = checkStorageDomain() && checkStorageDomainStatus(StorageDomainStatus.Active); if (returnValue && (getStorageDomain().getStorageType() == StorageType.NFS || getStorageDomain().getStorageType() == StorageType.UNKNOWN)) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java index 957bc1f..5a90a9f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java @@ -1,11 +1,13 @@ package org.ovirt.engine.core.bll.storage; import java.io.Serializable; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CompensationContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; @@ -215,6 +217,28 @@ } } + protected boolean isLunsAlreadyPartOfStorageDomains(List<String> lunIds) { + // Get LUNs from DB + List<LUNs> lunsFromDb = getLunDao().getAll(); + List<String> existingLunIds = new ArrayList<>(); + + for (LUNs lun : lunsFromDb) { + if (lunIds.contains(lun.getLUN_id()) && lun.getStorageDomainId() != null) { + // LUN is already part of a storage domain + existingLunIds.add(lun.getLUN_id()); + } + } + + if (existingLunIds.isEmpty()) { + return false; + } + else { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_LUNS_ALREADY_PART_OF_STORAGE_DOMAINS); + addCanDoActionMessage(String.format("$lunIds %1$s", StringUtils.join(existingLunIds, ", "))); + return true; + } + } + public static void proceedLUNInDb(final LUNs lun, StorageType storageType) { proceedLUNInDb(lun,storageType,""); } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBaseTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBaseTest.java index c2919a5..b5e4c47 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBaseTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBaseTest.java @@ -8,16 +8,32 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; import org.ovirt.engine.core.common.action.StorageDomainParametersBase; +import org.ovirt.engine.core.common.businessentities.LUNs; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.LunDAO; +@RunWith(MockitoJUnitRunner.class) public class StorageDomainCommandBaseTest { + private static final Guid[] GUIDS = new Guid[] { + new Guid("11111111-1111-1111-1111-111111111111"), + new Guid("22222222-2222-2222-2222-222222222222") + }; + + @Mock + private LunDAO lunDAO; public StorageDomainCommandBase<StorageDomainParametersBase> cmd; @@ -92,6 +108,26 @@ assertTrue(cmd.checkStorageDomainStatusNotEqual(StorageDomainStatus.Active)); } + @Test + public void lunAlreadyPartOfStorageDomains() { + LUNs lun1 = new LUNs(); + lun1.setLUN_id(GUIDS[0].toString()); + lun1.setStorageDomainId(Guid.newGuid()); + LUNs lun2 = new LUNs(); + lun2.setLUN_id(GUIDS[1].toString()); + lun2.setStorageDomainId(Guid.newGuid()); + + doReturn(lunDAO).when(cmd).getLunDao(); + when(lunDAO.getAll()).thenReturn(Arrays.asList(lun1, lun2)); + List<String> specifiedLunIds = Collections.singletonList(GUIDS[0].toString()); + + assertTrue(cmd.isLunsAlreadyPartOfStorageDomains(specifiedLunIds)); + List<String> messages = cmd.getReturnValue().getCanDoActionMessages(); + assertEquals(messages.size(), 2); + assertEquals(messages.get(0), VdcBllMessages.ACTION_TYPE_FAILED_LUNS_ALREADY_PART_OF_STORAGE_DOMAINS.toString()); + assertEquals(messages.get(1), String.format("$lunIds %1$s", specifiedLunIds.get(0))); + } + private void storagePoolExists() { when(cmd.checkStoragePool()).thenReturn(true); } 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 2ce81c7..bde4334 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 @@ -474,6 +474,7 @@ ACTION_TYPE_FAILED_EXTERNAL_NETWORK_CANNOT_HAVE_MTU(ErrorType.NOT_SUPPORTED), ACTION_TYPE_FAILED_EXTERNAL_NETWORKS_CANNOT_BE_PROVISIONED(ErrorType.NOT_SUPPORTED), ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_IN_STORAGE_POOL(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_LUNS_ALREADY_PART_OF_STORAGE_DOMAINS(ErrorType.CONFLICT), ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST(ErrorType.BAD_PARAMETERS), 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 c11ed2b..2c034b3 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -418,6 +418,7 @@ The ${action} action can be performed on a Data Center that has only one Storage Domain in Active/Unknown state. ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST= Data Center doesn't exist. ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_IN_STORAGE_POOL=Cannot ${action} ${type}. The selected Storage Domain is not part of the Data Center. +ACTION_TYPE_FAILED_LUNS_ALREADY_PART_OF_STORAGE_DOMAINS=Cannot ${action} ${type}. The following LUNs are already part of existing storage domains: ${lunIds}. ERROR_CANNOT_DETACH_STORAGE_DOMAIN_WITH_IMAGES=Cannot detach a non empty Storage Domain.\n\ -Please remove all VMs / Templates / Disks and try again. ERROR_CANNOT_REMOVE_STORAGE_POOL_WITH_IMAGES=Cannot remove Data Center while it contains disks.\n\ 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 1ccf6be..3db3310 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 @@ -1147,6 +1147,9 @@ @DefaultStringValue("Cannot ${action} ${type}. The selected Storage Domain is not part of the Data Center.") String ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_IN_STORAGE_POOL(); + @DefaultStringValue("Cannot ${action} ${type}. The following LUNs are already part of existing storage domains: ${lunIds}.") + String ACTION_TYPE_FAILED_LUNS_ALREADY_PART_OF_STORAGE_DOMAINS(); + @DefaultStringValue("Cannot detach a non empty Storage Domain.\n-Please remove all VMs / Templates / Disks and try again.") String ERROR_CANNOT_DETACH_STORAGE_DOMAIN_WITH_IMAGES(); 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 836dbd7..1ef003f 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 @@ -397,6 +397,7 @@ The ${action} action can be performed on a Data Center that has only one Storage Domain in Active/Unknown state. ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST= Data Center doesn't exist. ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_IN_STORAGE_POOL=Cannot ${action} ${type}. The selected Storage Domain is not part of the Data Center. +ACTION_TYPE_FAILED_LUNS_ALREADY_PART_OF_STORAGE_DOMAINS=Cannot ${action} ${type}. The following LUNs are already part of existing storage domains: ${lunIds}. ERROR_CANNOT_DETACH_STORAGE_DOMAIN_WITH_IMAGES=Cannot detach a non empty Storage Domain.\n\ -Please remove all VMs / Templates / Disks and try again. ERROR_CANNOT_REMOVE_STORAGE_POOL_WITH_IMAGES=Cannot remove Data Center while it contains disks.\n\ 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 79fcc2a..754d814 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 @@ -422,6 +422,7 @@ The ${action} action can be performed on a Data Center that has only one Storage Domain in Active/Unknown state. ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST= Data Center doesn't exist. ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_IN_STORAGE_POOL=Cannot ${action} ${type}. The selected Storage Domain is not part of the Data Center. +ACTION_TYPE_FAILED_LUNS_ALREADY_PART_OF_STORAGE_DOMAINS=Cannot ${action} ${type}. The following LUNs are already part of existing storage domains: ${lunIds}. ERROR_CANNOT_DETACH_STORAGE_DOMAIN_WITH_IMAGES=Cannot detach a non empty Storage Domain.\n\ -Please remove all VMs / Templates / Disks and try again. ERROR_CANNOT_REMOVE_STORAGE_POOL_WITH_IMAGES=Cannot remove Data Center while it contains disks.\n\ -- To view, visit http://gerrit.ovirt.org/19633 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia39a19374169fce20850b187a6d4201ff34ef0d8 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
