Daniel Erez has uploaded a new change for review.

Change subject: core: allow identical path for different local domains
......................................................................

core: allow identical path for different local domains

StorageServerConnectionCommandBase -> isConnWithSameDetailsExists:
Added a specific validation for local domains connections;
allowing identical path for local domains residing
on different data-centers.

Note: as a future work, we should add a unique identification
for a local domains connections (e.g. to differentiate between
local connections retrieved from the rest-api).

Change-Id: I4628d7fa442b959d5582e44386f31518b98852e7
Bug-Url: https://bugzilla.redhat.com/1023739
Signed-off-by: Daniel Erez <de...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageServerConnectionCommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommandTest.java
5 files changed, 87 insertions(+), 25 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/96/21096/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java
index f5a9be0..8ab799f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java
@@ -92,7 +92,8 @@
             return false;
         }
 
-        if (isConnWithSameDetailsExists(paramConnection)) {
+        Guid storagePoolId = Guid.isNullOrEmpty(getParameters().getVdsId()) ? 
null : getVds().getStoragePoolId();
+        if (isConnWithSameDetailsExists(paramConnection, storagePoolId)) {
             return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS);
         }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageServerConnectionCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageServerConnectionCommandBase.java
index 0e76abd..7f75d88 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageServerConnectionCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageServerConnectionCommandBase.java
@@ -3,6 +3,7 @@
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.CommandBase;
 import org.ovirt.engine.core.bll.MultiLevelAdministrationHandler;
@@ -53,9 +54,28 @@
         return 
getStorageDomainDao().getAllByConnectionId(Guid.createGuidFromString(connectionId));
     }
 
-    protected boolean isConnWithSameDetailsExists(StorageServerConnections 
connection) {
+    /**
+     * Returns storage pool ID by a specified file domain connection
+     * (isn't relevant for block domains as a single connection can be used by 
multiple block domains).
+     */
+    protected Guid getStoragePoolIdByFileConnectionId(String connectionId) {
+        List<StorageDomain> storageDomains = 
getStorageDomainsByConnId(connectionId);
+        if (storageDomains.isEmpty()) {
+            return null;
+        }
+
+        return storageDomains.get(0).getStoragePoolId();
+    }
+
+    protected boolean isConnWithSameDetailsExists(StorageServerConnections 
connection, Guid storagePoolId) {
         List<StorageServerConnections> connections = null;
-        if (connection.getstorage_type().isFileDomain()) {
+        if (connection.getstorage_type() == StorageType.LOCALFS) {
+            List<StorageServerConnections> connectionsForPool = storagePoolId 
== null ? Collections.<StorageServerConnections> emptyList() :
+                    
getStorageConnDao().getAllConnectableStorageSeverConnection(storagePoolId);
+            List<StorageServerConnections> connectionsForPath = 
getStorageConnDao().getAllForStorage(connection.getconnection());
+            connections = (List<StorageServerConnections>) 
CollectionUtils.intersection(connectionsForPool, connectionsForPath);
+        }
+        else if (connection.getstorage_type().isFileDomain()) {
             String connectionField = connection.getconnection();
             connections = 
getStorageConnDao().getAllForStorage(connectionField);
         }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
index b620233..ca4b418 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java
@@ -84,7 +84,8 @@
             return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_CHANGE_STORAGE_TYPE);
         }
 
-        if (isConnWithSameDetailsExists(newConnectionDetails)) {
+        Guid storagePoolId = 
getStoragePoolIdByFileConnectionId(oldConnection.getid());
+        if (isConnWithSameDetailsExists(newConnectionDetails, storagePoolId)) {
             return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS);
         }
 
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java
index eca6075..5fbacf1 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll.storage;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -7,6 +8,7 @@
 import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.junit.Before;
@@ -23,6 +25,7 @@
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.StorageDomainDAO;
 import org.ovirt.engine.core.dao.StorageServerConnectionDAO;
 import org.ovirt.engine.core.utils.MockEJBStrategyRule;
 
@@ -38,12 +41,16 @@
     @Mock
     StorageServerConnectionDAO storageConnDao;
 
+    @Mock
+    StorageDomainDAO storageDomainDao;
+
     @Before
     public void prepareParams() {
         parameters = new StorageServerConnectionParametersBase();
         parameters.setVdsId(Guid.newGuid());
         command = spy(new 
AddStorageServerConnectionCommand<StorageServerConnectionParametersBase>(parameters));
         doReturn(storageConnDao).when(command).getStorageConnDao();
+        doReturn(storageDomainDao).when(command).getStorageDomainDao();
     }
 
     private StorageServerConnections createPosixConnection(String connection,
@@ -96,7 +103,7 @@
                         "timeo=30");
         parameters.setStorageServerConnection(newPosixConnection);
         parameters.setVdsId(Guid.Empty);
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
     }
 
