Sergey Gotliv has uploaded a new change for review.

Change subject: engine: Setup multiple iscsi sessions with the iscsi target
......................................................................

engine: Setup multiple iscsi sessions with the iscsi target

Up until now the engine allowed to create single connection to the
iscsi target using only one interface.
>From now on its possible to configure iscsi multipath which will
protect against failing of the single network interface and provide
better throughput by using more than one interface.

Change-Id: I779f6dd95dfbfc2b74ad7ba3ce2271b7c9ad94db
Bug-Url: https://bugzilla.redhat.com/753541
Signed-off-by: Sergey Gotliv <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java
M packaging/dbscripts/network_sp.sql
8 files changed, 85 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/98/23198/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java
index 88a883d..6bac6d0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectHostToStoragePoolServersCommand.java
@@ -57,6 +57,10 @@
     private boolean connectStorageServer(StorageType type, 
List<StorageServerConnections> connections) {
         boolean connectSucceeded = true;
         if (connections != null && connections.size() > 0) {
+            if (type == StorageType.ISCSI) {
+                connections = ISCSIStorageHelper.updateInitiators(connections, 
getVds().getId());
+            }
+
             Map<String, String> retValues = (HashMap<String, String>) Backend
                     .getInstance()
                     .getResourceManager()
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java
index b1389de..99d4a5a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ConnectStorageToVdsCommand.java
@@ -9,6 +9,7 @@
 import org.ovirt.engine.core.bll.InternalCommandAttribute;
 import 
org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase;
 import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
+import org.ovirt.engine.core.common.businessentities.StorageType;
 import org.ovirt.engine.core.common.errors.VdcFault;
 import org.ovirt.engine.core.common.utils.Pair;
 import 
org.ovirt.engine.core.common.vdscommands.StorageServerConnectionManagementVDSParameters;
@@ -46,6 +47,10 @@
     protected Pair<Boolean, Integer> connectHostToStorage() {
         List<StorageServerConnections> connections = 
Arrays.asList(getConnection());
 
+        if (getConnection().getstorage_type() == StorageType.ISCSI) {
+            connections = ISCSIStorageHelper.updateInitiators(connections, 
getVds().getId());
+        }
+
         Map<String, String> result = (HashMap<String, String>) runVdsCommand(
                 VDSCommandType.ConnectStorageServer,
                 new 
StorageServerConnectionManagementVDSParameters(getVds().getId(), Guid.Empty,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
index c536841..dbe46cd 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java
@@ -14,6 +14,7 @@
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
 import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
 import org.ovirt.engine.core.common.businessentities.StorageType;
+import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
 import 
org.ovirt.engine.core.common.vdscommands.StorageServerConnectionManagementVDSParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
@@ -47,6 +48,8 @@
             if (VDSCommandType.forValue(type) == 
VDSCommandType.DisconnectStorageServer) {
                 list = filterConnectionsUsedByOthers(list, 
storageDomain.getStorage(), lun != null ? lun.getLUN_id()
                         : "");
+            } else if (VDSCommandType.forValue(type) == 
VDSCommandType.ConnectStorageServer) {
+                list = updateInitiators(list, vdsId);
             }
             Guid poolId = storagePoolId;
             if (storageDomain != null && storageDomain.getStoragePoolId() != 
null) {
@@ -74,6 +77,32 @@
         return isSuccess;
     }
 
+    public static List<StorageServerConnections> 
updateInitiators(List<StorageServerConnections> conns, Guid vdsId) {
+        List<StorageServerConnections> res = new ArrayList<>(conns);
+
+        for (StorageServerConnections conn : conns) {
+            // Get list of endpoints (nics or vlans) that will initiate iscsi 
sessions.
+            // Targets are represented by StorageServerConnections object 
(connection, iqn, port, portal).
+            List<VdsNetworkInterface> initiators = 
DbFacade.getInstance().getInterfaceDao()
+                    .getIscsiInitiatorsByVdsIdAndStorageTargetId(vdsId, 
conn.getid());
+
+            if (initiators != null && !initiators.isEmpty()) {
+                conn.setInitiatorName(initiators.remove(0).getName());
+
+                // Iscsi target is represented by connection object, therefore 
if this target is approachable
+                // from more than one endpoint(initiator) we have to clone 
this connection per endpoint.
+                for (VdsNetworkInterface initiator : initiators) {
+                    StorageServerConnections newConn = 
StorageServerConnections.copyOf(conn);
+                    newConn.setid(Guid.newGuid().toString());
+                    newConn.setInitiatorName(initiator.getName());
+                    res.add(newConn);
+                }
+            }
+        }
+
+        return res;
+    }
+
     @SuppressWarnings("unchecked")
     @Override
     protected List<StorageServerConnections> filterConnectionsUsedByOthers(
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java
index 01bb78c..833f9d2 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageServerConnections.java
@@ -177,6 +177,16 @@
     @Max(value = Short.MAX_VALUE, message = 
"VALIDATION_STORAGE_CONNECTION_NFS_RETRANS")
     private Short nfsRetrans;
 
+    private String initiatorName;
+
+    public String getInitiatorName() {
+        return initiatorName;
+    }
+
+    public void setInitiatorName(String initiatorName) {
+        this.initiatorName = initiatorName;
+    }
+
     @Override
     public boolean equals(Object obj) {
         boolean returnValue = super.equals(obj);
@@ -232,6 +242,10 @@
         sb.append(this.getNfsRetrans());
         sb.append(", nfsTimeo: ");
         sb.append(this.getNfsTimeo());
+        if (getInitiatorName() != null) {
+            sb.append(", initiatorName: ");
+            sb.append(this.getInitiatorName());
+        }
         sb.append(" };");
         return sb.toString();
     }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
index 5c2867a..28082cd 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
@@ -166,4 +166,6 @@
      * @return all labels defined for the data-center's networks
      */
     Set<String> getAllNetworkLabelsForDataCenter(Guid id);
+
+    List<VdsNetworkInterface> getIscsiInitiatorsByVdsIdAndStorageTargetId(Guid 
vdsId, String storageTargetId);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
index c8504f3..0f5d885 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
@@ -248,6 +248,13 @@
 
     }
 
+    @Override
+    public List<VdsNetworkInterface> 
getIscsiInitiatorsByVdsIdAndStorageTargetId(Guid vdsId, String storageTargetId) 
{
+        return 
getCallsHandler().executeReadList("GetIscsiInitiatorsByVdsIdAndStorageTargetId",
+                vdsNetworkInterfaceRowMapper,
+                getCustomMapSqlParameterSource().addValue("vds_id", 
vdsId).addValue("target_id", storageTargetId));
+    }
+
     private static final RowMapper<VdsNetworkInterface> 
vdsNetworkInterfaceRowMapper =
             new RowMapper<VdsNetworkInterface>() {
                 @SuppressWarnings("unchecked")
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java
index 543c6f4..68f0a46 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java
@@ -78,6 +78,7 @@
         con.put("iqn", connection.getiqn(), "");
         con.put("user", connection.getuser_name(), "");
         con.put("password", connection.getpassword(), "");
+        con.putIfNotEmpty("initiatorName", connection.getInitiatorName());
 
         // storage_pool can be null when discovering iscsi send targets or 
when connecting
         // through vds which has no storage pool
diff --git a/packaging/dbscripts/network_sp.sql 
b/packaging/dbscripts/network_sp.sql
index 1ab54cb..eaf58ff 100644
--- a/packaging/dbscripts/network_sp.sql
+++ b/packaging/dbscripts/network_sp.sql
@@ -1242,3 +1242,26 @@
    WHERE network_qos_id = v_network_qos_id;
 END; $procedure$
 LANGUAGE plpgsql;
+
+
+Create or replace FUNCTION 
GetIscsiInitiatorsByVdsIdAndStorageTargetId(v_vds_id UUID, v_target_id 
varchar(50)) RETURNS SETOF vds_interface_view STABLE
+   AS $procedure$
+BEGIN
+   RETURN QUERY SELECT vds_interface_view.*
+   FROM vds_interface_view,
+        vds,
+        network_cluster,
+        network,
+        iscsi_bonds_networks_map,
+        iscsi_bonds_storage_connections_map
+   WHERE
+       iscsi_bonds_storage_connections_map.connection_id = v_target_id AND
+       iscsi_bonds_storage_connections_map.iscsi_bond_id = 
iscsi_bonds_networks_map.iscsi_bond_id AND
+       iscsi_bonds_networks_map.network_id = network.id AND
+       network.id = network_cluster.network_id AND
+       network.name = vds_interface_view.network_name AND
+       network_cluster.cluster_id = vds.vds_group_id AND
+       vds.vds_id = vds_interface_view.vds_id AND
+       vds_interface_view.vds_id = v_vds_id;
+END; $procedure$
+LANGUAGE plpgsql;


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

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

Reply via email to