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

Reply via email to