@@ -120,7 +127,7 @@
                         "mypassword123");
         parameters.setStorageServerConnection(newISCSIConnection);
         parameters.setVdsId(Guid.Empty);
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newISCSIConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newISCSIConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
     }
 
@@ -142,7 +149,7 @@
                         "timeo=30");
         parameters.setStorageServerConnection(newPosixConnection);
         parameters.setVdsId(Guid.Empty);
-        
doReturn(true).when(command).isConnWithSameDetailsExists(newPosixConnection);
+        
doReturn(true).when(command).isConnWithSameDetailsExists(newPosixConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionFailure(command,
                 
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS);
     }
@@ -156,7 +163,7 @@
                         "timeo=30");
         newPosixConnection.setid("");
         parameters.setStorageServerConnection(newPosixConnection);
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection, 
null);
         Pair<Boolean, Integer> connectResult = new Pair(true, 0);
         doReturn(connectResult).when(command).connectHostToStorage();
         
doReturn(null).when(command).getConnectionFromDbById(newPosixConnection.getid());
@@ -176,7 +183,7 @@
         newPosixConnection.setid("");
         parameters.setStorageServerConnection(newPosixConnection);
         parameters.setVdsId(Guid.Empty);
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection, 
null);
         
doReturn(null).when(command).getConnectionFromDbById(newPosixConnection.getid());
         doNothing().when(command).saveConnection(newPosixConnection);
 
@@ -194,7 +201,7 @@
         newPosixConnection.setid("");
         parameters.setStorageServerConnection(newPosixConnection);
         parameters.setVdsId(null);
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection, 
null);
         
doReturn(null).when(command).getConnectionFromDbById(newPosixConnection.getid());
         doNothing().when(command).saveConnection(newPosixConnection);
 
@@ -212,7 +219,7 @@
         newPosixConnection.setid(Guid.newGuid().toString());
         parameters.setStorageServerConnection(newPosixConnection);
         parameters.setVdsId(Guid.Empty);
-        
doReturn(true).when(command).isConnWithSameDetailsExists(newPosixConnection);
+        
doReturn(true).when(command).isConnWithSameDetailsExists(newPosixConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionFailure(command,
                 
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_ID_NOT_EMPTY);
     }
@@ -242,7 +249,40 @@
        connections.add(existingConn);
 
        
when(storageConnDao.getAllForConnection(newISCSIConnection)).thenReturn(connections);
-       boolean isExists = 
command.isConnWithSameDetailsExists(newISCSIConnection);
+       boolean isExists = 
command.isConnWithSameDetailsExists(newISCSIConnection, null);
        assertTrue(isExists);
     }
+
+    @Test
+    public void isLocalDomainConnWithSamePathAndPoolExist() {
+        StorageServerConnections newLocalConnection = 
populateBasicConnectionDetails("/localSD", StorageType.LOCALFS);
+        StorageServerConnections existingConn = 
populateBasicConnectionDetails("/localSD", StorageType.LOCALFS);
+        existingConn.setid(Guid.newGuid().toString());
+
+        Guid storagePoolId = Guid.newGuid();
+        List<StorageServerConnections> connections = 
Collections.singletonList(existingConn);
+
+        
when(storageConnDao.getAllConnectableStorageSeverConnection(storagePoolId)).thenReturn(connections);
+        
when(storageConnDao.getAllForStorage(newLocalConnection.getconnection())).thenReturn(connections);
+
+        boolean isExists = 
command.isConnWithSameDetailsExists(newLocalConnection, storagePoolId);
+        assertTrue(isExists);
+    }
+
+    @Test
+    public void isLocalDomainConnWithSamePathAndPoolNotExist() {
+        StorageServerConnections newLocalConnection = 
populateBasicConnectionDetails("/localSD", StorageType.LOCALFS);
+        StorageServerConnections existingConn = 
populateBasicConnectionDetails("/localSD", StorageType.LOCALFS);
+
+        Guid newLocalConnectionStoragePoolId = Guid.newGuid();
+        Guid existingLocalConnectionStoragePoolId = Guid.newGuid();
+
+        List<StorageServerConnections> connections = 
Collections.singletonList(existingConn);
+
+        
when(storageConnDao.getAllConnectableStorageSeverConnection(existingLocalConnectionStoragePoolId)).thenReturn(connections);
+        
when(storageConnDao.getAllForStorage(newLocalConnection.getconnection())).thenReturn(connections);
+
+        boolean isExists = 
command.isConnWithSameDetailsExists(newLocalConnection, 
newLocalConnectionStoragePoolId);
+        assertFalse(isExists);
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommandTest.java
index 2fc00dd..9d932ab 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommandTest.java
@@ -270,7 +270,7 @@
         connections.add(conn2);
         
when(storageConnDao.getAllForStorage(newNFSConnection.getconnection())).thenReturn(connections);
         
when(storageConnDao.get(newNFSConnection.getid())).thenReturn(oldNFSConnection);
-        
doReturn(true).when(command).isConnWithSameDetailsExists(newNFSConnection);
+        
doReturn(true).when(command).isConnWithSameDetailsExists(newNFSConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionFailure(command,
                 
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS);
     }
@@ -297,7 +297,7 @@
         domains.add(domain2);
         
when(storageConnDao.get(newNFSConnection.getid())).thenReturn(oldNFSConnection);
         
doReturn(domains).when(command).getStorageDomainsByConnId(newNFSConnection.getid());
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection, 
null);
         List<String> messages =
                 CanDoActionTestUtils.runAndAssertCanDoActionFailure(command,
                         
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_BELONGS_TO_SEVERAL_STORAGE_DOMAINS);
@@ -321,7 +321,7 @@
         parameters.setStorageServerConnection(newNFSConnection);
         
