This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.17
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.17 by this push:
     new c70bc9d69c kvm: Updated PowerFlex/ScaleIO storage plugin to support 
separate (storage) network for Hosts(KVM)/Storage connection. (#6367)
c70bc9d69c is described below

commit c70bc9d69cc2ddfb3ec1d6e866488e31b3449c20
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Mon Jun 27 14:42:51 2022 +0530

    kvm: Updated PowerFlex/ScaleIO storage plugin to support separate (storage) 
network for Hosts(KVM)/Storage connection. (#6367)
    
    This PR enhances the existing PowerFlex/ScaleIO storage plugin to support 
separate (storage) network for Hosts(KVM)/Storage connection, mainly the SDC 
(ScaleIo Data Client) connection.
---
 .../cloud/agent/api/ModifyStoragePoolAnswer.java   |  8 ++-
 .../cloud/agent/api/ModifyStoragePoolCommand.java  | 15 +++++
 .../java/com/cloud/storage/StorageManager.java     |  2 +-
 .../LibvirtModifyStoragePoolCommandWrapper.java    |  4 +-
 .../kvm/storage/IscsiAdmStorageAdaptor.java        |  2 +-
 .../kvm/storage/IscsiAdmStoragePool.java           |  5 ++
 .../hypervisor/kvm/storage/KVMStoragePool.java     |  2 +
 .../kvm/storage/KVMStoragePoolManager.java         | 23 +++++--
 .../kvm/storage/LibvirtStorageAdaptor.java         |  2 +-
 .../hypervisor/kvm/storage/LibvirtStoragePool.java |  5 ++
 .../kvm/storage/LinstorStorageAdaptor.java         |  2 +-
 .../hypervisor/kvm/storage/LinstorStoragePool.java |  5 ++
 .../kvm/storage/ManagedNfsStorageAdaptor.java      |  2 +-
 .../kvm/storage/ScaleIOStorageAdaptor.java         |  4 +-
 .../hypervisor/kvm/storage/ScaleIOStoragePool.java | 29 +++++++-
 .../hypervisor/kvm/storage/StorageAdaptor.java     |  2 +-
 .../kvm/resource/LibvirtComputingResourceTest.java |  9 ++-
 .../kvm/storage/ScaleIOStoragePoolTest.java        | 75 ++++++++++++++++-----
 .../datastore/client/ScaleIOGatewayClient.java     |  8 ++-
 .../datastore/client/ScaleIOGatewayClientImpl.java | 39 +++++++++--
 .../driver/ScaleIOPrimaryDataStoreDriver.java      | 77 ++++++++++++++--------
 .../ScaleIOPrimaryDataStoreLifeCycle.java          | 51 ++++++--------
 .../datastore/provider/ScaleIOHostListener.java    | 68 ++++++++++++++++---
 .../storage/datastore/util/ScaleIOUtil.java        | 74 +++++++++++++++++++--
 .../ScaleIOPrimaryDataStoreLifeCycleTest.java      |  7 +-
 .../kvm/storage/StorPoolStorageAdaptor.java        |  2 +-
 .../kvm/storage/StorPoolStoragePool.java           |  5 ++
 .../java/com/cloud/storage/StorageManagerImpl.java |  4 +-
 .../storage/listener/StoragePoolMonitorTest.java   |  2 +-
 29 files changed, 403 insertions(+), 130 deletions(-)

diff --git 
a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java 
b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java
index be84cce152..552ffb85aa 100644
--- a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java
+++ b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java
@@ -30,14 +30,18 @@ public class ModifyStoragePoolAnswer extends Answer {
     private Map<String, TemplateProp> templateInfo;
     private String localDatastoreName;
     private String poolType;
-    private List<ModifyStoragePoolAnswer> datastoreClusterChildren = new 
ArrayList<>();;
+    private List<ModifyStoragePoolAnswer> datastoreClusterChildren = new 
ArrayList<>();
 
     public ModifyStoragePoolAnswer(ModifyStoragePoolCommand cmd, long 
capacityBytes, long availableBytes, Map<String, TemplateProp> tInfo) {
+        this(cmd, capacityBytes, availableBytes, tInfo, null);
+    }
+
+    public ModifyStoragePoolAnswer(ModifyStoragePoolCommand cmd, long 
capacityBytes, long availableBytes, Map<String, TemplateProp> tInfo, 
Map<String, String> details) {
         super(cmd);
 
         result = true;
 
-        poolInfo = new StoragePoolInfo(null, cmd.getPool().getHost(), 
cmd.getPool().getPath(), cmd.getLocalPath(), cmd.getPool().getType(), 
capacityBytes, availableBytes);
+        poolInfo = new StoragePoolInfo(null, cmd.getPool().getHost(), 
cmd.getPool().getPath(), cmd.getLocalPath(), cmd.getPool().getType(), 
capacityBytes, availableBytes, details);
 
         templateInfo = tInfo;
     }
diff --git 
a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolCommand.java 
b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolCommand.java
index c2ab0ab7f3..ad05fe1d61 100644
--- a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolCommand.java
@@ -20,6 +20,7 @@
 package com.cloud.agent.api;
 
 import java.io.File;
+import java.util.Map;
 import java.util.UUID;
 
 import com.cloud.agent.api.to.StorageFilerTO;
@@ -32,6 +33,7 @@ public class ModifyStoragePoolCommand extends Command {
     private StorageFilerTO pool;
     private String localPath;
     private String storagePath;
+    private Map<String, String> details;
 
     public ModifyStoragePoolCommand(boolean add, StoragePool pool, String 
localPath) {
         this.add = add;
@@ -39,6 +41,11 @@ public class ModifyStoragePoolCommand extends Command {
         this.localPath = localPath;
     }
 
+    public ModifyStoragePoolCommand(boolean add, StoragePool pool, String 
localPath, Map<String, String> details) {
+        this(add, pool, localPath);
+        this.details = details;
+    }
+
     public ModifyStoragePoolCommand(boolean add, StoragePool pool) {
         this(add, pool, LOCAL_PATH_PREFIX + File.separator + 
UUID.nameUUIDFromBytes((pool.getHostAddress() + pool.getPath()).getBytes()));
     }
@@ -67,6 +74,14 @@ public class ModifyStoragePoolCommand extends Command {
         return storagePath;
     }
 
+    public void setDetails(Map<String, String> details) {
+        this.details = details;
+    }
+
+    public Map<String, String> getDetails() {
+        return details;
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
diff --git 
a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java 
b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
index 83058c3e69..1b69d72300 100644
--- a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
+++ b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java
@@ -276,7 +276,7 @@ public interface StorageManager extends StorageService {
 
     boolean registerHostListener(String providerUuid, HypervisorHostListener 
listener);
 
-    void connectHostToSharedPool(long hostId, long poolId) throws 
StorageUnavailableException, StorageConflictException;
+    boolean connectHostToSharedPool(long hostId, long poolId) throws 
StorageUnavailableException, StorageConflictException;
 
     void disconnectHostFromSharedPool(long hostId, long poolId) throws 
StorageUnavailableException, StorageConflictException;
 
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyStoragePoolCommandWrapper.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyStoragePoolCommandWrapper.java
index 0d6cdaccb9..7074133892 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyStoragePoolCommandWrapper.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyStoragePoolCommandWrapper.java
@@ -40,13 +40,13 @@ public final class LibvirtModifyStoragePoolCommandWrapper 
extends CommandWrapper
         final KVMStoragePoolManager storagePoolMgr = 
libvirtComputingResource.getStoragePoolMgr();
         final KVMStoragePool storagepool =
                 storagePoolMgr.createStoragePool(command.getPool().getUuid(), 
command.getPool().getHost(), command.getPool().getPort(), 
command.getPool().getPath(), command.getPool()
-                        .getUserInfo(), command.getPool().getType());
+                        .getUserInfo(), command.getPool().getType(), 
command.getDetails());
         if (storagepool == null) {
             return new Answer(command, false, " Failed to create storage 
pool");
         }
 
         final Map<String, TemplateProp> tInfo = new HashMap<String, 
TemplateProp>();
-        final ModifyStoragePoolAnswer answer = new 
ModifyStoragePoolAnswer(command, storagepool.getCapacity(), 
storagepool.getAvailable(), tInfo);
+        final ModifyStoragePoolAnswer answer = new 
ModifyStoragePoolAnswer(command, storagepool.getCapacity(), 
storagepool.getAvailable(), tInfo, storagepool.getDetails());
 
         return answer;
     }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
index 641cd3a31d..daab2a4ce1 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java
@@ -44,7 +44,7 @@ public class IscsiAdmStorageAdaptor implements StorageAdaptor 
{
     private static final Map<String, KVMStoragePool> 
MapStorageUuidToStoragePool = new HashMap<>();
 
     @Override
-    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, StoragePoolType storagePoolType) {
+    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, StoragePoolType storagePoolType, 
Map<String, String> details) {
         IscsiAdmStoragePool storagePool = new IscsiAdmStoragePool(uuid, host, 
port, storagePoolType, this);
 
         MapStorageUuidToStoragePool.put(uuid, storagePool);
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java
index bee71a644f..bd2b603fa2 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/IscsiAdmStoragePool.java
@@ -173,6 +173,11 @@ public class IscsiAdmStoragePool implements KVMStoragePool 
{
         return false;
     }
 
+    @Override
+    public Map<String, String> getDetails() {
+        return null;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, 
ToStringStyle.JSON_STYLE).append("uuid", getUuid()).append("path", 
getLocalPath()).toString();
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
index 46d78e5f6b..feefb50b83 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
@@ -72,4 +72,6 @@ public interface KVMStoragePool {
     public boolean createFolder(String path);
 
     public boolean supportsConfigDriveIso();
+
+    public Map<String, String> getDetails();
 }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
index 279c25b447..860390835d 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java
@@ -56,8 +56,9 @@ public class KVMStoragePoolManager {
         String userInfo;
         boolean type;
         StoragePoolType poolType;
+        Map<String, String> details;
 
-        public StoragePoolInformation(String name, String host, int port, 
String path, String userInfo, StoragePoolType poolType, boolean type) {
+        public StoragePoolInformation(String name, String host, int port, 
String path, String userInfo, StoragePoolType poolType, Map<String, String> 
details, boolean type) {
             this.name = name;
             this.host = host;
             this.port = port;
@@ -65,6 +66,7 @@ public class KVMStoragePoolManager {
             this.userInfo = userInfo;
             this.type = type;
             this.poolType = poolType;
+            this.details = details;
         }
     }
 
@@ -270,7 +272,7 @@ public class KVMStoragePoolManager {
         } catch (Exception e) {
             StoragePoolInformation info = _storagePools.get(uuid);
             if (info != null) {
-                pool = createStoragePool(info.name, info.host, info.port, 
info.path, info.userInfo, info.poolType, info.type);
+                pool = createStoragePool(info.name, info.host, info.port, 
info.path, info.userInfo, info.poolType, info.details, info.type);
             } else {
                 throw new CloudRuntimeException("Could not fetch storage pool 
" + uuid + " from libvirt due to " + e.getMessage());
             }
@@ -300,7 +302,7 @@ public class KVMStoragePoolManager {
         }
 
         // secondary storage registers itself through here
-        return createStoragePool(uuid, sourceHost, 0, sourcePath, "", 
protocol, false);
+        return createStoragePool(uuid, sourceHost, 0, sourcePath, "", 
protocol, null, false);
     }
 
     public KVMPhysicalDisk getPhysicalDisk(StoragePoolType type, String 
poolUuid, String volName) {
@@ -341,20 +343,27 @@ public class KVMStoragePoolManager {
 
     public KVMStoragePool createStoragePool(String name, String host, int 
port, String path, String userInfo, StoragePoolType type) {
         // primary storage registers itself through here
-        return createStoragePool(name, host, port, path, userInfo, type, true);
+        return createStoragePool(name, host, port, path, userInfo, type, null, 
true);
+    }
+
+    /**
+     * Primary Storage registers itself through here
+     */
+    public KVMStoragePool createStoragePool(String name, String host, int 
port, String path, String userInfo, StoragePoolType type, Map<String, String> 
details) {
+        return createStoragePool(name, host, port, path, userInfo, type, 
details, true);
     }
 
     //Note: due to bug CLOUDSTACK-4459, createStoragepool can be called in 
parallel, so need to be synced.
-    private synchronized KVMStoragePool createStoragePool(String name, String 
host, int port, String path, String userInfo, StoragePoolType type, boolean 
primaryStorage) {
+    private synchronized KVMStoragePool createStoragePool(String name, String 
host, int port, String path, String userInfo, StoragePoolType type, Map<String, 
String> details, boolean primaryStorage) {
         StorageAdaptor adaptor = getStorageAdaptor(type);
-        KVMStoragePool pool = adaptor.createStoragePool(name, host, port, 
path, userInfo, type);
+        KVMStoragePool pool = adaptor.createStoragePool(name, host, port, 
path, userInfo, type, details);
 
         // LibvirtStorageAdaptor-specific statement
         if (type == StoragePoolType.NetworkFilesystem && primaryStorage) {
             KVMHABase.NfsStoragePool nfspool = new 
KVMHABase.NfsStoragePool(pool.getUuid(), host, path, pool.getLocalPath(), 
PoolType.PrimaryStorage);
             _haMonitor.addStoragePool(nfspool);
         }
-        StoragePoolInformation info = new StoragePoolInformation(name, host, 
port, path, userInfo, type, primaryStorage);
+        StoragePoolInformation info = new StoragePoolInformation(name, host, 
port, path, userInfo, type, details, primaryStorage);
         addStoragePool(pool.getUuid(), info);
         return pool;
     }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
index d29f075681..317bb8eb26 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
@@ -576,7 +576,7 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
     }
 
     @Override
-    public KVMStoragePool createStoragePool(String name, String host, int 
port, String path, String userInfo, StoragePoolType type) {
+    public KVMStoragePool createStoragePool(String name, String host, int 
port, String path, String userInfo, StoragePoolType type, Map<String, String> 
details) {
         s_logger.info("Attempting to create storage pool " + name + " (" + 
type.toString() + ") in libvirt");
 
         StoragePool sp = null;
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
index f5e9685bf0..9d5bbed292 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java
@@ -282,6 +282,11 @@ public class LibvirtStoragePool implements KVMStoragePool {
         return false;
     }
 
+    @Override
+    public Map<String, String> getDetails() {
+        return null;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, 
ToStringStyle.JSON_STYLE).append("uuid", getUuid()).append("path", 
getLocalPath()).toString();
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
index 1e6ddb1373..ea2b185e61 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
@@ -174,7 +174,7 @@ public class LinstorStorageAdaptor implements 
StorageAdaptor {
 
     @Override
     public KVMStoragePool createStoragePool(String name, String host, int 
port, String path, String userInfo,
-                                            Storage.StoragePoolType type)
+                                            Storage.StoragePoolType type, 
Map<String, String> details)
     {
         s_logger.debug(String.format(
             "Linstor createStoragePool: name: '%s', host: '%s', path: %s, 
userinfo: %s", name, host, path, userInfo));
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStoragePool.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStoragePool.java
index 0e8a4ed5be..e8aea2ac1f 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStoragePool.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStoragePool.java
@@ -185,6 +185,11 @@ public class LinstorStoragePool implements KVMStoragePool {
         return false;
     }
 
+    @Override
+    public Map<String, String> getDetails() {
+        return null;
+    }
+
     public String getResourceGroup() {
         return _resourceGroup;
     }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java
index 0a219d4a47..e9cb042dea 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java
@@ -55,7 +55,7 @@ public class ManagedNfsStorageAdaptor implements 
StorageAdaptor {
     }
 
     @Override
-    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, StoragePoolType storagePoolType) {
+    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, StoragePoolType storagePoolType, 
Map<String, String> details) {
 
         LibvirtStoragePool storagePool = new LibvirtStoragePool(uuid, path, 
StoragePoolType.ManagedNFS, this, null);
         storagePool.setSourceHost(host);
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
index fcaa5272eb..4a55288be8 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
@@ -117,8 +117,8 @@ public class ScaleIOStorageAdaptor implements 
StorageAdaptor {
     }
 
     @Override
-    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, Storage.StoragePoolType type) {
-        ScaleIOStoragePool storagePool = new ScaleIOStoragePool(uuid, host, 
port, path, type, this);
+    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, Storage.StoragePoolType type, Map<String, 
String> details) {
+        ScaleIOStoragePool storagePool = new ScaleIOStoragePool(uuid, host, 
port, path, type, details, this);
         MapStorageUuidToStoragePool.put(uuid, storagePool);
         return storagePool;
     }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
index 4ead92d6a0..9ddcd6537d 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
@@ -20,6 +20,8 @@ package com.cloud.hypervisor.kvm.storage;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
+import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
 import org.apache.cloudstack.utils.qemu.QemuImg;
 
 import com.cloud.storage.Storage;
@@ -34,8 +36,9 @@ public class ScaleIOStoragePool implements KVMStoragePool {
     private long capacity;
     private long used;
     private long available;
+    private Map<String, String> details;
 
-    public ScaleIOStoragePool(String uuid, String host, int port, String path, 
Storage.StoragePoolType poolType, StorageAdaptor adaptor) {
+    public ScaleIOStoragePool(String uuid, String host, int port, String path, 
Storage.StoragePoolType poolType, Map<String, String> poolDetails, 
StorageAdaptor adaptor) {
         this.uuid = uuid;
         sourceHost = host;
         sourcePort = port;
@@ -45,6 +48,25 @@ public class ScaleIOStoragePool implements KVMStoragePool {
         capacity = 0;
         used = 0;
         available = 0;
+        details = poolDetails;
+        addSDCDetails();
+    }
+
+    private void addSDCDetails() {
+        if (details == null || 
!details.containsKey(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID))  {
+            return;
+        }
+
+        String storageSystemId = 
details.get(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID);
+        String sdcId = ScaleIOUtil.getSdcId(storageSystemId);
+        if (sdcId != null) {
+            details.put(ScaleIOGatewayClient.SDC_ID, sdcId);
+        } else {
+            String sdcGuId = ScaleIOUtil.getSdcGuid();
+            if (sdcGuId != null) {
+                details.put(ScaleIOGatewayClient.SDC_GUID, sdcGuId);
+            }
+        }
     }
 
     @Override
@@ -178,4 +200,9 @@ public class ScaleIOStoragePool implements KVMStoragePool {
     public boolean supportsConfigDriveIso() {
         return false;
     }
+
+    @Override
+    public Map<String, String> getDetails() {
+        return this.details;
+    }
 }
diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
index bc048d6cf2..19687d7721 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
@@ -35,7 +35,7 @@ public interface StorageAdaptor {
     // it with info from local disk, and return it
     public KVMPhysicalDisk getPhysicalDisk(String volumeUuid, KVMStoragePool 
pool);
 
-    public KVMStoragePool createStoragePool(String name, String host, int 
port, String path, String userInfo, StoragePoolType type);
+    public KVMStoragePool createStoragePool(String name, String host, int 
port, String path, String userInfo, StoragePoolType type, Map<String, String> 
details);
 
     public boolean deleteStoragePool(String uuid);
 
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
index ffe54f73da..1054c76f88 100644
--- 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
@@ -2765,10 +2765,9 @@ public class LibvirtComputingResourceTest {
         final KVMStoragePoolManager storagePoolMgr = 
Mockito.mock(KVMStoragePoolManager.class);
         final KVMStoragePool kvmStoragePool = 
Mockito.mock(KVMStoragePool.class);
 
-
         
when(libvirtComputingResource.getStoragePoolMgr()).thenReturn(storagePoolMgr);
         when(storagePoolMgr.createStoragePool(command.getPool().getUuid(), 
command.getPool().getHost(), command.getPool().getPort(), 
command.getPool().getPath(), command.getPool()
-                .getUserInfo(), 
command.getPool().getType())).thenReturn(kvmStoragePool);
+                .getUserInfo(), command.getPool().getType(), 
command.getDetails())).thenReturn(kvmStoragePool);
 
 
         final LibvirtRequestWrapper wrapper = 
LibvirtRequestWrapper.getInstance();
@@ -2779,7 +2778,7 @@ public class LibvirtComputingResourceTest {
 
         verify(libvirtComputingResource, times(1)).getStoragePoolMgr();
         verify(storagePoolMgr, 
times(1)).createStoragePool(command.getPool().getUuid(), 
command.getPool().getHost(), command.getPool().getPort(), 
command.getPool().getPath(), command.getPool()
-                .getUserInfo(), command.getPool().getType());
+                .getUserInfo(), command.getPool().getType(), 
command.getDetails());
     }
 
     @Test
@@ -2791,7 +2790,7 @@ public class LibvirtComputingResourceTest {
 
         
when(libvirtComputingResource.getStoragePoolMgr()).thenReturn(storagePoolMgr);
         when(storagePoolMgr.createStoragePool(command.getPool().getUuid(), 
command.getPool().getHost(), command.getPool().getPort(), 
command.getPool().getPath(), command.getPool()
-                .getUserInfo(), command.getPool().getType())).thenReturn(null);
+                .getUserInfo(), command.getPool().getType(), 
command.getDetails())).thenReturn(null);
 
 
         final LibvirtRequestWrapper wrapper = 
LibvirtRequestWrapper.getInstance();
@@ -2802,7 +2801,7 @@ public class LibvirtComputingResourceTest {
 
         verify(libvirtComputingResource, times(1)).getStoragePoolMgr();
         verify(storagePoolMgr, 
times(1)).createStoragePool(command.getPool().getUuid(), 
command.getPool().getHost(), command.getPool().getPort(), 
command.getPool().getPath(), command.getPool()
-                .getUserInfo(), command.getPool().getType());
+                .getUserInfo(), command.getPool().getType(), 
command.getDetails());
     }
 
     @Test
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePoolTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePoolTest.java
index 4f18c38a16..6c2f560ecf 100644
--- 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePoolTest.java
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePoolTest.java
@@ -26,7 +26,10 @@ import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.io.FileFilter;
+import java.util.HashMap;
+import java.util.Map;
 
+import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
 import org.apache.cloudstack.storage.datastore.util.ScaleIOUtil;
 import org.apache.cloudstack.utils.qemu.QemuImg;
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
@@ -42,8 +45,9 @@ import org.powermock.modules.junit4.PowerMockRunner;
 
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.StorageLayer;
+import com.cloud.utils.script.Script;
 
-@PrepareForTest(ScaleIOUtil.class)
+@PrepareForTest({ScaleIOUtil.class, Script.class})
 @RunWith(PowerMockRunner.class)
 public class ScaleIOStoragePoolTest {
 
@@ -57,10 +61,13 @@ public class ScaleIOStoragePoolTest {
     @Before
     public void setUp() throws Exception {
         final String uuid = "345fc603-2d7e-47d2-b719-a0110b3732e6";
+        final String systemId = "218ce1797566a00f";
         final StoragePoolType type = StoragePoolType.PowerFlex;
+        Map<String,String> details = new HashMap<String, String>();
+        details.put(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID, systemId);
 
         adapter = spy(new ScaleIOStorageAdaptor(storageLayer));
-        pool = new ScaleIOStoragePool(uuid, "192.168.1.19", 443, 
"a519be2f00000000", type, adapter);
+        pool = new ScaleIOStoragePool(uuid, "192.168.1.19", 443, 
"a519be2f00000000", type, details, adapter);
     }
 
     @After
@@ -69,28 +76,64 @@ public class ScaleIOStoragePoolTest {
 
     @Test
     public void testAttributes() {
-        assertEquals(pool.getCapacity(), 0);
-        assertEquals(pool.getUsed(), 0);
-        assertEquals(pool.getAvailable(), 0);
-        assertEquals(pool.getUuid(), "345fc603-2d7e-47d2-b719-a0110b3732e6");
-        assertEquals(pool.getSourceHost(), "192.168.1.19");
-        assertEquals(pool.getSourcePort(), 443);
-        assertEquals(pool.getSourceDir(), "a519be2f00000000");
-        assertEquals(pool.getType(), StoragePoolType.PowerFlex);
+        assertEquals(0, pool.getCapacity());
+        assertEquals(0, pool.getUsed());
+        assertEquals(0, pool.getAvailable());
+        assertEquals("345fc603-2d7e-47d2-b719-a0110b3732e6", pool.getUuid());
+        assertEquals("192.168.1.19", pool.getSourceHost());
+        assertEquals(443, pool.getSourcePort());
+        assertEquals("a519be2f00000000", pool.getSourceDir());
+        assertEquals(StoragePoolType.PowerFlex, pool.getType());
+        assertEquals("218ce1797566a00f", 
pool.getDetails().get(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID));
 
         pool.setCapacity(131072);
         pool.setUsed(24576);
         pool.setAvailable(106496);
 
-        assertEquals(pool.getCapacity(), 131072);
-        assertEquals(pool.getUsed(), 24576);
-        assertEquals(pool.getAvailable(), 106496);
+        assertEquals(131072, pool.getCapacity());
+        assertEquals(24576, pool.getUsed());
+        assertEquals(106496, pool.getAvailable());
+    }
+
+    @Test
+    public void testSdcIdAttribute() {
+        final String uuid = "345fc603-2d7e-47d2-b719-a0110b3732e6";
+        final String systemId = "218ce1797566a00f";
+        final String sdcId = "301b852c00000003";
+        final StoragePoolType type = StoragePoolType.PowerFlex;
+        Map<String,String> details = new HashMap<String, String>();
+        details.put(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID, systemId);
+
+        PowerMockito.mockStatic(Script.class);
+        when(Script.runSimpleBashScript("/opt/emc/scaleio/sdc/bin/drv_cfg 
--query_mdms|grep 218ce1797566a00f|awk '{print $5}'")).thenReturn(sdcId);
+
+        ScaleIOStoragePool pool1 = new ScaleIOStoragePool(uuid, 
"192.168.1.19", 443, "a519be2f00000000", type, details, adapter);
+        assertEquals(systemId, 
pool1.getDetails().get(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID));
+        assertEquals(sdcId, 
pool1.getDetails().get(ScaleIOGatewayClient.SDC_ID));
+    }
+
+    @Test
+    public void testSdcGuidAttribute() {
+        final String uuid = "345fc603-2d7e-47d2-b719-a0110b3732e6";
+        final String systemId = "218ce1797566a00f";
+        final String sdcGuid = "B0E3BFB8-C20B-43BF-93C8-13339E85AA50";
+        final StoragePoolType type = StoragePoolType.PowerFlex;
+        Map<String,String> details = new HashMap<String, String>();
+        details.put(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID, systemId);
+
+        PowerMockito.mockStatic(Script.class);
+        when(Script.runSimpleBashScript("/opt/emc/scaleio/sdc/bin/drv_cfg 
--query_mdms|grep 218ce1797566a00f|awk '{print $5}'")).thenReturn(null);
+        when(Script.runSimpleBashScript("/opt/emc/scaleio/sdc/bin/drv_cfg 
--query_guid")).thenReturn(sdcGuid);
+
+        ScaleIOStoragePool pool1 = new ScaleIOStoragePool(uuid, 
"192.168.1.19", 443, "a519be2f00000000", type, details, adapter);
+        assertEquals(systemId, 
pool1.getDetails().get(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID));
+        assertEquals(sdcGuid, 
pool1.getDetails().get(ScaleIOGatewayClient.SDC_GUID));
     }
 
     @Test
     public void testDefaults() {
-        assertEquals(pool.getDefaultFormat(), PhysicalDiskFormat.RAW);
-        assertEquals(pool.getType(), StoragePoolType.PowerFlex);
+        assertEquals(PhysicalDiskFormat.RAW, pool.getDefaultFormat());
+        assertEquals(StoragePoolType.PowerFlex, pool.getType());
 
         assertNull(pool.getAuthUserName());
         assertNull(pool.getAuthSecret());
@@ -145,7 +188,7 @@ public class ScaleIOStoragePoolTest {
         disk.setSize(8192);
         disk.setVirtualSize(8192);
 
-        assertEquals(disk.getPath(), 
"/dev/disk/by-id/emc-vol-218ce1797566a00f-6c3362b500000001");
+        
assertEquals("/dev/disk/by-id/emc-vol-218ce1797566a00f-6c3362b500000001", 
disk.getPath());
 
         when(adapter.getPhysicalDisk(volumeId, pool)).thenReturn(disk);
 
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClient.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClient.java
index f497b10127..73b69bdef4 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClient.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClient.java
@@ -38,6 +38,8 @@ public interface ScaleIOGatewayClient {
     String GATEWAY_API_PASSWORD = "powerflex.gw.password";
     String STORAGE_POOL_NAME = "powerflex.storagepool.name";
     String STORAGE_POOL_SYSTEM_ID = "powerflex.storagepool.system.id";
+    String SDC_ID = "powerflex.sdc.id";
+    String SDC_GUID = "powerflex.sdc.guid";
 
     static ScaleIOGatewayClient getClient(final String url, final String 
username, final String password,
                                           final boolean validateCertificate, 
final int timeout, final int maxConnections) throws NoSuchAlgorithmException, 
KeyManagementException, URISyntaxException {
@@ -81,8 +83,10 @@ public interface ScaleIOGatewayClient {
     // SDC APIs
     List<Sdc> listSdcs();
     Sdc getSdc(String sdcId);
+    String getSdcIdByGuid(String sdcGuid);
     Sdc getSdcByIp(String ipAddress);
     Sdc getConnectedSdcByIp(String ipAddress);
-    List<String> listConnectedSdcIps();
-    boolean isSdcConnected(String ipAddress);
+    boolean haveConnectedSdcs();
+    boolean isSdcConnected(String sdcId);
+    boolean isSdcConnectedByIP(String ipAddress);
 }
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImpl.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImpl.java
index 9a8225bde4..6a839b0cc7 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImpl.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/client/ScaleIOGatewayClientImpl.java
@@ -1013,6 +1013,24 @@ public class ScaleIOGatewayClientImpl implements 
ScaleIOGatewayClient {
         return get("/instances/Sdc::" + sdcId, Sdc.class);
     }
 
+    @Override
+    public String getSdcIdByGuid(String sdcGuid) {
+        Preconditions.checkArgument(StringUtils.isNotEmpty(sdcGuid), "SDC Guid 
cannot be null");
+
+        List<Sdc> sdcs = listSdcs();
+        if (sdcs == null) {
+            return null;
+        }
+
+        for (Sdc sdc : sdcs) {
+            if (sdcGuid.equalsIgnoreCase(sdc.getSdcGuid())) {
+                return sdc.getId();
+            }
+        }
+
+        return null;
+    }
+
     @Override
     public Sdc getSdcByIp(String ipAddress) {
         Preconditions.checkArgument(StringUtils.isNotEmpty(ipAddress), "IP 
address cannot be null");
@@ -1035,28 +1053,35 @@ public class ScaleIOGatewayClientImpl implements 
ScaleIOGatewayClient {
     }
 
     @Override
-    public List<String> listConnectedSdcIps() {
-        List<String> sdcIps = new ArrayList<>();
+    public boolean haveConnectedSdcs() {
         List<Sdc> sdcs = listSdcs();
         if(sdcs != null) {
             for (Sdc sdc : sdcs) {
                 if 
(MDM_CONNECTED_STATE.equalsIgnoreCase(sdc.getMdmConnectionState())) {
-                    sdcIps.add(sdc.getSdcIp());
+                    return true;
                 }
             }
         }
 
-        return sdcIps;
+        return false;
+    }
+
+    @Override
+    public boolean isSdcConnected(String sdcId) {
+        Preconditions.checkArgument(StringUtils.isNotEmpty(sdcId), "SDC Id 
cannot be null");
+
+        Sdc sdc = getSdc(sdcId);
+        return (sdc != null && 
MDM_CONNECTED_STATE.equalsIgnoreCase(sdc.getMdmConnectionState()));
     }
 
     @Override
-    public boolean isSdcConnected(String ipAddress) {
+    public boolean isSdcConnectedByIP(String ipAddress) {
         Preconditions.checkArgument(StringUtils.isNotEmpty(ipAddress), "IP 
address cannot be null");
 
         List<Sdc> sdcs = listSdcs();
-        if(sdcs != null) {
+        if (sdcs != null) {
             for (Sdc sdc : sdcs) {
-                if (ipAddress.equalsIgnoreCase(sdc.getSdcIp()) && 
MDM_CONNECTED_STATE.equalsIgnoreCase(sdc.getMdmConnectionState())) {
+                if (sdc != null && ipAddress.equalsIgnoreCase(sdc.getSdcIp()) 
&& MDM_CONNECTED_STATE.equalsIgnoreCase(sdc.getMdmConnectionState())) {
                     return true;
                 }
             }
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
index 3bb6e0d7e6..5323352c4a 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
@@ -41,7 +41,6 @@ import org.apache.cloudstack.storage.RemoteHostEndPoint;
 import org.apache.cloudstack.storage.command.CommandResult;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.CreateObjectAnswer;
-import org.apache.cloudstack.storage.datastore.api.Sdc;
 import org.apache.cloudstack.storage.datastore.api.StoragePoolStatistics;
 import org.apache.cloudstack.storage.datastore.api.VolumeStatistics;
 import org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
@@ -72,11 +71,13 @@ import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.Storage;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolHostVO;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.StoragePoolHostDao;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
@@ -96,6 +97,8 @@ public class ScaleIOPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
     @Inject
     private StoragePoolDetailsDao storagePoolDetailsDao;
     @Inject
+    private StoragePoolHostDao storagePoolHostDao;
+    @Inject
     private VolumeDao volumeDao;
     @Inject
     private VolumeDetailsDao volumeDetailsDao;
@@ -144,38 +147,38 @@ public class ScaleIOPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
                     iopsLimit = ScaleIOUtil.MINIMUM_ALLOWED_IOPS_LIMIT;
                 }
 
-                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
-                final Sdc sdc = 
client.getConnectedSdcByIp(host.getPrivateIpAddress());
-                if (sdc == null) {
+                final String sdcId = getConnectedSdc(dataStore.getId(), 
host.getId());
+                if (StringUtils.isBlank(sdcId)) {
                     alertHostSdcDisconnection(host);
                     throw new CloudRuntimeException("Unable to grant access to 
volume: " + dataObject.getId() + ", no Sdc connected with host ip: " + 
host.getPrivateIpAddress());
                 }
 
-                return 
client.mapVolumeToSdcWithLimits(ScaleIOUtil.getVolumePath(volume.getPath()), 
sdc.getId(), iopsLimit, bandwidthLimitInKbps);
+                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
+                return 
client.mapVolumeToSdcWithLimits(ScaleIOUtil.getVolumePath(volume.getPath()), 
sdcId, iopsLimit, bandwidthLimitInKbps);
             } else if (DataObjectType.TEMPLATE.equals(dataObject.getType())) {
                 final VMTemplateStoragePoolVO templatePoolRef = 
vmTemplatePoolDao.findByPoolTemplate(dataStore.getId(), dataObject.getId(), 
null);
                 LOGGER.debug("Granting access for PowerFlex template volume: " 
+ templatePoolRef.getInstallPath());
 
-                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
-                final Sdc sdc = 
client.getConnectedSdcByIp(host.getPrivateIpAddress());
-                if (sdc == null) {
+                final String sdcId = getConnectedSdc(dataStore.getId(), 
host.getId());
+                if (StringUtils.isBlank(sdcId)) {
                     alertHostSdcDisconnection(host);
                     throw new CloudRuntimeException("Unable to grant access to 
template: " + dataObject.getId() + ", no Sdc connected with host ip: " + 
host.getPrivateIpAddress());
                 }
 
-                return 
client.mapVolumeToSdc(ScaleIOUtil.getVolumePath(templatePoolRef.getInstallPath()),
 sdc.getId());
+                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
+                return 
client.mapVolumeToSdc(ScaleIOUtil.getVolumePath(templatePoolRef.getInstallPath()),
 sdcId);
             } else if (DataObjectType.SNAPSHOT.equals(dataObject.getType())) {
                 SnapshotInfo snapshot = (SnapshotInfo) dataObject;
                 LOGGER.debug("Granting access for PowerFlex volume snapshot: " 
+ snapshot.getPath());
 
-                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
-                final Sdc sdc = 
client.getConnectedSdcByIp(host.getPrivateIpAddress());
-                if (sdc == null) {
+                final String sdcId = getConnectedSdc(dataStore.getId(), 
host.getId());
+                if (StringUtils.isBlank(sdcId)) {
                     alertHostSdcDisconnection(host);
                     throw new CloudRuntimeException("Unable to grant access to 
snapshot: " + dataObject.getId() + ", no Sdc connected with host ip: " + 
host.getPrivateIpAddress());
                 }
 
-                return 
client.mapVolumeToSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), 
sdc.getId());
+                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
+                return 
client.mapVolumeToSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), sdcId);
             }
 
             return false;
@@ -191,41 +194,59 @@ public class ScaleIOPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
                 final VolumeVO volume = volumeDao.findById(dataObject.getId());
                 LOGGER.debug("Revoking access for PowerFlex volume: " + 
volume.getPath());
 
-                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
-                final Sdc sdc = 
client.getConnectedSdcByIp(host.getPrivateIpAddress());
-                if (sdc == null) {
+                final String sdcId = getConnectedSdc(dataStore.getId(), 
host.getId());
+                if (StringUtils.isBlank(sdcId)) {
                     throw new CloudRuntimeException("Unable to revoke access 
for volume: " + dataObject.getId() + ", no Sdc connected with host ip: " + 
host.getPrivateIpAddress());
                 }
 
-                
client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(volume.getPath()), 
sdc.getId());
+                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
+                
client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(volume.getPath()), sdcId);
             } else if (DataObjectType.TEMPLATE.equals(dataObject.getType())) {
                 final VMTemplateStoragePoolVO templatePoolRef = 
vmTemplatePoolDao.findByPoolTemplate(dataStore.getId(), dataObject.getId(), 
null);
                 LOGGER.debug("Revoking access for PowerFlex template volume: " 
+ templatePoolRef.getInstallPath());
 
-                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
-                final Sdc sdc = 
client.getConnectedSdcByIp(host.getPrivateIpAddress());
-                if (sdc == null) {
+                final String sdcId = getConnectedSdc(dataStore.getId(), 
host.getId());
+                if (StringUtils.isBlank(sdcId)) {
                     throw new CloudRuntimeException("Unable to revoke access 
for template: " + dataObject.getId() + ", no Sdc connected with host ip: " + 
host.getPrivateIpAddress());
                 }
 
-                
client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(templatePoolRef.getInstallPath()),
 sdc.getId());
+                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
+                
client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(templatePoolRef.getInstallPath()),
 sdcId);
             } else if (DataObjectType.SNAPSHOT.equals(dataObject.getType())) {
                 SnapshotInfo snapshot = (SnapshotInfo) dataObject;
                 LOGGER.debug("Revoking access for PowerFlex volume snapshot: " 
+ snapshot.getPath());
 
-                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
-                final Sdc sdc = 
client.getConnectedSdcByIp(host.getPrivateIpAddress());
-                if (sdc == null) {
+                final String sdcId = getConnectedSdc(dataStore.getId(), 
host.getId());
+                if (StringUtils.isBlank(sdcId)) {
                     throw new CloudRuntimeException("Unable to revoke access 
for snapshot: " + dataObject.getId() + ", no Sdc connected with host ip: " + 
host.getPrivateIpAddress());
                 }
 
-                
client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), 
sdc.getId());
+                final ScaleIOGatewayClient client = 
getScaleIOClient(dataStore.getId());
+                
client.unmapVolumeFromSdc(ScaleIOUtil.getVolumePath(snapshot.getPath()), sdcId);
             }
         } catch (Exception e) {
             LOGGER.warn("Failed to revoke access due to: " + e.getMessage(), 
e);
         }
     }
 
+    private String getConnectedSdc(long poolId, long hostId) {
+        try {
+            StoragePoolHostVO poolHostVO = 
storagePoolHostDao.findByPoolHost(poolId, hostId);
+            if (poolHostVO == null) {
+                return null;
+            }
+
+            final ScaleIOGatewayClient client = getScaleIOClient(poolId);
+            if (client.isSdcConnected(poolHostVO.getLocalPath())) {
+                return poolHostVO.getLocalPath();
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Couldn't check SDC connection for the host: " + 
hostId + " and storage pool: " + poolId + " due to " + e.getMessage(), e);
+        }
+
+        return null;
+    }
+
     @Override
     public long getUsedBytes(StoragePool storagePool) {
         long usedSpaceBytes = 0;
@@ -930,8 +951,12 @@ public class ScaleIOPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
         }
 
         try {
+            StoragePoolHostVO poolHostVO = 
storagePoolHostDao.findByPoolHost(pool.getId(), host.getId());
+            if (poolHostVO == null) {
+                return false;
+            }
             final ScaleIOGatewayClient client = getScaleIOClient(pool.getId());
-            return client.isSdcConnected(host.getPrivateIpAddress());
+            return client.isSdcConnected(poolHostVO.getLocalPath());
         } catch (Exception e) {
             LOGGER.warn("Unable to check the host: " + host.getId() + " access 
to storage pool: " + pool.getId() + " due to " + e.getMessage(), e);
             return false;
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
index edebdac792..65831e4ec3 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
@@ -258,22 +258,9 @@ public class ScaleIOPrimaryDataStoreLifeCycle implements 
PrimaryDataStoreLifeCyc
             throw new CloudRuntimeException("Unsupported hypervisor type: " + 
cluster.getHypervisorType().toString());
         }
 
-        List<String> connectedSdcIps = null;
-        try {
-            ScaleIOGatewayClient client = 
ScaleIOGatewayClientConnectionPool.getInstance().getClient(dataStore.getId(), 
storagePoolDetailsDao);
-            connectedSdcIps = client.listConnectedSdcIps();
-        } catch (NoSuchAlgorithmException | KeyManagementException | 
URISyntaxException e) {
-            LOGGER.error("Failed to create storage pool", e);
-            throw new CloudRuntimeException("Failed to establish connection 
with PowerFlex Gateway to create storage pool");
-        }
-
-        if (connectedSdcIps == null || connectedSdcIps.isEmpty()) {
-            LOGGER.debug("No connected SDCs found for the PowerFlex storage 
pool");
-            throw new CloudRuntimeException("Failed to create storage pool as 
connected SDCs not found");
-        }
+        checkConnectedSdcs(dataStore.getId());
 
         PrimaryDataStoreInfo primaryDataStoreInfo = (PrimaryDataStoreInfo) 
dataStore;
-
         List<HostVO> hostsInCluster = 
resourceManager.listAllUpAndEnabledHosts(Host.Type.Routing, 
primaryDataStoreInfo.getClusterId(),
                 primaryDataStoreInfo.getPodId(), 
primaryDataStoreInfo.getDataCenterId());
         if (hostsInCluster.isEmpty()) {
@@ -285,8 +272,7 @@ public class ScaleIOPrimaryDataStoreLifeCycle implements 
PrimaryDataStoreLifeCyc
         List<HostVO> poolHosts = new ArrayList<HostVO>();
         for (HostVO host : hostsInCluster) {
             try {
-                if (connectedSdcIps.contains(host.getPrivateIpAddress())) {
-                    storageMgr.connectHostToSharedPool(host.getId(), 
primaryDataStoreInfo.getId());
+                if (storageMgr.connectHostToSharedPool(host.getId(), 
primaryDataStoreInfo.getId())) {
                     poolHosts.add(host);
                 }
             } catch (Exception e) {
@@ -315,27 +301,14 @@ public class ScaleIOPrimaryDataStoreLifeCycle implements 
PrimaryDataStoreLifeCyc
             throw new CloudRuntimeException("Unsupported hypervisor type: " + 
hypervisorType.toString());
         }
 
-        List<String> connectedSdcIps = null;
-        try {
-            ScaleIOGatewayClient client = 
ScaleIOGatewayClientConnectionPool.getInstance().getClient(dataStore.getId(), 
storagePoolDetailsDao);
-            connectedSdcIps = client.listConnectedSdcIps();
-        } catch (NoSuchAlgorithmException | KeyManagementException | 
URISyntaxException e) {
-            LOGGER.error("Failed to create storage pool", e);
-            throw new CloudRuntimeException("Failed to establish connection 
with PowerFlex Gateway to create storage pool");
-        }
-
-        if (connectedSdcIps == null || connectedSdcIps.isEmpty()) {
-            LOGGER.debug("No connected SDCs found for the PowerFlex storage 
pool");
-            throw new CloudRuntimeException("Failed to create storage pool as 
connected SDCs not found");
-        }
+        checkConnectedSdcs(dataStore.getId());
 
         LOGGER.debug("Attaching the pool to each of the hosts in the zone: " + 
scope.getScopeId());
         List<HostVO> hosts = 
resourceManager.listAllUpAndEnabledHostsInOneZoneByHypervisor(hypervisorType, 
scope.getScopeId());
         List<HostVO> poolHosts = new ArrayList<HostVO>();
         for (HostVO host : hosts) {
             try {
-                if (connectedSdcIps.contains(host.getPrivateIpAddress())) {
-                    storageMgr.connectHostToSharedPool(host.getId(), 
dataStore.getId());
+                if (storageMgr.connectHostToSharedPool(host.getId(), 
dataStore.getId())) {
                     poolHosts.add(host);
                 }
             } catch (Exception e) {
@@ -352,6 +325,22 @@ public class ScaleIOPrimaryDataStoreLifeCycle implements 
PrimaryDataStoreLifeCyc
         return true;
     }
 
+    private void checkConnectedSdcs(Long dataStoreId) {
+        boolean haveConnectedSdcs = false;
+        try {
+            ScaleIOGatewayClient client = 
ScaleIOGatewayClientConnectionPool.getInstance().getClient(dataStoreId, 
storagePoolDetailsDao);
+            haveConnectedSdcs = client.haveConnectedSdcs();
+        } catch (NoSuchAlgorithmException | KeyManagementException | 
URISyntaxException e) {
+            LOGGER.error(String.format("Failed to create storage pool for 
datastore: %s", dataStoreId), e);
+            throw new CloudRuntimeException(String.format("Failed to establish 
connection with PowerFlex Gateway to create storage pool for datastore: %s", 
dataStoreId));
+        }
+
+        if (!haveConnectedSdcs) {
+            LOGGER.debug(String.format("No connected SDCs found for the 
PowerFlex storage pool of datastore: %s", dataStoreId));
+            throw new CloudRuntimeException(String.format("Failed to create 
storage pool as connected SDCs not found for datastore: %s", dataStoreId));
+        }
+    }
+
     @Override
     public boolean maintain(DataStore store) {
         storagePoolAutomation.maintain(store);
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOHostListener.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOHostListener.java
index 2a8f3e1eb0..68044baf17 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOHostListener.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/provider/ScaleIOHostListener.java
@@ -21,6 +21,8 @@ package org.apache.cloudstack.storage.datastore.provider;
 import java.net.URISyntaxException;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.inject.Inject;
 
@@ -30,6 +32,8 @@ import 
org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClient;
 import 
org.apache.cloudstack.storage.datastore.client.ScaleIOGatewayClientConnectionPool;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
@@ -69,7 +73,41 @@ public class ScaleIOHostListener implements 
HypervisorHostListener {
             return false;
         }
 
-        if (!isHostSdcConnected(host.getPrivateIpAddress(), poolId)) {
+        StoragePool storagePool = 
(StoragePool)_dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);
+
+        String systemId = _storagePoolDetailsDao.findDetail(poolId, 
ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID).getValue();
+        if (systemId == null) {
+            throw new CloudRuntimeException("Failed to get the system id for 
PowerFlex storage pool " + storagePool.getName());
+        }
+        Map<String,String> details = new HashMap<>();
+        details.put(ScaleIOGatewayClient.STORAGE_POOL_SYSTEM_ID, systemId);
+
+        ModifyStoragePoolCommand cmd = new ModifyStoragePoolCommand(true, 
storagePool, storagePool.getPath(), details);
+        ModifyStoragePoolAnswer answer  = sendModifyStoragePoolCommand(cmd, 
storagePool, hostId);
+        Map<String,String> poolDetails = answer.getPoolInfo().getDetails();
+        if (MapUtils.isEmpty(poolDetails)) {
+            String msg = "SDC details not found on the host: " + hostId + ", 
(re)install SDC and restart agent";
+            s_logger.warn(msg);
+            _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, 
host.getDataCenterId(), host.getPodId(), "SDC not found on host: " + 
host.getUuid(), msg);
+            return false;
+        }
+
+        String sdcId = null;
+        if (poolDetails.containsKey(ScaleIOGatewayClient.SDC_ID)) {
+            sdcId = poolDetails.get(ScaleIOGatewayClient.SDC_ID);
+        } else if (poolDetails.containsKey(ScaleIOGatewayClient.SDC_GUID)) {
+            String sdcGuid = poolDetails.get(ScaleIOGatewayClient.SDC_GUID);
+            sdcId = getHostSdcId(sdcGuid, poolId);
+        }
+
+        if (StringUtils.isBlank(sdcId)) {
+            String msg = "Couldn't retrieve SDC details from the host: " + 
hostId + ", (re)install SDC and restart agent";
+            s_logger.warn(msg);
+            _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, 
host.getDataCenterId(), host.getPodId(), "SDC details not found on host: " + 
host.getUuid(), msg);
+            return false;
+        }
+
+        if (!isHostSdcConnected(sdcId, poolId)) {
             s_logger.warn("SDC not connected on the host: " + hostId);
             String msg = "SDC not connected on the host: " + hostId + ", 
reconnect the SDC to MDM and restart agent";
             _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, 
host.getDataCenterId(), host.getPodId(), "SDC disconnected on host: " + 
host.getUuid(), msg);
@@ -78,27 +116,39 @@ public class ScaleIOHostListener implements 
HypervisorHostListener {
 
         StoragePoolHostVO storagePoolHost = 
_storagePoolHostDao.findByPoolHost(poolId, hostId);
         if (storagePoolHost == null) {
-            storagePoolHost = new StoragePoolHostVO(poolId, hostId, "");
+            storagePoolHost = new StoragePoolHostVO(poolId, hostId, sdcId);
             _storagePoolHostDao.persist(storagePoolHost);
+        } else {
+            storagePoolHost.setLocalPath(sdcId);
+            _storagePoolHostDao.update(storagePoolHost.getId(), 
storagePoolHost);
         }
 
-        StoragePool storagePool = 
(StoragePool)_dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);
-        ModifyStoragePoolCommand cmd = new ModifyStoragePoolCommand(true, 
storagePool);
-        sendModifyStoragePoolCommand(cmd, storagePool, hostId);
+        s_logger.info("Connection established between storage pool: " + 
storagePool + " and host: " + hostId);
         return true;
     }
 
-    private boolean isHostSdcConnected(String hostIpAddress, long poolId) {
+    private String getHostSdcId(String sdcGuid, long poolId) {
+        try {
+            s_logger.debug(String.format("Try to get host SDC Id for pool: %s, 
with SDC guid %s", poolId, sdcGuid));
+            ScaleIOGatewayClient client = 
ScaleIOGatewayClientConnectionPool.getInstance().getClient(poolId, 
_storagePoolDetailsDao);
+            return client.getSdcIdByGuid(sdcGuid);
+        } catch (NoSuchAlgorithmException | KeyManagementException | 
URISyntaxException e) {
+            s_logger.error(String.format("Failed to get host SDC Id for pool: 
%s", poolId), e);
+            throw new CloudRuntimeException(String.format("Failed to establish 
connection with PowerFlex Gateway to get host SDC Id for pool: %s", poolId));
+        }
+    }
+
+    private boolean isHostSdcConnected(String sdcId, long poolId) {
         try {
             ScaleIOGatewayClient client = 
ScaleIOGatewayClientConnectionPool.getInstance().getClient(poolId, 
_storagePoolDetailsDao);
-            return client.isSdcConnected(hostIpAddress);
+            return client.isSdcConnected(sdcId);
         } catch (NoSuchAlgorithmException | KeyManagementException | 
URISyntaxException e) {
             s_logger.error("Failed to check host sdc connection", e);
             throw new CloudRuntimeException("Failed to establish connection 
with PowerFlex Gateway to check host sdc connection");
         }
     }
 
-    private void sendModifyStoragePoolCommand(ModifyStoragePoolCommand cmd, 
StoragePool storagePool, long hostId) {
+    private ModifyStoragePoolAnswer 
sendModifyStoragePoolCommand(ModifyStoragePoolCommand cmd, StoragePool 
storagePool, long hostId) {
         Answer answer = _agentMgr.easySend(hostId, cmd);
 
         if (answer == null) {
@@ -116,7 +166,7 @@ public class ScaleIOHostListener implements 
HypervisorHostListener {
 
         assert (answer instanceof ModifyStoragePoolAnswer) : 
"ModifyStoragePoolAnswer expected ; Pool = " + storagePool.getId() + " Host = " 
+ hostId;
 
-        s_logger.info("Connection established between storage pool " + 
storagePool + " and host: " + hostId);
+        return (ModifyStoragePoolAnswer) answer;
     }
 
     @Override
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/util/ScaleIOUtil.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/util/ScaleIOUtil.java
index 73a37ce2fb..1ae4411d6c 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/util/ScaleIOUtil.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/util/ScaleIOUtil.java
@@ -19,6 +19,7 @@ package org.apache.cloudstack.storage.datastore.util;
 
 import org.apache.log4j.Logger;
 
+import com.cloud.utils.UuidUtils;
 import com.cloud.utils.script.Script;
 import org.apache.commons.lang3.StringUtils;
 
@@ -47,11 +48,31 @@ public class ScaleIOUtil {
     private static final String SDC_HOME_PATH = getSdcHomePath();
 
     private static final String RESCAN_CMD = "drv_cfg --rescan";
+
+    /**
+     * Cmd for querying volumes in SDC
+     * Sample output for cmd: drv_cfg --query_vols:
+     * Retrieved 2 volume(s)
+     * VOL-ID 6c33633100000009 MDM-ID 218ce1797566a00f
+     * VOL-ID 6c3362a30000000a MDM-ID 218ce1797566a00f
+     */
     private static final String QUERY_VOLUMES_CMD = "drv_cfg --query_vols";
-    // Sample output for cmd: drv_cfg --query_vols:
-    // Retrieved 2 volume(s)
-    // VOL-ID 6c33633100000009 MDM-ID 218ce1797566a00f
-    // VOL-ID 6c3362a30000000a MDM-ID 218ce1797566a00f
+
+    /**
+     * Cmd for querying guid in SDC
+     * Sample output for cmd: drv_cfg --query_guid:
+     * B0E3BFB8-C20B-43BF-93C8-13339E85AA50
+     */
+    private static final String QUERY_GUID_CMD = "drv_cfg --query_guid";
+
+    /**
+     * Cmd for querying MDMs in SDC
+     * Sample output for cmd: drv_cfg --query_mdms:
+     * Retrieved 2 mdm(s)
+     * MDM-ID 3ef46cbf2aaf5d0f SDC ID 6b18479c00000003 INSTALLATION ID 
68ab55462cbb3ae4 IPs [0]-x.x.x.x [1]-x.x.x.x
+     * MDM-ID 2e706b2740ec200f SDC ID 301b852c00000003 INSTALLATION ID 
33f8662e7a5c1e6c IPs [0]-x.x.x.x [1]-x.x.x.x
+     */
+    private static final String QUERY_MDMS_CMD = "drv_cfg --query_mdms";
 
     public static String getSdcHomePath() {
         String sdcHomePath = DEFAULT_SDC_HOME_PATH;
@@ -97,6 +118,51 @@ public class ScaleIOUtil {
         return result;
     }
 
+    public static String getSdcGuid() {
+        String queryGuidCmd = ScaleIOUtil.SDC_HOME_PATH + "/bin/" + 
ScaleIOUtil.QUERY_GUID_CMD;
+        String result = Script.runSimpleBashScript(queryGuidCmd);
+        if (result == null) {
+            LOGGER.warn("Failed to get SDC guid");
+            return null;
+        }
+
+        if (result.isEmpty()) {
+            LOGGER.warn("No SDC guid retrieved");
+            return null;
+        }
+
+        if (!UuidUtils.validateUUID(result)) {
+            LOGGER.warn("Invalid SDC guid: " + result);
+            return null;
+        }
+
+        return result;
+    }
+
+    public static String getSdcId(String mdmId) {
+        //query_mdms outputs "MDM-ID <System/MDM-Id> SDC ID <SDC-Id> 
INSTALLATION ID <Installation-Id> IPs [0]-x.x.x.x [1]-x.x.x.x" for a MDM with 
ID: <MDM-Id>
+        String queryMdmsCmd = ScaleIOUtil.SDC_HOME_PATH + "/bin/" + 
ScaleIOUtil.QUERY_MDMS_CMD;
+        queryMdmsCmd += "|grep " + mdmId + "|awk '{print $5}'";
+        String result = Script.runSimpleBashScript(queryMdmsCmd);
+        if (result == null) {
+            LOGGER.warn("Failed to get SDC Id, for the MDM: " + mdmId);
+            return null;
+        }
+
+        if (result.isEmpty()) {
+            LOGGER.warn("No SDC Id retrieved, for the MDM: " + mdmId);
+            return null;
+        }
+
+        String sdcIdRegEx = "^[0-9a-fA-F]{16}$";
+        if (!result.matches(sdcIdRegEx)) {
+            LOGGER.warn("Invalid SDC Id: " + result + " retrieved, for the 
MDM: " + mdmId);
+            return null;
+        }
+
+        return result;
+    }
+
     public static final String getVolumePath(String volumePathWithName) {
         if (StringUtils.isEmpty(volumePathWithName)) {
             return volumePathWithName;
diff --git 
a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycleTest.java
 
b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycleTest.java
index eed82ff0ed..6cc7b87455 100644
--- 
a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycleTest.java
+++ 
b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycleTest.java
@@ -22,7 +22,6 @@ package org.apache.cloudstack.storage.datastore.lifecycle;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -140,11 +139,7 @@ public class ScaleIOPrimaryDataStoreLifeCycleTest {
         ScaleIOGatewayClientImpl client = mock(ScaleIOGatewayClientImpl.class);
         when(ScaleIOGatewayClientConnectionPool.getInstance().getClient(1L, 
storagePoolDetailsDao)).thenReturn(client);
 
-        List<String> connectedSdcIps = new ArrayList<>();
-        connectedSdcIps.add("192.168.1.1");
-        connectedSdcIps.add("192.168.1.2");
-        when(client.listConnectedSdcIps()).thenReturn(connectedSdcIps);
-        when(client.isSdcConnected(anyString())).thenReturn(true);
+        when(client.haveConnectedSdcs()).thenReturn(true);
 
         final ZoneScope scope = new ZoneScope(1L);
 
diff --git 
a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java
 
b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java
index 0373e3bdf8..a35787c205 100644
--- 
a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java
+++ 
b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStorageAdaptor.java
@@ -57,7 +57,7 @@ public class StorPoolStorageAdaptor implements StorageAdaptor 
{
     private static final Map<String, KVMStoragePool> storageUuidToStoragePool 
= new HashMap<String, KVMStoragePool>();
 
     @Override
-    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, StoragePoolType storagePoolType) {
+    public KVMStoragePool createStoragePool(String uuid, String host, int 
port, String path, String userInfo, StoragePoolType storagePoolType, 
Map<String, String> details) {
         SP_LOG("StorpooolStorageAdaptor.createStoragePool: uuid=%s, 
host=%s:%d, path=%s, userInfo=%s, type=%s", uuid, host, port, path, userInfo, 
storagePoolType);
 
         StorPoolStoragePool storagePool = new StorPoolStoragePool(uuid, host, 
port, storagePoolType, this);
diff --git 
a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStoragePool.java
 
b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStoragePool.java
index d031f319d1..e44270ac8a 100644
--- 
a/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStoragePool.java
+++ 
b/plugins/storage/volume/storpool/src/main/java/com/cloud/hypervisor/kvm/storage/StorPoolStoragePool.java
@@ -161,4 +161,9 @@ public class StorPoolStoragePool implements KVMStoragePool {
     public boolean supportsConfigDriveIso() {
         return false;
     }
+
+    @Override
+    public Map<String, String> getDetails() {
+        return null;
+    }
 }
diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java 
b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index 26f2f41cd0..de4eb55bc9 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -1100,14 +1100,14 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
     }
 
     @Override
-    public void connectHostToSharedPool(long hostId, long poolId) throws 
StorageUnavailableException, StorageConflictException {
+    public boolean connectHostToSharedPool(long hostId, long poolId) throws 
StorageUnavailableException, StorageConflictException {
         StoragePool pool = (StoragePool)_dataStoreMgr.getDataStore(poolId, 
DataStoreRole.Primary);
         assert (pool.isShared()) : "Now, did you actually read the name of 
this method?";
         s_logger.debug("Adding pool " + pool.getName() + " to  host " + 
hostId);
 
         DataStoreProvider provider = 
_dataStoreProviderMgr.getDataStoreProvider(pool.getStorageProviderName());
         HypervisorHostListener listener = 
hostListeners.get(provider.getName());
-        listener.hostConnect(hostId, pool.getId());
+        return listener.hostConnect(hostId, pool.getId());
     }
 
     @Override
diff --git 
a/server/src/test/java/com/cloud/storage/listener/StoragePoolMonitorTest.java 
b/server/src/test/java/com/cloud/storage/listener/StoragePoolMonitorTest.java
index b9bbe068ab..0f9b999a0f 100644
--- 
a/server/src/test/java/com/cloud/storage/listener/StoragePoolMonitorTest.java
+++ 
b/server/src/test/java/com/cloud/storage/listener/StoragePoolMonitorTest.java
@@ -63,7 +63,7 @@ public class StoragePoolMonitorTest {
         Mockito.when(poolDao.listBy(nullable(Long.class), 
nullable(Long.class), nullable(Long.class), 
Mockito.any(ScopeType.class))).thenReturn(Collections.singletonList(pool));
         Mockito.when(poolDao.findZoneWideStoragePoolsByTags(Mockito.anyLong(), 
Mockito.any(String[].class))).thenReturn(Collections.<StoragePoolVO>emptyList());
         
Mockito.when(poolDao.findZoneWideStoragePoolsByHypervisor(Mockito.anyLong(), 
Mockito.any(Hypervisor.HypervisorType.class))).thenReturn(Collections.<StoragePoolVO>emptyList());
-        
Mockito.doNothing().when(storageManager).connectHostToSharedPool(host.getId(), 
pool.getId());
+        
Mockito.doReturn(true).when(storageManager).connectHostToSharedPool(host.getId(),
 pool.getId());
 
         storagePoolMonitor.processConnect(host, cmd, false);
 

Reply via email to