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 it's 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/AddIscsiBondCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/BaseIscsiBondCommand.java 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/EditIscsiBondCommand.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/StorageServerConnectionDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAODbFacadeImpl.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/dal/src/test/java/org/ovirt/engine/core/dao/StorageServerConnectionDAOTest.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ConnectStorageServerVDSCommand.java M packaging/dbscripts/create_views.sql M packaging/dbscripts/network_sp.sql M packaging/dbscripts/storages_san_sp.sql 17 files changed, 179 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/41/23541/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddIscsiBondCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddIscsiBondCommand.java index df0c202..8b7da3d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddIscsiBondCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddIscsiBondCommand.java @@ -54,6 +54,7 @@ } }); + connectAllHostsToStorage(iscsiBond.getStorageConnectionIds()); setSucceeded(true); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/BaseIscsiBondCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/BaseIscsiBondCommand.java index b8bb09b..d058a90 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/BaseIscsiBondCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/BaseIscsiBondCommand.java @@ -1,14 +1,23 @@ package org.ovirt.engine.core.bll.storage; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.Callable; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.businessentities.IscsiBond; +import org.ovirt.engine.core.common.businessentities.StorageServerConnections; +import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.vdscommands.StorageServerConnectionManagementVDSParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; public abstract class BaseIscsiBondCommand<T extends VdcActionParametersBase> extends CommandBase<T> { @@ -26,6 +35,27 @@ VdcObjectType.StoragePool, getActionType().getActionGroup())); } + protected void connectAllHostsToStorage(List<String> connectionIds) { + List<Callable<Void>> tasks = new ArrayList<>(); + final List<StorageServerConnections> connections = getDbFacade().getStorageServerConnectionDao().getByIds(connectionIds); + List<VDS> hosts = getVdsDAO().getAllForStoragePoolAndStatus(getIscsiBond().getStoragePoolId(), VDSStatus.Up); + + for (final VDS host : hosts) { + tasks.add(new Callable<Void>() { + @Override + public Void call() throws Exception { + final List<StorageServerConnections> conns = ISCSIStorageHelper.updateIfaces(connections, host.getId()); + runVdsCommand(VDSCommandType.ConnectStorageServer, + new StorageServerConnectionManagementVDSParameters(host.getId(), Guid.Empty, StorageType.ISCSI, conns) + ); + return null; + } + }); + } + + ThreadPoolUtil.invokeAll(tasks); + } + /** * Used by audit log to populate ${IscsiBondName} placeholder. * @return 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..dc47d87 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.updateIfaces(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..7ac95e1 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.updateIfaces(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/EditIscsiBondCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/EditIscsiBondCommand.java index 51688d9..e1e65cb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/EditIscsiBondCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/EditIscsiBondCommand.java @@ -1,5 +1,6 @@ package org.ovirt.engine.core.bll.storage; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -20,6 +21,9 @@ public class EditIscsiBondCommand <T extends EditIscsiBondParameters> extends BaseIscsiBondCommand<T> { private IscsiBond existingIscsiBond; + + private List<String> addedConnections = new ArrayList<>(); + private List<Guid> addedNetworks = new ArrayList<>(); public EditIscsiBondCommand(T parameters) { super(parameters); @@ -62,6 +66,10 @@ } }); + if (!addedConnections.isEmpty() || !addedNetworks.isEmpty()) { + connectAllHostsToStorage(getIscsiBond().getStorageConnectionIds()); + } + setSucceeded(true); } @@ -70,6 +78,7 @@ for (Guid networkId : getIscsiBond().getNetworkIds()) { if (!beforeChangeNetworkIds.remove(networkId)) { + addedNetworks.add(networkId); getDbFacade().getIscsiBondDao().addNetworkToIscsiBond(getExistingIscsiBond().getId(), networkId); } } @@ -84,6 +93,7 @@ for (String connectionId : getIscsiBond().getStorageConnectionIds()) { if (!beforeChangeConnectionIds.remove(connectionId)) { + addedConnections.add(connectionId); getDbFacade().getIscsiBondDao().addStorageConnectionToIscsiBond(getExistingIscsiBond().getId(), connectionId); } } 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..4353eb2 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 = updateIfaces(list, vdsId); } Guid poolId = storagePoolId; if (storageDomain != null && storageDomain.getStoragePoolId() != null) { @@ -74,6 +77,32 @@ return isSuccess; } + public static List<StorageServerConnections> updateIfaces(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> ifaces = DbFacade.getInstance().getInterfaceDao() + .getIscsiIfacesByHostIdAndStorageTargetId(vdsId, conn.getid()); + + if (!ifaces.isEmpty()) { + conn.setIface(ifaces.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 iface : ifaces) { + StorageServerConnections newConn = StorageServerConnections.copyOf(conn); + newConn.setid(Guid.newGuid().toString()); + newConn.setIface(iface.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..99da2b0 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 iface; + + public String getIface() { + return iface; + } + + public void setIface(String iface) { + this.iface = iface; + } + @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 (getIface() != null) { + sb.append(", iface: "); + sb.append(this.getIface()); + } sb.append(" };"); return sb.toString(); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAO.java index d7421ec..c122f0d 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAO.java @@ -29,6 +29,15 @@ StorageServerConnections get(String id); /** + * Retrieves connections which id is one of the specified ids. + * + * @param ids + * the list of connection ids + * @return + */ + List<StorageServerConnections> getByIds(List<String> ids); + + /** * Retrieves the connection for the given iqn. * * @param iqn diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAODbFacadeImpl.java index 86b35f4..392ae10 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageServerConnectionDAODbFacadeImpl.java @@ -4,6 +4,7 @@ import java.sql.SQLException; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.ovirt.engine.core.common.businessentities.NfsVersion; @@ -33,6 +34,12 @@ } @Override + public List<StorageServerConnections> getByIds(List<String> ids) { + return getCallsHandler().executeReadList("GetStorageServerConnectionsByIds", + mapper, getCustomMapSqlParameterSource().addValue("ids", StringUtils.join(ids, ","))); + } + + @Override public StorageServerConnections getForIqn(String iqn) { return getCallsHandler().executeRead("Getstorage_server_connectionsByIqn", mapper, getCustomMapSqlParameterSource() 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 ffff869..e87e64e 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 @@ -177,4 +177,16 @@ * @return all labels defined for the data-center's networks */ Set<String> getAllNetworkLabelsForDataCenter(Guid id); + + /** + * Retrieve the list of the host endpoints (nics or vlans) that configured as iscsi session + * initiators to the relevant iscsi target + * + * @param hostId + * the host id + * @param storageTargetId + * the iscsi target id + * @return + */ + List<VdsNetworkInterface> getIscsiIfacesByHostIdAndStorageTargetId(Guid hostId, 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 17212cd..9376bb5 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 @@ -271,6 +271,13 @@ } + @Override + public List<VdsNetworkInterface> getIscsiIfacesByHostIdAndStorageTargetId(Guid hostId, String storageTargetId) { + return getCallsHandler().executeReadList("GetIscsiIfacesByHostIdAndStorageTargetId", + vdsNetworkInterfaceRowMapper, + getCustomMapSqlParameterSource().addValue("host_id", hostId).addValue("target_id", storageTargetId)); + } + private static final RowMapper<VdsNetworkInterface> vdsNetworkInterfaceRowMapper = new RowMapper<VdsNetworkInterface>() { @SuppressWarnings("unchecked") diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageServerConnectionDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageServerConnectionDAOTest.java index c909312..65a0ce7 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageServerConnectionDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StorageServerConnectionDAOTest.java @@ -7,6 +7,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import java.util.Arrays; import java.util.List; import org.junit.Test; @@ -232,4 +233,10 @@ assertEquals(connections.size(), 2); assertTrue((connections.get(0).getid().equals("fDMzhE-wx3s-zo3q-Qcxd-T0li-yoYU-QvVePk")) || (connections.get(0).getid().equals("0cc146e8-e5ed-482c-8814-270bc48c297e"))); } + + @Test + public void testGetConnectionsBySpecificIds() { + List<StorageServerConnections> connections = dao.getByIds(Arrays.asList("0cc146e8-e5ed-482c-8814-270bc48c297f")); + assertEquals(1, connections.size()); + } } diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java index 91f61e4..26dd2e8 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java @@ -28,6 +28,7 @@ private static final String IP_ADDR = "10.35.110.10"; private static final Guid VDS_ID = new Guid("afce7a39-8e8c-4819-ba9c-796d316592e6"); private static final Guid CLUSTER_ID = new Guid("b399944a-81ab-4ec5-8266-e19ba7c3c9d1"); + private static final String TARGET_ID = "0cc146e8-e5ed-482c-8814-270bc48c297b"; private static final String LABEL = "abc"; private InterfaceDao dao; @@ -371,4 +372,16 @@ assertNotNull(map.get(VDS_ID)); assertFalse(map.get(VDS_ID).isEmpty()); } + + public void testGetIscsiIfacesByHostIdAndStorageTargetId() { + List<VdsNetworkInterface> interfaces = + dao.getIscsiIfacesByHostIdAndStorageTargetId(VDS_ID, TARGET_ID); + + assertNotNull(interfaces); + assertFalse(interfaces.isEmpty()); + + for (VdsNetworkInterface nic : interfaces) { + assertEquals(VDS_ID, nic.getVdsId()); + } + } } 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..2ed19f1 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.getIface()); // 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/create_views.sql b/packaging/dbscripts/create_views.sql index cc77956..3aadaed 100644 --- a/packaging/dbscripts/create_views.sql +++ b/packaging/dbscripts/create_views.sql @@ -878,7 +878,7 @@ vds_interface.bond_name, vds_interface.is_bond, vds_interface.bond_opts, vds_interface.mac_addr, vds_interface.network_name, vds_interface.name, vds_static.vds_id, vds_static.vds_name, vds_interface.id, vds_interface.boot_protocol, vds_interface.mtu as mtu, vds_interface.bridged, 1 AS is_vds, vds_interface.qos_overridden AS qos_overridden, - vds_interface.labels as labels + vds_interface.labels as labels, vds_static.vds_group_id as vds_group_id FROM vds_interface_statistics JOIN vds_interface ON vds_interface_statistics.id = vds_interface.id JOIN vds_static ON vds_interface.vds_id = vds_static.vds_id; diff --git a/packaging/dbscripts/network_sp.sql b/packaging/dbscripts/network_sp.sql index 87b720c..47b67a1 100644 --- a/packaging/dbscripts/network_sp.sql +++ b/packaging/dbscripts/network_sp.sql @@ -1252,3 +1252,24 @@ WHERE network_qos_id = v_network_qos_id; END; $procedure$ LANGUAGE plpgsql; + + +Create or replace FUNCTION GetIscsiIfacesByHostIdAndStorageTargetId(v_host_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, + 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_interface_view.vds_group_id AND + vds_interface_view.vds_id = v_host_id; +END; $procedure$ +LANGUAGE plpgsql; diff --git a/packaging/dbscripts/storages_san_sp.sql b/packaging/dbscripts/storages_san_sp.sql index 5f07bc8..3a6c7f3 100644 --- a/packaging/dbscripts/storages_san_sp.sql +++ b/packaging/dbscripts/storages_san_sp.sql @@ -507,6 +507,14 @@ LANGUAGE plpgsql; +Create or replace FUNCTION GetStorageServerConnectionsByIds(v_ids TEXT) +RETURNS SETOF storage_server_connections STABLE + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM storage_server_connections WHERE id = any(string_to_array(v_ids,',')::VARCHAR[]); +END; $procedure$ +LANGUAGE plpgsql; Create or replace FUNCTION Getstorage_server_connectionsByVolumeGroupId(v_volume_group_id VARCHAR(50)) RETURNS SETOF storage_server_connections STABLE -- To view, visit http://gerrit.ovirt.org/23541 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I779f6dd95dfbfc2b74ad7ba3ce2271b7c9ad94db Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Sergey Gotliv <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