when(storageConnDao.get(newNFSConnection.getid())).thenReturn(oldNFSConnection);
         
doReturn(domains).when(command).getStorageDomainsByConnId(newNFSConnection.getid());
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionFailure(command,
                 
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_DOMAINS_STATUS);
     }
@@ -510,7 +510,7 @@
         parameters.setStorageServerConnection(newNFSConnection);
         
when(storageConnDao.get(newNFSConnection.getid())).thenReturn(oldNFSConnection);
         
doReturn(domains).when(command).getStorageDomainsByConnId(newNFSConnection.getid());
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
     }
 
@@ -545,7 +545,7 @@
         domain1.setStatus(StorageDomainStatus.Maintenance);
         domains.add(domain1);
         
when(storageConnDao.get(newNFSConnection.getid())).thenReturn(oldNFSConnection);
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newNFSConnection, 
null);
         
doReturn(domains).when(command).getStorageDomainsByConnId(newNFSConnection.getid());
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
     }
@@ -566,7 +566,7 @@
         parameters.setStorageServerConnection(newPosixConnection);
         
when(storageConnDao.get(newPosixConnection.getid())).thenReturn(oldPosixConnection);
         
doReturn(domains).when(command).getStorageDomainsByConnId(newPosixConnection.getid());
-        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection);
+        
doReturn(false).when(command).isConnWithSameDetailsExists(newPosixConnection, 
null);
         CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
     }
 
@@ -705,7 +705,7 @@
        connections.add(connection2);
 
        
when(storageConnDao.getAllForStorage(newNFSConnection.getconnection())).thenReturn(connections);
-       boolean isExists = 
command.isConnWithSameDetailsExists(newNFSConnection);
+       boolean isExists = 
command.isConnWithSameDetailsExists(newNFSConnection, null);
        assertTrue(isExists);
     }
 
@@ -723,8 +723,8 @@
        connections.add(connection1);
 
        
when(storageConnDao.getAllForStorage(newNFSConnection.getconnection())).thenReturn(connections);
-       boolean isExists = 
command.isConnWithSameDetailsExists(newNFSConnection);
-       assertFalse(isExists);
+       boolean isExists = 
command.isConnWithSameDetailsExists(newNFSConnection, null);
+        assertFalse(isExists);
     }
 
     @Test
@@ -739,7 +739,7 @@
        List<StorageServerConnections> connections = new ArrayList<>();
 
        
when(storageConnDao.getAllForStorage(newNFSConnection.getconnection())).thenReturn(connections);
-       boolean isExists = 
command.isConnWithSameDetailsExists(newNFSConnection);
+       boolean isExists = 
command.isConnWithSameDetailsExists(newNFSConnection, null);
        assertFalse(isExists);
     }
 
@@ -752,7 +752,7 @@
        connections.add(connection1);
 
        
when(storageConnDao.getAllForConnection(newISCSIConnection)).thenReturn(connections);
-       boolean isExists = 
command.isConnWithSameDetailsExists(newISCSIConnection);
+       boolean isExists = 
command.isConnWithSameDetailsExists(newISCSIConnection, null);
        assertTrue(isExists);
     }
 
@@ -764,7 +764,7 @@
        connections.add(newISCSIConnection);
 
        
when(storageConnDao.getAllForConnection(newISCSIConnection)).thenReturn(connections);
-       boolean isExists = 
command.isConnWithSameDetailsExists(newISCSIConnection);
-       assertFalse(isExists);
+       boolean isExists = 
command.isConnWithSameDetailsExists(newISCSIConnection, null);
+        assertFalse(isExists);
     }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4628d7fa442b959d5582e44386f31518b98852e7
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.3
Gerrit-Owner: Daniel Erez <de...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to