You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mt...@apache.org on 2014/07/18 05:35:17 UTC

[2/3] first commit of improvised cloudbyte storage plugin

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f3cbb699/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/util/ElastistorUtil.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/util/ElastistorUtil.java b/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/util/ElastistorUtil.java
index b75d12a..4e9cef3 100755
--- a/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/util/ElastistorUtil.java
+++ b/plugins/storage/volume/cloudbyte/src/org/apache/cloudstack/storage/datastore/util/ElastistorUtil.java
@@ -37,9 +37,12 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.UriBuilder;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.http.auth.InvalidCredentialsException;
 import org.apache.log4j.Logger;
 
+import com.cloud.agent.api.Answer;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.google.gson.Gson;
 import com.google.gson.annotations.SerializedName;
@@ -54,6 +57,15 @@ public class ElastistorUtil {
 
     private static final Logger s_logger = Logger.getLogger(ElastistorUtil.class);
 
+    private static ConfigurationDao configurationDao;
+
+    public static ConfigurationDao getConfigurationDao() {
+        return configurationDao;
+    }
+
+    public static void setConfigurationDao(ConfigurationDao configurationDao) {
+        ElastistorUtil.configurationDao = configurationDao;
+    }
 
     /**
      * Elastistor REST API Param Keys. These should match exactly with the
@@ -84,7 +96,7 @@ public class ElastistorUtil {
     public static final String REST_PARAM_GRACEALLOWED = "graceallowed";
     public static final String REST_PARAM_IOPS = "iops";
     public static final String REST_PARAM_THROUGHPUT = "throughput";
-    public static final String REST_PARAM_MEMLIMIT= "memlimit";
+    public static final String REST_PARAM_MEMLIMIT = "memlimit";
     public static final String REST_PARAM_NETWORKSPEED = "networkspeed";
     public static final String REST_PARAM_TSMID = "tsmid";
     public static final String REST_PARAM_DATASETID = "datasetid";
@@ -92,12 +104,13 @@ public class ElastistorUtil {
     public static final String REST_PARAM_DEDUPLICATION = "deduplication";
     public static final String REST_PARAM_COMPRESSION = "compression";
     public static final String REST_PARAM_SYNC = "sync";
-    public static final String REST_PARAM_MOUNTPOINT= "mountpoint";
+    public static final String REST_PARAM_MOUNTPOINT = "mountpoint";
     public static final String REST_PARAM_CASESENSITIVITY = "casesensitivity";
     public static final String REST_PARAM_UNICODE = "unicode";
-    public static final String REST_PARAM_PROTOCOLTYPE= "protocoltype";
+    public static final String REST_PARAM_PROTOCOLTYPE = "protocoltype";
     public static final String REST_PARAM_AUTHNETWORK = "authnetwork";
     public static final String REST_PARAM_MAPUSERSTOROOT = "mapuserstoroot";
+    public static final String REST_PARAM_STORAGEID = "storageid";
 
     /**
      * Constants related to elastistor which are persisted in cloudstack
@@ -106,7 +119,7 @@ public class ElastistorUtil {
     public static final String ES_SUBNET = "essubnet";
     public static final String ES_INTERFACE = "estntinterface";
     public static final String ES_GATEWAY = "esdefaultgateway";
-    public static final String ES_PROVIDER_NAME = "elastistor";
+    public static final String ES_PROVIDER_NAME = "CloudByte";
     public static final String ES_ACCOUNT_ID = "esAccountId";
     public static final String ES_POOL_ID = "esPoolId";
     public static final String ES_ACCOUNT_NAME = "esAccountName";
@@ -151,7 +164,6 @@ public class ElastistorUtil {
     private static final String ES_MAPUSERSTOROOT_VAL = "yes";
     private static final String ES_SYNC_VAL = "always";
 
-
     /**
      * Private constructor s.t. its never instantiated.
      */
@@ -162,20 +174,29 @@ public class ElastistorUtil {
     /**
      * This intializes a new jersey restclient for http call with elasticenter
      */
-    public static ElastiCenterClient getElastistorRestClient(String managementIp , String apiKey) {
+    public static ElastiCenterClient getElastistorRestClient() {
         ElastiCenterClient restclient = null;
         try {
+            String ip = getConfigurationDao().getValue("cloudbyte.management.ip");
+            String apikey = getConfigurationDao().getValue("cloudbyte.management.apikey");
+
+            if (ip == null) {
+                throw new CloudRuntimeException("set the value of cloudbyte.management.ip in global settings");
+            }
+            if (apikey == null) {
+                throw new CloudRuntimeException("set the value of cloudbyte.management.apikey in global settings");
+            }
 
-            restclient = new ElastiCenterClient(managementIp, apiKey);
+            restclient = new ElastiCenterClient(ip, apikey);
 
         } catch (InvalidCredentialsException e) {
-            throw new CloudRuntimeException("InvalidCredentialsException", e);
+            throw new CloudRuntimeException("InvalidCredentialsException:" + e.getMessage(), e);
         } catch (InvalidParameterException e) {
-            throw new CloudRuntimeException("InvalidParameterException", e);
+            throw new CloudRuntimeException("InvalidParameterException:" + e.getMessage(), e);
         } catch (SSLHandshakeException e) {
-            throw new CloudRuntimeException("SSLHandshakeException", e);
+            throw new CloudRuntimeException("SSLHandshakeException:" + e.getMessage(), e);
         } catch (ServiceUnavailableException e) {
-            throw new CloudRuntimeException("ServiceUnavailableException", e);
+            throw new CloudRuntimeException("ServiceUnavailableException:" + e.getMessage(), e);
         }
         return restclient;
     }
@@ -209,80 +230,143 @@ public class ElastistorUtil {
     }
 
     /**
-     * This creates a new tenant storage machine(TSM) for the given storagepool ip in elastistor.
+     * This creates a new Account in Elasticenter for the given Domain Name.
+     *
+     * @return
      */
-    public static CreateTsmCmdResponse createElastistorTsm(String storagePoolName, String storageIp, Long capacityBytes, Long capacityIops) throws Throwable {
-
-            String totalthroughput = String.valueOf(capacityIops*4);
-            String totaliops = String.valueOf(capacityIops);
-
-            String quotasize = convertCapacityBytes(capacityBytes);
-
-          CreateTsmCmd createTsmCmd = new CreateTsmCmd();
-
-          if ( null != ElastistorUtil.s_esACCOUNTIDVAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ACCOUNTID, ElastistorUtil.s_esACCOUNTIDVAL);
-          if ( null != totalthroughput ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TSM_THROUGHPUT, totalthroughput);
-          if ( null != ElastistorUtil.s_esPOOLIDVAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_POOLID, ElastistorUtil.s_esPOOLIDVAL);
-          if ( null != storagePoolName ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NAME, "TSM"+storagePoolName);
-          if ( null != quotasize ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_QUOTA_SIZE, quotasize);
-          if ( null != storageIp ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_IPADDRESS, storageIp);
-          if ( null != ElastistorUtil.s_esSUBNETVAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_SUBNET, ElastistorUtil.s_esSUBNETVAL);
-          if ( null != ElastistorUtil.s_esGATEWAYVAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_GATEWAY, ElastistorUtil.s_esGATEWAYVAL);
-          if ( null != ElastistorUtil.s_esINTERFACEVAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_INTERFACE, ElastistorUtil.s_esINTERFACEVAL);
-          if ( null != ElastistorUtil.ES_NOOFCOPIES_VAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NOOFCOPIES, ElastistorUtil.ES_NOOFCOPIES_VAL);
-          if ( null != ElastistorUtil.ES_BLOCKSIZE_VAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_RECORDSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
-          if ( null != totaliops ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TOTALIOPS, totaliops);
-          if ( null != ElastistorUtil.ES_LATENCY_VAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_LATENCY, ElastistorUtil.ES_LATENCY_VAL);
-          if ( null != ElastistorUtil.ES_BLOCKSIZE_VAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_BLOCKSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
-          if ( null != ElastistorUtil.ES_GRACEALLOWED_VAL ) createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_GRACEALLOWED, ElastistorUtil.ES_GRACEALLOWED_VAL);
-
-        CreateTsmCmdResponse cmdResponse;
-
-    try {
-        cmdResponse = (CreateTsmCmdResponse) getElastistorRestClient(s_esIPVAL, s_esAPIKEYVAL).executeCommand(createTsmCmd);
-
-        if ( cmdResponse.getTsm().getUuid() == null  ){
-             throw new CloudRuntimeException("tsm creation failed , contact elatistor admin");
-         }
-        return cmdResponse;
-    } catch (Exception e) {
-        throw new CloudRuntimeException("tsm creation failed , contact elatistor admin" + e.toString());
+    public static String getElastistorAccountId(String domainName) throws Throwable {
+
+        ListAccountResponse listAccountResponse = ListElastistorAccounts();
+
+        if (listAccountResponse.getAccounts().getCount() != 0) {
+            int i;
+            // check weather a account in elasticenter with given Domain name is
+            // already present in the list of accounts
+            for (i = 0; i < listAccountResponse.getAccounts().getCount(); i++) {
+                if (domainName.equals(listAccountResponse.getAccounts().getAccount(i).getName())) {
+                    return listAccountResponse.getAccounts().getAccount(i).getUuid();
+                }
+            }
+
+            // if no account matches the give Domain Name , create one with the
+            // Domain name
+            CreateAccountResponse createAccountResponse = createElastistorAccount(domainName);
+            return createAccountResponse.getAccount().getUuid();
+
+        } else {
+            // if no account is present in the elasticenter create one
+            CreateAccountResponse createAccountResponse = createElastistorAccount(domainName);
+            return createAccountResponse.getAccount().getUuid();
+        }
     }
 
+    /**
+     * This creates a new tenant storage machine(TSM) for the given storagepool
+     * ip in elastistor.
+     *
+     * @param domainName
+     *            TODO
+     */
+    public static Tsm createElastistorTsm(String storagePoolName, String storageIp, Long capacityBytes, Long capacityIops, String domainName) throws Throwable {
+
+        String totalthroughput = String.valueOf(capacityIops * 4);
+        String totaliops = String.valueOf(capacityIops);
+
+        String quotasize = convertCapacityBytes(capacityBytes);
+
+        CreateTsmCmd createTsmCmd = new CreateTsmCmd();
+
+        if (null != ElastistorUtil.s_esACCOUNTIDVAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ACCOUNTID, domainName);
+        if (null != totalthroughput)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TSM_THROUGHPUT, totalthroughput);
+        if (null != ElastistorUtil.s_esPOOLIDVAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_POOLID, ElastistorUtil.s_esPOOLIDVAL);
+        if (null != storagePoolName)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NAME, storagePoolName);
+        if (null != quotasize)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_QUOTA_SIZE, quotasize);
+        if (null != storageIp)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_IPADDRESS, storageIp);
+        if (null != ElastistorUtil.s_esSUBNETVAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_SUBNET, ElastistorUtil.s_esSUBNETVAL);
+        if (null != ElastistorUtil.s_esGATEWAYVAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_GATEWAY, ElastistorUtil.s_esGATEWAYVAL);
+        if (null != ElastistorUtil.s_esINTERFACEVAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_INTERFACE, ElastistorUtil.s_esINTERFACEVAL);
+        if (null != ElastistorUtil.ES_NOOFCOPIES_VAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NOOFCOPIES, ElastistorUtil.ES_NOOFCOPIES_VAL);
+        if (null != ElastistorUtil.ES_BLOCKSIZE_VAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_RECORDSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
+        if (null != totaliops)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TOTALIOPS, totaliops);
+        if (null != ElastistorUtil.ES_LATENCY_VAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_LATENCY, ElastistorUtil.ES_LATENCY_VAL);
+        if (null != ElastistorUtil.ES_BLOCKSIZE_VAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_BLOCKSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
+        if (null != ElastistorUtil.ES_GRACEALLOWED_VAL)
+            createTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_GRACEALLOWED, ElastistorUtil.ES_GRACEALLOWED_VAL);
+
+        CreateTsmCmdResponse createTsmCmdResponse;
+        Tsm tsm = null;
+        try {
+            createTsmCmdResponse = (CreateTsmCmdResponse) getElastistorRestClient().executeCommand(createTsmCmd);
+
+            if (createTsmCmdResponse.getJobid() == null) {
+                throw new CloudRuntimeException("tsm creation failed , contact elatistor admin");
+            } else {
+                tsm = queryAsyncTsmJobResult(createTsmCmdResponse.getJobid());
+                if (tsm == null) {
+                    throw new CloudRuntimeException("tsm queryAsync failed , contact elatistor admin");
+                }
+            }
+            return tsm;
+        } catch (Exception e) {
+            throw new CloudRuntimeException("tsm creation failed , contact elatistor admin" + e.toString());
+        }
+
     }
 
     /**
      * This creates the specified volume on the created tsm.
      */
-    public static CreateVolumeCmdResponse createElastistorVolume(String storagePoolName, CreateTsmCmdResponse cmdResponse, Long capacityBytes, Long capacityIops,String protocoltype, String mountpoint) throws Throwable {
+    public static FileSystem createElastistorVolume(String volumeName, String tsmid, Long capacityBytes, Long capacityIops, String protocoltype, String mountpoint) throws Throwable {
 
         String datasetid;
-        String tsmid;
         String qosgroupid;
-        String VolumeName = storagePoolName;
+        String VolumeName = volumeName;
         String totaliops = String.valueOf(capacityIops);
-        String totalthroughput = String.valueOf(capacityIops*4);
+        String totalthroughput = String.valueOf(capacityIops * 4);
 
         String quotasize = convertCapacityBytes(capacityBytes);
 
         AddQosGroupCmd addQosGroupCmd = new AddQosGroupCmd();
 
-
-        tsmid = cmdResponse.getTsm().getUuid();
-        datasetid = cmdResponse.getTsm().getDatasetid();
-
-        if (null != VolumeName)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NAME, "QOS_" + VolumeName);
-        if (null != totaliops)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_IOPS, totaliops);
-        if (null != ElastistorUtil.ES_LATENCY_VAL)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_LATENCY, ElastistorUtil.ES_LATENCY_VAL);
-        if (null != ElastistorUtil.ES_BLOCKSIZE_VAL)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_BLOCKSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
-        if (null != totalthroughput)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_THROUGHPUT, totalthroughput);
-        if (null != ElastistorUtil.ES_MEMLIMIT_VAL)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_MEMLIMIT, ElastistorUtil.ES_MEMLIMIT_VAL);
-        if (null != ElastistorUtil.ES_NETWORKSPEED_VAL)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NETWORKSPEED, ElastistorUtil.ES_NETWORKSPEED_VAL);
-        if (null != tsmid)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TSMID, tsmid);
-        if (null != datasetid)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_DATASETID, datasetid);
-        if (null != ElastistorUtil.ES_GRACEALLOWED_VAL)addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_GRACEALLOWED, ElastistorUtil.ES_GRACEALLOWED_VAL);
-
-        AddQosGroupCmdResponse addQosGroupCmdResponse = (AddQosGroupCmdResponse) getElastistorRestClient(s_esIPVAL, s_esAPIKEYVAL).executeCommand(addQosGroupCmd);
+        ListTsmsResponse listTsmsResponse = listTsm(tsmid);
+
+        tsmid = listTsmsResponse.getTsms().getTsm(0).getUuid();
+        datasetid = listTsmsResponse.getTsms().getTsm(0).getDatasetid();
+
+        if (null != VolumeName)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NAME, "QOS_" + VolumeName);
+        if (null != totaliops)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_IOPS, totaliops);
+        if (null != ElastistorUtil.ES_LATENCY_VAL)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_LATENCY, ElastistorUtil.ES_LATENCY_VAL);
+        if (null != totalthroughput)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_THROUGHPUT, totalthroughput);
+        if (null != ElastistorUtil.ES_MEMLIMIT_VAL)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_MEMLIMIT, ElastistorUtil.ES_MEMLIMIT_VAL);
+        if (null != ElastistorUtil.ES_NETWORKSPEED_VAL)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NETWORKSPEED, ElastistorUtil.ES_NETWORKSPEED_VAL);
+        if (null != tsmid)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TSMID, tsmid);
+        if (null != datasetid)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_DATASETID, datasetid);
+        if (null != ElastistorUtil.ES_GRACEALLOWED_VAL)
+            addQosGroupCmd.putCommandParameter(ElastistorUtil.REST_PARAM_GRACEALLOWED, ElastistorUtil.ES_GRACEALLOWED_VAL);
+
+        AddQosGroupCmdResponse addQosGroupCmdResponse = (AddQosGroupCmdResponse) getElastistorRestClient().executeCommand(addQosGroupCmd);
 
         if (addQosGroupCmdResponse.getQoSGroup().getUuid() == null) {
 
@@ -296,45 +380,83 @@ public class ElastistorUtil {
 
             qosgroupid = addQosGroupCmdResponse.getQoSGroup().getUuid();
 
-            if (null != ElastistorUtil.s_esACCOUNTIDVAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ACCOUNTID,ElastistorUtil.s_esACCOUNTIDVAL);
-            if (null != qosgroupid)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_QOSGROUPID, qosgroupid);
-            if (null != tsmid)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TSMID, tsmid);
-            if (null != ElastistorUtil.s_esPOOLIDVAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_POOLID,ElastistorUtil.s_esPOOLIDVAL);
-            if (null != VolumeName)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NAME, VolumeName);
-            if (null != quotasize)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_QUOTA_SIZE, quotasize);
-            if(protocoltype.equalsIgnoreCase("nfs")){
-                  if ( null != ElastistorUtil.ES_BLOCKSIZE_VAL ) createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_BLOCKSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
-                  if ( null != ElastistorUtil.ES_BLOCKSIZE_VAL ) createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_RECORDSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
-                  }
-                  else{
-                      if ( null != ElastistorUtil.ES_BLOCKSIZE_VAL ) createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_BLOCKSIZE, "512B");
-                      if ( null != ElastistorUtil.ES_BLOCKSIZE_VAL ) createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_RECORDSIZE, "512B");
-                  }
-            if (null != ElastistorUtil.ES_DEDUPLICATION_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_DEDUPLICATION, ElastistorUtil.ES_DEDUPLICATION_VAL);
-            if (null != ElastistorUtil.ES_SYNC_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_SYNC, ElastistorUtil.ES_SYNC_VAL);
-            if (null != ElastistorUtil.ES_COMPRESSION_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_COMPRESSION, ElastistorUtil.ES_COMPRESSION_VAL);
-            if (null != ElastistorUtil.ES_NOOFCOPIES_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NOOFCOPIES, ElastistorUtil.ES_NOOFCOPIES_VAL);
+            // if (null !=
+            // ElastistorUtil.s_esACCOUNTIDVAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ACCOUNTID,ElastistorUtil.s_esACCOUNTIDVAL);
+            if (null != qosgroupid)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_QOSGROUPID, qosgroupid);
+            if (null != tsmid)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_TSMID, tsmid);
+            // if (null !=
+            // ElastistorUtil.s_esPOOLIDVAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_POOLID,ElastistorUtil.s_esPOOLIDVAL);
+            if (null != VolumeName)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NAME, VolumeName);
+            if (null != quotasize)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_QUOTA_SIZE, quotasize);
+            if (protocoltype.equalsIgnoreCase("nfs")) {
+                if (null != ElastistorUtil.ES_BLOCKSIZE_VAL)
+                    createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_BLOCKSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
+                if (null != ElastistorUtil.ES_BLOCKSIZE_VAL)
+                    createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_RECORDSIZE, ElastistorUtil.ES_BLOCKSIZE_VAL);
+            } else {
+                if (null != ElastistorUtil.ES_BLOCKSIZE_VAL)
+                    createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_BLOCKSIZE, "512B");
+                if (null != ElastistorUtil.ES_BLOCKSIZE_VAL)
+                    createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_RECORDSIZE, "512B");
+            }
+            if (null != ElastistorUtil.ES_DEDUPLICATION_VAL)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_DEDUPLICATION, ElastistorUtil.ES_DEDUPLICATION_VAL);
+            if (null != ElastistorUtil.ES_SYNC_VAL)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_SYNC, ElastistorUtil.ES_SYNC_VAL);
+            if (null != ElastistorUtil.ES_COMPRESSION_VAL)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_COMPRESSION, ElastistorUtil.ES_COMPRESSION_VAL);
+            // if (null !=
+            // ElastistorUtil.ES_NOOFCOPIES_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_NOOFCOPIES,
+            // ElastistorUtil.ES_NOOFCOPIES_VAL);
             createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_MOUNTPOINT, mountpoint);
-            if (null != ElastistorUtil.ES_CASESENSITIVITY_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_CASESENSITIVITY, ElastistorUtil.ES_CASESENSITIVITY_VAL);
-            if (null != ElastistorUtil.ES_READONLY_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_READONLY, ElastistorUtil.ES_READONLY_VAL);
-            if (null != datasetid)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_DATASETID, datasetid);
-            if (null != ElastistorUtil.ES_UNICODE_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_UNICODE, ElastistorUtil.ES_UNICODE_VAL);
+            // if (null !=
+            // ElastistorUtil.ES_CASESENSITIVITY_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_CASESENSITIVITY,
+            // ElastistorUtil.ES_CASESENSITIVITY_VAL);
+            // if (null !=
+            // ElastistorUtil.ES_READONLY_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_READONLY,
+            // ElastistorUtil.ES_READONLY_VAL);
+            if (null != datasetid)
+                createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_DATASETID, datasetid);
+            // if (null !=
+            // ElastistorUtil.ES_UNICODE_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_UNICODE,
+            // ElastistorUtil.ES_UNICODE_VAL);
             createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_PROTOCOLTYPE, protocoltype);
-            if (null != ElastistorUtil.ES_AUTHNETWORK_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_AUTHNETWORK, ElastistorUtil.ES_AUTHNETWORK_VAL);
-            if (null != ElastistorUtil.ES_MAPUSERSTOROOT_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_MAPUSERSTOROOT, ElastistorUtil.ES_MAPUSERSTOROOT_VAL);
+            // if (null !=
+            // ElastistorUtil.ES_AUTHNETWORK_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_AUTHNETWORK,
+            // ElastistorUtil.ES_AUTHNETWORK_VAL);
+            // if (null !=
+            // ElastistorUtil.ES_MAPUSERSTOROOT_VAL)createVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_MAPUSERSTOROOT,
+            // ElastistorUtil.ES_MAPUSERSTOROOT_VAL);
 
             CreateVolumeCmdResponse createVolumeCmdResponse;
+            FileSystem volume = null;
+            FileSystem fileSystem = null;
+
             try {
-                createVolumeCmdResponse = (CreateVolumeCmdResponse) getElastistorRestClient(s_esIPVAL, s_esAPIKEYVAL).executeCommand(createVolumeCmd);
+                createVolumeCmdResponse = (CreateVolumeCmdResponse) getElastistorRestClient().executeCommand(createVolumeCmd);
 
-                if (createVolumeCmdResponse.getFileSystem().getUuid() == null) {
+                if (createVolumeCmdResponse.getJobid() == null) {
 
                     throw new CloudRuntimeException("creating volume failed , contact elatistor admin");
 
                 } else {
-                    return createVolumeCmdResponse;
-                }
+                    volume = queryAsyncVolumeJobResult(createVolumeCmdResponse.getJobid());
+                    if (volume == null) {
+                        throw new CloudRuntimeException("tsm queryAsync failed , contact elatistor admin");
+                    } else {
+                        if (protocoltype.equalsIgnoreCase("nfs")) {
+                            fileSystem = updateNfsService(volume.getUuid());
 
+                        } else {
+                            fileSystem = updateIscsiService(volume.getUuid());
+                        }
+                    }
+                }
+                return fileSystem;
             } catch (Exception e) {
                 throw new CloudRuntimeException("creating volume failed , contact elatistor admin", e);
             }
@@ -343,107 +465,374 @@ public class ElastistorUtil {
 
     }
 
+    public static FileSystem updateNfsService(String volumeid) throws Throwable {
+
+        FileSystem fileSystem = null;
+
+        String datasetid = updateElastistorNfsVolume(volumeid);
+
+        if (datasetid == null) {
+            throw new CloudRuntimeException("Updating Nfs Volume Failed");
+        } else {
+
+            fileSystem = listVolume(datasetid);
+            if (fileSystem == null) {
+                throw new CloudRuntimeException("Volume Creation failed : List Filesystem failed");
+            }
+        }
+        return fileSystem;
+
+    }
+
+    public static FileSystem updateIscsiService(String volumeid) throws Throwable {
+
+        Volumeiscsioptions volumeiscsioptions = null;
+        FileSystem fileSystem = null;
+        String accountId;
+
+        fileSystem = listVolume(volumeid);
+
+        accountId = fileSystem.getAccountid();
+
+        volumeiscsioptions = updateElastistorIscsiVolume(volumeid, accountId);
+
+        if (volumeiscsioptions == null) {
+            throw new CloudRuntimeException("Updating Iscsi Volume Failed");
+        } else {
+
+            fileSystem = listVolume(volumeiscsioptions.getVolumeid());
+            if (fileSystem == null) {
+                throw new CloudRuntimeException("Volume Creation failed : List Filesystem failed");
+            }
+        }
+        return fileSystem;
+
+    }
+
+    public static String updateElastistorNfsVolume(String volumeid) throws Throwable {
+
+        NfsServiceCmd nfsServiceCmd = new NfsServiceCmd();
+
+        nfsServiceCmd.putCommandParameter("datasetid", volumeid);
+        nfsServiceCmd.putCommandParameter("authnetwork", "all");
+        nfsServiceCmd.putCommandParameter("managedstate", "true");
+        nfsServiceCmd.putCommandParameter("alldirs", "yes");
+        nfsServiceCmd.putCommandParameter("mapuserstoroot", "yes");
+        nfsServiceCmd.putCommandParameter("readonly", "no");
+
+        NfsServiceResponse nfsServiceResponse = (NfsServiceResponse) getElastistorRestClient().executeCommand(nfsServiceCmd);
+
+        if (nfsServiceResponse.getNfsService().getUuid() != null) {
+
+            UpdateControllerCmd controllerCmd = new UpdateControllerCmd();
+
+            controllerCmd.putCommandParameter("nfsid", nfsServiceResponse.getNfsService().getUuid());
+            controllerCmd.putCommandParameter("type", "configurenfs");
+            controllerCmd.putCommandParameter("id", nfsServiceResponse.getNfsService().getControllerid());
+
+            UpdateControllerResponse controllerResponse = (UpdateControllerResponse) getElastistorRestClient().executeCommand(controllerCmd);
+
+            if (controllerResponse.getController().getUuid() != null) {
+                s_logger.info("updated nfs service to ALL");
+                return nfsServiceResponse.getNfsService().getDatasetid();
+            } else {
+                throw new CloudRuntimeException("Updating Nfs Volume Failed");
+            }
+
+        }
+        return null;
+    }
+
+    public static Volumeiscsioptions updateElastistorIscsiVolume(String volumeid, String accountid) throws Throwable {
+
+        // now listing the iscsi volume service group to get iscsi id
+
+        ListVolumeiSCSIServiceCmd listVolumeiSCSIServiceCmd = new ListVolumeiSCSIServiceCmd();
+
+        if (null != volumeid)
+            listVolumeiSCSIServiceCmd.putCommandParameter(ElastistorUtil.REST_PARAM_STORAGEID, volumeid);
+
+        ListVolumeiSCSIServiceResponse volumeiSCSIServiceResponse = (ListVolumeiSCSIServiceResponse) getElastistorRestClient().executeCommand(listVolumeiSCSIServiceCmd);
+
+        String iscsiId = volumeiSCSIServiceResponse.getIscsiVolume().getIscsiVolume(0).getUuid();
+        String AG_Id = volumeiSCSIServiceResponse.getIscsiVolume().getIscsiVolume(0).getAg_id();
+
+        // now listing the initiator group to get initiator id
+
+        ListiSCSIInitiatorCmd initiatorCmd = new ListiSCSIInitiatorCmd();
+
+        if (null != volumeid)
+            initiatorCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ACCOUNTID, accountid);
+
+        ListiSCSIInitiatorResponse initiatorResponse = (ListiSCSIInitiatorResponse) getElastistorRestClient().executeCommand(initiatorCmd);
+
+        String intiatorgroup;
+        String IG_Id;
+        if (initiatorResponse.getIInitiator().getInterface(0).getInitiatorgroup().equalsIgnoreCase("ALL")) {
+            IG_Id = initiatorResponse.getIInitiator().getInterface(0).getUuid();
+        } else {
+            IG_Id = initiatorResponse.getIInitiator().getInterface(1).getUuid();
+        }
+
+        if (iscsiId != null) {
+
+            UpdateVolumeiSCSIServiceCmd updateVolumeiSCSIServiceCmd = new UpdateVolumeiSCSIServiceCmd();
+
+            if (null != volumeid)
+                updateVolumeiSCSIServiceCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ID, iscsiId);
+            if (null != volumeid)
+                updateVolumeiSCSIServiceCmd.putCommandParameter("status", "true");
+            if (null != volumeid)
+                updateVolumeiSCSIServiceCmd.putCommandParameter("igid", IG_Id);
+            if (null != volumeid)
+                updateVolumeiSCSIServiceCmd.putCommandParameter("authgroupid", AG_Id);
+            if (null != volumeid)
+                updateVolumeiSCSIServiceCmd.putCommandParameter("initialdigest", "Auto");
+            if (null != volumeid)
+                updateVolumeiSCSIServiceCmd.putCommandParameter("queuedepth", "32");
+
+            UpdateVolumeiSCSIServiceCmdResponse cmdResponse = (UpdateVolumeiSCSIServiceCmdResponse) getElastistorRestClient().executeCommand(updateVolumeiSCSIServiceCmd);
+
+            if (cmdResponse.getVolumeiscsioptions().getVolumeid() == null) {
+                throw new CloudRuntimeException("Updating Iscsi Volume Failed");
+            }
+            return cmdResponse.getVolumeiscsioptions();
+        }
+        return null;
+
+    }
+
     /**
      * This deletes both the volume and the tsm in elastistor.
      */
-    public static boolean deleteElastistorVolume(String poolip, String esmanagementip, String esapikey) throws Throwable {
+    public static boolean deleteElastistorTsm(String tsmid, boolean managed) throws Throwable {
 
-        String esvolumeid = null;
-        String estsmid = null;
+        if (!managed) {
 
-        ListTsmsResponse listTsmsResponse = listTsm(poolip);
+            s_logger.info("elastistor pool is NOT a managed storage , hence deleting the volume then tsm");
 
-        if (listTsmsResponse.getTsmsCount() != 0) {
-            int i;
+            String esvolumeid = null;
+            String estsmid = null;
 
-            for (i = 0; i < listTsmsResponse.getTsmsCount(); i++) {
-                if (poolip.compareTo(listTsmsResponse.getTsms().getTsm(i).getIpaddress()) == 0) {
-                    estsmid = listTsmsResponse.getTsms().getTsm(i).getUuid();
-                    break;
-                }
-            }
+            ListTsmsResponse listTsmsResponse = listTsm(tsmid);
 
-            if (listTsmsResponse.getTsms().getTsm(i).checkvolume()) {
-                esvolumeid = listTsmsResponse.getTsms().getTsm(i).getVolumeProperties(0).getid();
-                DeleteVolumeResponse deleteVolumeResponse = deleteVolume(esvolumeid, null);
+            if (listTsmsResponse.getTsmsCount() != 0) {
 
-                if (deleteVolumeResponse != null) {
-                    String jobid = deleteVolumeResponse.getJobId();
-                    int jobstatus = queryAsyncJobResult(jobid);
+                if (listTsmsResponse.getTsms().getTsm(0).checkvolume()) {
+                    esvolumeid = listTsmsResponse.getTsms().getTsm(0).getVolumeProperties(0).getid();
+                    DeleteVolumeResponse deleteVolumeResponse = deleteVolume(esvolumeid, null);
 
-                    if (jobstatus == 1) {
-                        s_logger.info("elastistor volume successfully deleted");
-                    } else {
-                        s_logger.info("now farce deleting the volume");
+                    if (deleteVolumeResponse != null) {
+                        String jobid = deleteVolumeResponse.getJobId();
+                        int jobstatus = queryAsyncJobResult(jobid);
 
-                        while (jobstatus != 1) {
-                            DeleteVolumeResponse deleteVolumeResponse1 = deleteVolume(esvolumeid, "true");
+                        if (jobstatus == 1) {
+                            s_logger.info("elastistor volume successfully deleted");
+                        } else {
+                            s_logger.info("now farce deleting the volume");
 
-                            if (deleteVolumeResponse1 != null) {
-                                String jobid1 = deleteVolumeResponse1.getJobId();
-                                jobstatus = queryAsyncJobResult(jobid1);
+                            while (jobstatus != 1) {
+                                DeleteVolumeResponse deleteVolumeResponse1 = deleteVolume(esvolumeid, "true");
+
+                                if (deleteVolumeResponse1 != null) {
+                                    String jobid1 = deleteVolumeResponse1.getJobId();
+                                    jobstatus = queryAsyncJobResult(jobid1);
+                                }
                             }
+                            s_logger.info("elastistor volume successfully deleted");
                         }
-                        s_logger.info("elastistor volume successfully deleted");
                     }
+                } else {
+                    s_logger.info("no volume present in on the given tsm");
                 }
-            } else {
-                s_logger.info("no volume present in on the given tsm");
+
             }
-            s_logger.info("now trying to delete elastistor tsm");
+        }
 
-            if (estsmid != null) {
-                DeleteTsmCmd deleteTsmCmd = new DeleteTsmCmd();
-                deleteTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ID,estsmid);
-                DeleteTsmResponse deleteTsmResponse = (DeleteTsmResponse) getElastistorRestClient(s_esIPVAL, s_esAPIKEYVAL).executeCommand(deleteTsmCmd);
+        s_logger.info("now trying to delete elastistor tsm");
 
-                if (deleteTsmResponse != null) {
-                    String jobstatus = deleteTsmResponse.getJobStatus();
+        if (tsmid != null) {
+            DeleteTsmCmd deleteTsmCmd = new DeleteTsmCmd();
+            deleteTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ID, tsmid);
+            DeleteTsmResponse deleteTsmResponse = (DeleteTsmResponse) getElastistorRestClient().executeCommand(deleteTsmCmd);
 
-                    if (jobstatus.equalsIgnoreCase("true")) {
-                        s_logger.info("deletion of elastistor tsm successful");
-                        return true;
-                    } else {
-                        s_logger.info("failed to delete elastistor tsm");
-                        return false;
-                    }
+            if (deleteTsmResponse != null) {
+                String jobstatus = deleteTsmResponse.getJobStatus();
+
+                if (jobstatus.equalsIgnoreCase("true")) {
+                    s_logger.info("deletion of elastistor tsm successful");
+                    return true;
                 } else {
-                    s_logger.info("elastistor tsm id not present");
+                    s_logger.info("failed to delete elastistor tsm");
+                    return false;
                 }
+            } else {
+                s_logger.info("elastistor tsm id not present");
             }
-            else {
-                s_logger.error("no volume is present in the tsm");
+        }
+        s_logger.info("tsm id is null");
+        return false;
+
+        /*
+         * else { s_logger.error("no volume is present in the tsm"); } } else {
+         * s_logger.error(
+         * "List tsm failed, no tsm present in the eastistor for the given IP "
+         * ); return false; } return false;
+         */
+
+    }
+
+    public static boolean deleteElastistorVolume(String esvolumeid) throws Throwable {
+
+        FileSystem fileSystem = listVolume(esvolumeid);
+
+        if (fileSystem != null) {
+            DeleteVolumeResponse deleteVolumeResponse = deleteVolume(esvolumeid, null);
+
+            if (deleteVolumeResponse != null) {
+                String jobid = deleteVolumeResponse.getJobId();
+                int jobstatus = queryAsyncJobResult(jobid);
+
+                if (jobstatus == 1) {
+                    s_logger.info("elastistor volume successfully deleted");
+                    return true;
+                } else {
+                    s_logger.info("now force deleting the volume");
+
+                    while (jobstatus != 1) {
+                        DeleteVolumeResponse deleteVolumeResponse1 = deleteVolume(esvolumeid, "true");
+
+                        if (deleteVolumeResponse1 != null) {
+                            String jobid1 = deleteVolumeResponse1.getJobId();
+                            jobstatus = queryAsyncJobResult(jobid1);
+                        }
+                    }
+                    s_logger.info("elastistor volume successfully deleted");
+                    return true;
+                }
+            } else {
+                s_logger.info("the given volume is not present on elastistor, datasetrespone is NULL");
+                return false;
             }
         } else {
-            s_logger.error("List tsm failed, no tsm present in the eastistor for the given IP ");
+            s_logger.info("the given volume is not present on elastistor");
             return false;
         }
-        return false;
+
+    }
+
+    /**
+     * This give a json response containing the list of Interface's in
+     * elastistor.
+     */
+
+    public static ListInterfacesResponse ListElastistorInterfaces(String controllerid) throws Throwable {
+
+        ListInterfacesCmd listInterfacesCmd = new ListInterfacesCmd();
+        listInterfacesCmd.putCommandParameter("controllerid", controllerid);
+
+        ListInterfacesResponse interfacesResponse = (ListInterfacesResponse) getElastistorRestClient().executeCommand(listInterfacesCmd);
+
+        if (interfacesResponse != null && interfacesResponse.getInterfaces() != null) {
+            return interfacesResponse;
+        } else {
+            throw new CloudRuntimeException("There are no elastistor interfaces.");
+        }
+    }
+
+    /**
+     * This give a json response containing the list of Accounts's in
+     * elastistor.
+     */
+
+    public static CreateAccountResponse createElastistorAccount(String domainName) throws Throwable {
+
+        CreateAccountCmd createAccountCmd = new CreateAccountCmd();
+
+        createAccountCmd.putCommandParameter("name", domainName);
+        CreateAccountResponse createAccountResponse = (CreateAccountResponse) getElastistorRestClient().executeCommand(createAccountCmd);
+
+        if (createAccountResponse != null) {
+            return createAccountResponse;
+        } else {
+            throw new CloudRuntimeException("Creating Elastistor Account failed");
+        }
+
+    }
+
+    /**
+     * This give a json response containing the list of Accounts's in
+     * elastistor.
+     */
+
+    public static ListAccountResponse ListElastistorAccounts() throws Throwable {
+
+        ListAccountsCmd listAccountsCmd = new ListAccountsCmd();
+
+        ListAccountResponse accountResponse = (ListAccountResponse) getElastistorRestClient().executeCommand(listAccountsCmd);
+
+        if (accountResponse != null) {
+            return accountResponse;
+        } else {
+            throw new CloudRuntimeException("List Elastistor Account failed");
+        }
+
+    }
+
+    /**
+     * This give a json response containing the list of Pool's in elastistor.
+     */
+
+    public static ListPoolsResponse ListElastistorPools() throws Throwable {
+
+        ListPoolsCmd listPoolsCmd = new ListPoolsCmd();
+
+        ListPoolsResponse listPoolsResponse = (ListPoolsResponse) getElastistorRestClient().executeCommand(listPoolsCmd);
+
+        if (listPoolsResponse != null) {
+            return listPoolsResponse;
+        } else {
+            throw new CloudRuntimeException("List Elastistor pool failed");
+        }
 
     }
 
     /**
      * This give a json response containing the list of tsm's in elastistor.
      */
-    private static ListTsmsResponse listTsm(String poolip) throws Throwable {
+    private static ListTsmsResponse listTsm(String uuid) throws Throwable {
 
         ListTsmCmd listTsmCmd = new ListTsmCmd();
 
-        listTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_IPADDRESS,poolip);
+        listTsmCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ID, uuid);
 
-        ListTsmsResponse listTsmsResponse = (ListTsmsResponse) getElastistorRestClient(s_esIPVAL, s_esAPIKEYVAL).executeCommand(listTsmCmd);
+        ListTsmsResponse listTsmsResponse = (ListTsmsResponse) getElastistorRestClient().executeCommand(listTsmCmd);
 
         return listTsmsResponse;
     }
 
-    private static DeleteVolumeResponse deleteVolume(String esvolumeid, String forcedelete)throws Throwable {
+    /**
+     * This give a json response containing the list of Volume in elastistor.
+     */
+    public static FileSystem listVolume(String uuid) throws Throwable {
+
+        ListFileSystemCmd listFileSystemCmd = new ListFileSystemCmd();
+
+        listFileSystemCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ID, uuid);
+
+        ListFileSystemResponse listFileSystemResponse = (ListFileSystemResponse) getElastistorRestClient().executeCommand(listFileSystemCmd);
+
+        return listFileSystemResponse.getFilesystems().getFileSystem(0);
+    }
+
+    private static DeleteVolumeResponse deleteVolume(String esvolumeid, String forcedelete) throws Throwable {
 
         DeleteVolumeCmd deleteVolumeCmd = new DeleteVolumeCmd();
 
-        deleteVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ID,esvolumeid);
+        deleteVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_ID, esvolumeid);
         deleteVolumeCmd.putCommandParameter(ElastistorUtil.REST_PARAM_FORECEDELETE, forcedelete);
 
-        DeleteVolumeResponse deleteVolumeResponse = (DeleteVolumeResponse) getElastistorRestClient(s_esIPVAL, s_esAPIKEYVAL).executeCommand(deleteVolumeCmd);
+        DeleteVolumeResponse deleteVolumeResponse = (DeleteVolumeResponse) getElastistorRestClient().executeCommand(deleteVolumeCmd);
 
         return deleteVolumeResponse;
     }
@@ -451,7 +840,7 @@ public class ElastistorUtil {
     private static int queryAsyncJobResult(String jobid) throws Throwable {
 
         QueryAsyncJobResultCmd asyncJobResultCmd = new QueryAsyncJobResultCmd();
-        ElastiCenterClient restclient = getElastistorRestClient(s_esIPVAL, s_esAPIKEYVAL);
+        ElastiCenterClient restclient = getElastistorRestClient();
 
         asyncJobResultCmd.putCommandParameter(ElastistorUtil.REST_PARAM_JOBID, jobid);
 
@@ -472,20 +861,76 @@ public class ElastistorUtil {
 
     }
 
-     /**
-     * this method converts the long capacitybytes to string format, which is feasible for elastistor rest api
-     * 214748364800 = 200G.
+    private static Tsm queryAsyncTsmJobResult(String jobid) throws Throwable {
+
+        QueryAsyncJobResultCmd asyncJobResultCmd = new QueryAsyncJobResultCmd();
+        ElastiCenterClient restclient = getElastistorRestClient();
+
+        asyncJobResultCmd.putCommandParameter(ElastistorUtil.REST_PARAM_JOBID, jobid);
+
+        QueryAsyncJobResultResponse asyncJobResultResponse = (QueryAsyncJobResultResponse) restclient.executeCommand(asyncJobResultCmd);
+
+        if (asyncJobResultResponse != null) {
+            int jobstatus = asyncJobResultResponse.getAsync().getJobStatus();
+            Tsm tsm = null;
+            while (jobstatus == 0) {
+
+                asyncJobResultResponse = (QueryAsyncJobResultResponse) restclient.executeCommand(asyncJobResultCmd);
+
+                jobstatus = asyncJobResultResponse.getAsync().getJobStatus();
+
+            }
+            if (jobstatus == 1) {
+                tsm = asyncJobResultResponse.getAsync().getJobResult().getTsm();
+                return tsm;
+            }
+        }
+        return null;
+
+    }
+
+    private static FileSystem queryAsyncVolumeJobResult(String jobid) throws Throwable {
+
+        QueryAsyncJobResultCmd asyncJobResultCmd = new QueryAsyncJobResultCmd();
+        ElastiCenterClient restclient = getElastistorRestClient();
+
+        asyncJobResultCmd.putCommandParameter(ElastistorUtil.REST_PARAM_JOBID, jobid);
+
+        QueryAsyncJobResultResponse asyncJobResultResponse = (QueryAsyncJobResultResponse) restclient.executeCommand(asyncJobResultCmd);
+
+        if (asyncJobResultResponse != null) {
+            int jobstatus = asyncJobResultResponse.getAsync().getJobStatus();
+            FileSystem volume = null;
+            while (jobstatus == 0) {
+
+                asyncJobResultResponse = (QueryAsyncJobResultResponse) restclient.executeCommand(asyncJobResultCmd);
+
+                jobstatus = asyncJobResultResponse.getAsync().getJobStatus();
+
+            }
+            if (jobstatus == 1) {
+                volume = asyncJobResultResponse.getAsync().getJobResult().getVolume();
+                return volume;
+            }
+        }
+        return null;
+
+    }
+
+    /**
+     * this method converts the long capacitybytes to string format, which is
+     * feasible for elastistor rest api 214748364800 = 200G.
      */
-    private static String convertCapacityBytes(Long capacityBytes){
+    private static String convertCapacityBytes(Long capacityBytes) {
 
         String quotasize;
 
-        if((1099511627776L)>capacityBytes &&(capacityBytes>(1073741824))){
-           return quotasize =(String.valueOf(capacityBytes/(1024*1024*1024))+"G");
-        }else
-        {   int temp1 = (int) (capacityBytes/(1024*1024*1024));
-            int temp2  = temp1/1024;
-            return  quotasize =(String.valueOf(temp2)+"T");
+        if ((1099511627776L) > capacityBytes && (capacityBytes > (1073741824))) {
+            return quotasize = (String.valueOf(capacityBytes / (1024 * 1024 * 1024)) + "G");
+        } else {
+            int temp1 = (int) (capacityBytes / (1024 * 1024 * 1024));
+            int temp2 = temp1 / 1024;
+            return quotasize = (String.valueOf(temp2) + "T");
         }
     }
 
@@ -500,8 +945,8 @@ public class ElastistorUtil {
          * Utility method to allow the client to validate the input parameters
          * before sending to the ElastiCenter.
          *
-         * This command will be executed by the ElastiCenterClient only this method
-         * returns true.
+         * This command will be executed by the ElastiCenterClient only this
+         * method returns true.
          */
         public boolean validate();
 
@@ -509,7 +954,8 @@ public class ElastistorUtil {
          * Returns the query parameters that have to be passed to execute the
          * command.
          *
-         * Returns null if there are query parameters associated with the command
+         * Returns null if there are query parameters associated with the
+         * command
          */
         public MultivaluedMap<String, String> getCommandParameters();
 
@@ -573,11 +1019,13 @@ public class ElastistorUtil {
 
     }
 
-/**
- * this is a rest client which is used to call the http rest calls to elastistor
- * @author punith
- *
- */
+    /**
+     * this is a rest client which is used to call the http rest calls to
+     * elastistor
+     *
+     * @author punith
+     *
+     */
     private static final class ElastiCenterClient {
 
         public static boolean debug = false;
@@ -597,38 +1045,36 @@ public class ElastistorUtil {
         private String queryparamapikey = "apikey";
         private String queryparamresponse = "response";
 
-        public ElastiCenterClient(String address, String key)throws InvalidCredentialsException, InvalidParameterException,SSLHandshakeException, ServiceUnavailableException {
+        public ElastiCenterClient(String address, String key) throws InvalidCredentialsException, InvalidParameterException, SSLHandshakeException, ServiceUnavailableException {
             this.elastiCenterAddress = address;
             this.apiKey = key;
             this.initialize();
         }
 
-        public void initialize() throws InvalidParameterException,
-                SSLHandshakeException, InvalidCredentialsException,
-                ServiceUnavailableException {
+        public void initialize() throws InvalidParameterException, SSLHandshakeException, InvalidCredentialsException, ServiceUnavailableException {
 
             if (apiKey == null || apiKey.trim().isEmpty()) {
                 throw new InvalidParameterException("Unable to initialize. Please specify a valid API Key.");
             }
 
             if (elastiCenterAddress == null || elastiCenterAddress.trim().isEmpty()) {
-                // TODO : Validate the format, like valid IP address or hostname.
+                // TODO : Validate the format, like valid IP address or
+                // hostname.
                 throw new InvalidParameterException("Unable to initialize. Please specify a valid ElastiCenter IP Address or Hostname.");
             }
 
             if (ignoreSSLCertificate) {
-                // Create a trust manager that does not validate certificate chains
+                // Create a trust manager that does not validate certificate
+                // chains
                 TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                     public X509Certificate[] getAcceptedIssuers() {
                         return null;
                     }
 
-                    public void checkClientTrusted(X509Certificate[] certs,
-                            String authType) {
+                    public void checkClientTrusted(X509Certificate[] certs, String authType) {
                     }
 
-                    public void checkServerTrusted(X509Certificate[] certs,
-                            String authType) {
+                    public void checkServerTrusted(X509Certificate[] certs, String authType) {
                     }
                 } };
 
@@ -662,15 +1108,11 @@ public class ElastistorUtil {
                 } else if (t instanceof ServiceUnavailableException) {
                     throw (ServiceUnavailableException) t;
                 } else if (t.getCause() instanceof SSLHandshakeException) {
-                    throw new SSLHandshakeException(
-                            "Unable to initialize. An untrusted SSL Certificate was received from "
-                                    + elastiCenterAddress
-                                    + ". Please verify your truststore or configure ElastiCenterClient to skip the SSL Validation. ");
+                    throw new SSLHandshakeException("Unable to initialize. An untrusted SSL Certificate was received from " + elastiCenterAddress
+                            + ". Please verify your truststore or configure ElastiCenterClient to skip the SSL Validation. ");
                 } else if (t.getCause() instanceof ConnectException) {
-                    throw new ServiceUnavailableException(
-                            "Unable to initialize. Failed to connect to "
-                                    + elastiCenterAddress
-                                    + ". Please verify the IP Address, Network Connectivity and ensure that Services are running on the ElastiCenter Server. ");
+                    throw new ServiceUnavailableException("Unable to initialize. Failed to connect to " + elastiCenterAddress
+                            + ". Please verify the IP Address, Network Connectivity and ensure that Services are running on the ElastiCenter Server. ");
                 }
                 throw new ServiceUnavailableException("Unable to initialize. Please contact your ElastiCenter Administrator. Exception " + t.getMessage());
             }
@@ -683,10 +1125,10 @@ public class ElastistorUtil {
         }
 
         public Object executeCommand(ElastiCenterCommand cmd) throws Throwable {
-            return executeCommand(cmd.getCommandName(), cmd.getCommandParameters(),cmd.getResponseObject());
+            return executeCommand(cmd.getCommandName(), cmd.getCommandParameters(), cmd.getResponseObject());
         }
 
-        public Object executeCommand(String command,MultivaluedMap<String, String> params, Object responeObj) throws Throwable {
+        public Object executeCommand(String command, MultivaluedMap<String, String> params, Object responeObj) throws Throwable {
 
             if (!initialized) {
                 throw new IllegalStateException("Error : ElastiCenterClient is not initialized.");
@@ -713,7 +1155,7 @@ public class ElastistorUtil {
                     }
                 }
                 if (debug) {
-                    System.out.println("Command Sent " + command + " : "+ queryParams);
+                    System.out.println("Command Sent " + command + " : " + queryParams);
                 }
                 ClientResponse response = webResource.queryParams(queryParams).accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
 
@@ -746,8 +1188,8 @@ public class ElastistorUtil {
     }
 
     /**
-     * these are the list of Elastistor rest commands being called from the plugin.
-     *
+     * these are the list of Elastistor rest commands being called from the
+     * plugin.
      */
     private static final class CreateTsmCmd extends BaseCommand {
 
@@ -777,54 +1219,151 @@ public class ElastistorUtil {
 
     }
 
-    private static final class DeleteTsmCmd extends BaseCommand {
+    private static final class ListVolumeiSCSIServiceCmd extends BaseCommand {
+
+        public ListVolumeiSCSIServiceCmd() {
+            super("listVolumeiSCSIService", new ListVolumeiSCSIServiceResponse());
 
-        public DeleteTsmCmd() {
-            super("deleteTsm", new DeleteTsmResponse());
         }
 
     }
 
-   private static final class DeleteVolumeCmd extends BaseCommand {
+    private static final class ListiSCSIInitiatorCmd extends BaseCommand {
+
+        public ListiSCSIInitiatorCmd() {
+            super("listiSCSIInitiator", new ListiSCSIInitiatorResponse());
 
-        public DeleteVolumeCmd() {
-            super("deleteFileSystem", new DeleteVolumeResponse());
         }
 
     }
 
-   private static final class QueryAsyncJobResultCmd extends BaseCommand {
+    private static final class NfsServiceCmd extends BaseCommand {
 
-       public QueryAsyncJobResultCmd() {
-           super("queryAsyncJobResult", new QueryAsyncJobResultResponse());
-       }
+        public NfsServiceCmd() {
+            super("nfsService", new NfsServiceResponse());
 
-   }
+        }
 
-   private static final class ListTsmCmd extends BaseCommand {
+    }
 
-       public ListTsmCmd() {
-           super("listTsm", new ListTsmsResponse());
-       }
+    private static final class UpdateControllerCmd extends BaseCommand {
 
-   }
+        public UpdateControllerCmd() {
+            super("updateController", new UpdateControllerResponse());
 
-   /**
-    * these are the list of Elastistor rest json response classes for parsing the json response sent by elastistor.
-    *
-    */
-   public static final class CreateTsmCmdResponse {
+        }
 
-        @SerializedName("createTsmResponse")
-        private TsmWrapper tsmWrapper;
+    }
+
+    private static final class UpdateVolumeiSCSIServiceCmd extends BaseCommand {
+
+        public UpdateVolumeiSCSIServiceCmd() {
+            super("updateVolumeiSCSIService", new UpdateVolumeiSCSIServiceCmdResponse());
 
-        public Tsm getTsm() {
-            return tsmWrapper.getTsm();
         }
 
     }
 
-    public static final class Tsm {
+    private static final class DeleteTsmCmd extends BaseCommand {
+
+        public DeleteTsmCmd() {
+            super("deleteTsm", new DeleteTsmResponse());
+        }
+
+    }
+
+    private static final class DeleteVolumeCmd extends BaseCommand {
+
+        public DeleteVolumeCmd() {
+            super("deleteFileSystem", new DeleteVolumeResponse());
+        }
+
+    }
+
+    private static final class QueryAsyncJobResultCmd extends BaseCommand {
+
+        public QueryAsyncJobResultCmd() {
+            super("queryAsyncJobResult", new QueryAsyncJobResultResponse());
+        }
+
+    }
+
+    private static final class ListTsmCmd extends BaseCommand {
+
+        public ListTsmCmd() {
+            super("listTsm", new ListTsmsResponse());
+        }
+
+    }
+
+    private static final class ListFileSystemCmd extends BaseCommand {
+
+        public ListFileSystemCmd() {
+            super("listFileSystem", new ListFileSystemResponse());
+        }
+
+    }
+
+    private static final class ListAccountsCmd extends BaseCommand {
+
+        public ListAccountsCmd() {
+            super("listAccount", new ListAccountResponse());
+        }
+
+    }
+
+    private static final class CreateAccountCmd extends BaseCommand {
+
+        public CreateAccountCmd() {
+            super("createAccount", new CreateAccountResponse());
+        }
+
+    }
+
+    private static final class ListInterfacesCmd extends BaseCommand {
+
+        public ListInterfacesCmd() {
+            super("listSharedNICs", new ListInterfacesResponse());
+        }
+
+    }
+
+    private static final class ListPoolsCmd extends BaseCommand {
+
+        public ListPoolsCmd() {
+            super("listHAPool", new ListPoolsResponse());
+        }
+
+    }
+
+    /**
+     * these are the list of Elastistor rest json response classes for parsing
+     * the json response sent by elastistor.
+     *
+     */
+    public static final class CreateTsmCmdResponse {
+
+        @SerializedName("addTsmResponse")
+        private JobId jobId;
+
+        public String getJobid() {
+            return jobId.getJobid();
+        }
+
+        public String getJobStatus() {
+            return jobId.getJobStatus();
+        }
+
+        @SerializedName("createTsmResponse")
+        private TsmWrapper tsmWrapper;
+
+        public Tsm getTsm() {
+            return tsmWrapper.getTsm();
+        }
+
+    }
+
+    public static final class Tsm {
 
         @SerializedName("id")
         private String uuid;
@@ -859,10 +1398,9 @@ public class ElastistorUtil {
 
         public boolean checkvolume() {
 
-            if(volumeProperties != null){
+            if (volumeProperties != null) {
                 return true;
-            }
-            else{
+            } else {
                 return false;
             }
 
@@ -970,8 +1508,152 @@ public class ElastistorUtil {
         }
     }
 
+    public static final class UpdateVolumeiSCSIServiceCmdResponse {
+
+        @SerializedName("updatingvolumeiscsidetails")
+        private VolumeiSCSIServiceWrapper volumeiSCSIServiceWrapper;
+
+        public Volumeiscsioptions getVolumeiscsioptions() {
+
+            return volumeiSCSIServiceWrapper.getVolumeiscsioptions();
+        }
+
+    }
+
+    public static final class VolumeiSCSIServiceWrapper {
+
+        @SerializedName("viscsioptions")
+        private Volumeiscsioptions viscsioptions;
+
+        public Volumeiscsioptions getVolumeiscsioptions() {
+            return viscsioptions;
+        }
+
+    }
+
+    public static final class Volumeiscsioptions {
+
+        @SerializedName("id")
+        private String uuid;
+
+        @SerializedName("volume_id")
+        private String volumeid;
+
+        @SerializedName("iqnname")
+        private String iqnname;
+
+        public String getUuid() {
+            return uuid;
+        }
+
+        public String getVolumeid() {
+            return volumeid;
+        }
+
+        public String getIqn() {
+            return iqnname;
+        }
+
+    }
+
+    public static final class NfsServiceResponse {
+
+        @SerializedName("nfsserviceprotocolresponse")
+        private NfsServiceWrapper nfsServiceWrapper;
+
+        public NfsService getNfsService() {
+
+            return nfsServiceWrapper.getNfsservice();
+        }
+
+    }
+
+    public static final class NfsServiceWrapper {
+
+        @SerializedName("nfs")
+        private NfsService nfsService;
+
+        public NfsService getNfsservice() {
+            return nfsService;
+        }
+
+    }
+
+    public static final class NfsService {
+
+        @SerializedName("id")
+        private String uuid;
+
+        @SerializedName("STORAGEID")
+        private String datasetid;
+
+        @SerializedName("controllerid")
+        private String controllerid;
+
+        @SerializedName("authnetwork")
+        private String authnetwork;
+
+        public String getUuid() {
+            return uuid;
+        }
+
+        public String getDatasetid() {
+            return datasetid;
+        }
+
+        public String getControllerid() {
+            return controllerid;
+        }
+
+        public String getAuthnetwork() {
+            return authnetwork;
+        }
+
+    }
+
+    public static final class UpdateControllerResponse {
+
+        @SerializedName("updateControllerResponse")
+        private UpdateControllerWrapper controllerWrapper;
+
+        public Controller getController() {
+
+            return controllerWrapper.getController();
+        }
+
+    }
+
+    public static final class UpdateControllerWrapper {
+
+        @SerializedName("controller")
+        private Controller controller;
+
+        public Controller getController() {
+            return controller;
+        }
+
+    }
+
+    public static final class Controller {
+
+        @SerializedName("id")
+        private String uuid;
+
+        public String getUuid() {
+            return uuid;
+        }
+
+    }
+
     public static final class CreateVolumeCmdResponse {
 
+        @SerializedName("createvolumeresponse")
+        private JobId jobId;
+
+        public String getJobid() {
+            return jobId.getJobid();
+        }
+
         @SerializedName("adddatasetresponse")
         private FileSystemWrapper fileSystemWrapper;
 
@@ -1004,33 +1686,86 @@ public class ElastistorUtil {
         @SerializedName("quota")
         private String quota;
 
-        @SerializedName("timestamp")
-        private String timestamp;
+        @SerializedName("accountid")
+        private String accountid;
 
         @SerializedName("iqnname")
         private String iqnname;
 
-        @SerializedName("filesystemproperties")
-        private HashMap<String, String>[] filesystemproperties;
+        @SerializedName("nfsenabled")
+        private String nfsenabled;
+
+        @SerializedName("iscsienabled")
+        private String iscsienabled;
+
+        @SerializedName("path")
+        private String path;
+
+        @SerializedName("groupid")
+        private String groupid;
+
+        @SerializedName("compression")
+        private String compression;
+
+        @SerializedName("sync")
+        private String sync;
+
+        @SerializedName("deduplication")
+        private String deduplication;
+
+        @SerializedName("graceallowed")
+        private String graceallowed;
+
+        public String getCompression() {
+            return compression;
+        }
+
+        public String getSync() {
+            return sync;
+        }
+
+        public String getDeduplication() {
+            return deduplication;
+        }
+
+        public String getGraceallowed() {
+            return graceallowed;
+        }
 
         public String getUuid() {
-          return uuid;
-       }
+            return uuid;
+        }
+
+        public String getQosGroupid() {
+            return groupid;
+        }
 
         public String getName() {
-          return name;
+            return name;
+        }
+
+        public String getNfsenabled() {
+            return nfsenabled;
+        }
+
+        public String getIscsienabled() {
+            return iscsienabled;
+        }
+
+        public String getPath() {
+            return path;
         }
 
         public String getIqn() {
-          return iqnname;
+            return iqnname;
         }
 
         public String getQuota() {
-          return quota;
+            return quota;
         }
 
-        public String getTimestamp() {
-          return timestamp;
+        public String getAccountid() {
+            return accountid;
         }
 
     }
@@ -1054,6 +1789,27 @@ public class ElastistorUtil {
         @SerializedName("success")
         private String jobStatus;
 
+        @SerializedName("jobresult")
+        private JobResult jobresult;
+
+        @SerializedName("tsm")
+        private Tsm tsm;
+
+        @SerializedName("storage")
+        private FileSystem volume;
+
+        public Tsm getTsm() {
+            return tsm;
+        }
+
+        public FileSystem getVolume() {
+            return volume;
+        }
+
+        public JobResult getJobResult() {
+            return jobresult;
+        }
+
         public String getJobid() {
             return jobid;
         }
@@ -1064,93 +1820,789 @@ public class ElastistorUtil {
 
     }
 
-   public static final class DeleteVolumeResponse {
+    public static final class JobResult {
+
+        @SerializedName("tsm")
+        private Tsm tsm;
+
+        @SerializedName("storage")
+        private FileSystem volume;
+
+        public Tsm getTsm() {
+            return tsm;
+        }
+
+        public FileSystem getVolume() {
+            return volume;
+        }
+
+    }
+
+    public static final class DeleteVolumeResponse {
 
-       @SerializedName("deleteFileSystemResponse")
-       private JobId jobId;
+        @SerializedName("deleteFileSystemResponse")
+        private JobId jobId;
+
+        public String getJobId() {
+            return jobId.getJobid();
+        }
+
+    }
+
+    public static final class ListCapabilitiesResponse {
+
+        @SerializedName("listcapabilitiesresponse")
+        private Capabilities capabilities;
+
+        public Capabilities getCapabilities() {
+            return capabilities;
+        }
+    }
+
+    public static final class ListFileSystemResponse {
+
+        @SerializedName("listFilesystemResponse")
+        private Filesystems filesystems;
 
-       public String getJobId() {
-           return jobId.getJobid();
-       }
+        public int getFilesystemCount() {
+            return filesystems.getCount();
+        }
 
-   }
+        public Filesystems getFilesystems() {
+            return filesystems;
+        }
+    }
 
-   public static final class ListCapabilitiesResponse {
+    public static final class Filesystems {
 
-       @SerializedName("listcapabilitiesresponse")
-       private Capabilities capabilities;
+        @SerializedName("count")
+        private int count;
 
-       public Capabilities getCapabilities() {
-           return capabilities;
-       }
-   }
+        @SerializedName("filesystem")
+        private FileSystem[] fileSystems;
 
-   public static final class ListTsmsResponse {
+        public int getCount() {
+            return count;
+        }
 
-       @SerializedName("listTsmResponse")
-       private Tsms tsms;
+        public FileSystem getFileSystem(int i) {
+            return fileSystems[i];
+        }
+    }
 
-       public int getTsmsCount() {
-           return tsms.getCount();
-       }
+    public static final class ListPoolsResponse {
 
-       public Tsms getTsms() {
-           return tsms;
-       }
-   }
+        @SerializedName("listHAPoolResponse")
+        private Pools pools;
 
-   public static final class Tsms {
+        public Pools getPools() {
+            return pools;
+        }
+    }
 
-       @SerializedName("count")
-       private int count;
+    public static final class Pools {
 
-       @SerializedName("listTsm")
-       private Tsm[] tsms;
+        @SerializedName("hapool")
+        private Pool[] pool;
 
-       public int getCount() {
-           return count;
-       }
+        @SerializedName("count")
+        private int count;
 
-       public Tsm getTsm(int i) {
-           return tsms[i];
-       }
-   }
+        public Pool getPool(int i) {
+            return pool[i];
+        }
 
-   public static final class QueryAsyncJobResultResponse {
+        public int getCount() {
+            return count;
+        }
+    }
 
-       @SerializedName("queryasyncjobresultresponse")
-       private Async async;
+    public static final class Pool {
 
-       public Async getAsync() {
-           return async;
-       }
-   }
+        @SerializedName("id")
+        private String uuid;
 
-   public static final class Async {
+        @SerializedName("name")
+        private String name;
 
-       @SerializedName("jobstatus")
-       private int jobstatus;
+        @SerializedName("currentAvailableSpace")
+        private String currentAvailableSpace;
 
-       @SerializedName("cmd")
-       private String cmd;
+        @SerializedName("availIOPS")
+        private String availIOPS;
 
-       public int getJobStatus() {
-           return jobstatus;
-       }
+        @SerializedName("status")
+        private String state;
 
-       public String getCmd() {
-           return cmd;
-       }
+        @SerializedName("controllerid")
+        private String controllerid;
 
-   }
+        @SerializedName("gateway")
+        private String gateway;
 
-   public static final class Capabilities {
+        public String getControllerid() {
+            return controllerid;
+        }
 
-       @SerializedName("capability")
-       private HashMap<String, String> capabilites;
+        public String getUuid() {
+            return uuid;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getAvailableSpace() {
+            return currentAvailableSpace;
+        }
+
+        public String getAvailIOPS() {
+            return availIOPS;
+        }
+
+        public String getState() {
+            return state;
+        }
+
+        public String getGateway() {
+            return gateway;
+        }
+    }
+
+    public static final class ListInterfacesResponse {
+
+        @SerializedName("listSharedNICsResponse")
+        private Interfaces interfaces;
+
+        public Interfaces getInterfaces() {
+            return interfaces;
+        }
+    }
+
+    public static final class Interfaces {
+
+        @SerializedName("nic")
+        private Interface[] interfaces;
+
+        @SerializedName("count")
+        private int count;
+
+        public Interface getInterface(int i) {
+            return interfaces[i];
+        }
+
+        public int getCount() {
+            return count;
+        }
+    }
+
+    public static final class Interface {
+
+        @SerializedName("id")
+        private String uuid;
+
+        @SerializedName("name")
+        private String name;
+
+        @SerializedName("status")
+        private String status;
+
+        public String getUuid() {
+            return uuid;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+    }
+
+    public static final class ListiSCSIInitiatorResponse {
+
+        @SerializedName("listInitiatorsResponse")
+        private Initiators initiators;
+
+        public Initiators getIInitiator() {
+            return initiators;
+        }
+    }
+
+    public static final class Initiators {
+
+        @SerializedName("initiator")
+        private Initiator[] initiators;
+
+        @SerializedName("count")
+        private int count;
+
+        public Initiator getInterface(int i) {
+            return initiators[i];
+        }
+
+        public int getCount() {
+            return count;
+        }
+    }
+
+    public static final class Initiator {
+
+        @SerializedName("id")
+        private String uuid;
+
+        @SerializedName("name")
+        private String name;
+
+        @SerializedName("initiatorgroup")
+        private String initiatorgroup;
+
+        public String getUuid() {
+            return uuid;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getInitiatorgroup() {
+            return initiatorgroup;
+        }
+    }
+
+    public static final class ListAccountResponse {
+
+        @SerializedName("listAccountResponse")
+        private Accounts accounts;
+
+        public Accounts getAccounts() {
+            return accounts;
+        }
+    }
+
+    public static final class Accounts {
+
+        @SerializedName("account")
+        private Account[] Accounts;
+
+        @SerializedName("count")
+        private int count;
+
+        public Account getAccount(int i) {
+            return Accounts[i];
+        }
+
+        public int getCount() {
+            return count;
+        }
+    }
+
+    public static final class CreateAccountResponse {
+
+        @SerializedName("createaccountresponse")
+        private Accounts2 accounts;
+
+        public Account getAccount() {
+            return accounts.getAccount();
+        }
+    }
+
+    public static final class Accounts2 {
+
+        @SerializedName("account2")
+        private Account Account;
+
+        @SerializedName("count")
+        private int count;
+
+        public Account getAccount() {
+            return Account;
+        }
+
+        public int getCount() {
+            return count;
+        }
+    }
+
+    public static final class Account {
+
+        @SerializedName("id")
+        private String uuid;
+
+        @SerializedName("name")
+        private String name;
+
+        public String getUuid() {
+            return uuid;
+        }
+
+        public String getName() {
+            return name;
+        }
+    }
+
+    public static final class ListTsmsResponse {
+
+        @SerializedName("listTsmResponse")
+        private Tsms tsms;
+
+        public int getTsmsCount() {
+            return tsms.getCount();
+        }
+
+        public Tsms getTsms() {
+            return tsms;
+        }
+    }
+
+    public static final class Tsms {
+
+        @SerializedName("count")
+        private int count;
+
+        @SerializedName("listTsm")
+        private Tsm[] tsms;
+
+        public int getCount() {
+            return count;
+        }
+
+        public Tsm getTsm(int i) {
+            return tsms[i];
+        }
+    }
+
+    public static final class ListVolumeiSCSIServiceResponse {
+
+        @SerializedName("listVolumeiSCSIServiceResponse")
+        private IscsiVolumeService iscsiVolumes;
+
+        public int getVolumeCount() {
+            return iscsiVolumes.getCount();
+        }
+
+        public IscsiVolumeService getIscsiVolume() {
+            return iscsiVolumes;
+        }
+    }
+
+    public static final class IscsiVolumeService {
+
+        @SerializedName("count")
+        private int count;
+
+        @SerializedName("iSCSIService")
+        private IscsiVolume[] iscsiVolumes;
+
+        public int getCount() {
+            return count;
+        }
+
+        public IscsiVolume getIscsiVolume(int i) {
+            return iscsiVolumes[i];
+        }
+    }
+
+    public static final class IscsiVolume {
+
+        @SerializedName("id")
+        private String uuid;
+
+        @SerializedName("ag_id")
+        private String agid;
+
+        @SerializedName("ig_id")
+        private String igid;
+
+        public String getAg_id() {
+            return agid;
+        }
+
+        public String getUuid() {
+            return uuid;
+        }
+
+        public String getIg_id() {
+            return igid;
+        }
+    }
+
+    public static final class QueryAsyncJobResultResponse {
+
+        @SerializedName("queryasyncjobresultresponse")
+        private Async async;
+
+        public Async getAsync() {
+            return async;
+        }
+    }
+
+    public static final class Async {
+
+        @SerializedName("jobstatus")
+        private int jobstatus;
+
+        @SerializedName("jobresult")
+        private JobId jobresult;
+
+        @SerializedName("cmd")
+        private String cmd;
+
+        public int getJobStatus() {
+            return jobstatus;
+        }
+
+        public JobId getJobResult() {
+            return jobresult;
+        }
+
+        public String getCmd() {
+            return cmd;
+        }
+
+    }
+
+    public static final class Capabilities {
+
+        @SerializedName("capability")
+        private HashMap<String, String> capabilites;
+
+        public String getVersion() {
+            return capabilites.get("cloudByteVersion");
+        }
+    }
+
+    /*
+     *
+     * change Volume IOPS
+     */
+
+    public static Answer updateElastistorVolumeQosGroup(String volumeId, Long newIOPS, String graceAllowed) throws Throwable {
+
+        FileSystem fileSystem = listVolume(volumeId);
+
+        String qosid = fileSystem.getQosGroupid();
+
+        if (qosid != null) {
+
+            UpdateQosGroupCmdResponse qosGroupCmdResponse = updateQosGroupVolume(newIOPS.toString(), qosid, graceAllowed);
+
+            if (qosGroupCmdResponse.getQoSGroup(0).uuid != null) {
+                return new Answer(null, true, null);
+            } else {
+                return new Answer(null, false, "Update Qos Group Failed");
+            }
+        } else {
+            return new Answer(null, false, "Qos Group id is NULL");
+        }
+
+    }
+
+    private static UpdateQosGroupCmdResponse updateQosGroupVolume(String iops, String qosgroupid, String graceAllowed) throws Throwable {
+
+        UpdateQosGroupCmd updateQosGroupCmd = new UpdateQosGroupCmd();
+        updateQosGroupCmd.putCommandParameter("id", qosgroupid);
+        updateQosGroupCmd.putCommandParameter("iops", iops);
+        updateQosGroupCmd.putCommandParameter("graceallowed", graceAllowed);
+
+        UpdateQosGroupCmdResponse updateQosGroupCmdResponse = (UpdateQosGroupCmdResponse) getElastistorRestClient().executeCommand(updateQosGroupCmd);
+
+        return updateQosGroupCmdResponse;
+    }
+
+    private static final class UpdateQosGroupCmd extends BaseCommand {
+
+        public UpdateQosGroupCmd() {
+            super("updateQosGroup", new UpdateQosGroupCmdResponse());
+        }
+
+    }
+
+    public static final class UpdateQosGroupCmdResponse {
+
+        @SerializedName("updateqosresponse")
+        private QoSGroupWrapperChangeVolumeIops qosGroupWrapper;
+
+        public QoSGroup getQoSGroup(int i) {
+            return qosGroupWrapper.getQosGroup(i);
+        }
+    }
+
+    public static final class QoSGroupWrapperChangeVolumeIops {
+
+        @SerializedName("qosgroup")
+        private QoSGroup qoSGroup[];
+
+        public QoSGroup getQosGroup(int i) {
+
+            return qoSGroup[i];
+        }
+
+    }
+
+    /*
+     * resize volume
+     */
+
+    public static Boolean updateElastistorVolumeSize(String volumeId, Long newSize) throws Throwable {
+
+        Boolean status = false;
+
+        String quotasize = (String.valueOf(newSize / (1024 * 1024 * 1024)) + "G");
+
+        UpdateFileSystemCmdResponse fileSystemCmdResponse = updateFileSystem(quotasize, volumeId, null, null, null);
+
+        if (fileSystemCmdResponse.getFileSystem(0).uuid != null) {
+            status = true;
+            return status;
+        }
+
+        return status;
+    }
+
+    public static UpdateFileSystemCmdResponse updateFileSystem(String quotasize, String esvolumeid, String dedeplication, String compression, String sync) throws Throwable {
+
+        UpdateFileSystemCmd fileSystemCmd = new UpdateFileSystemCmd();
+
+        fileSystemCmd.putCommandParameter("id", esvolumeid);
+        if (null != quotasize)
+            fileSystemCmd.putCommandParameter("quotasize", quotasize);
+        if (null != dedeplication)
+            fileSystemCmd.putCommandParameter("deduplication", dedeplication);
+        if (null != compression)
+            fileSystemCmd.putCommandParameter("compression", compression);
+        if (null != sync)
+            fileSystemCmd.putCommandParameter("sync", sync);
+
+        UpdateFileSystemCmdResponse fileSystemCmdResponse = (UpdateFileSystemCmdResponse) getElastistorRestClient().executeCommand(fileSystemCmd);
+
+        return fileSystemCmdResponse;
+    }
+
+    private static final class UpdateFileSystemCmd extends BaseCommand {
+
+        public UpdateFileSystemCmd() {
+            super("updateFileSystem", new UpdateFileSystemCmdResponse());
+        }
+
+    }
+
+    private static final class UpdateFileSystemCmdResponse {
+
+        @SerializedName("updatefilesystemresponse")
+        private UpdateFileSystemWrapper fileSystemWrapper;
+
+        public FileSystem getFileSystem(int i) {
+
+            return fileSystemWrapper.getFileSystem(i);
+        }
+    }
+
+    public class UpdateFileSystemWrapper {
+
+        @SerializedName("filesystem")
+        private FileSystem fileSystem[];
+
+        public FileSystem getFileSystem(int i) {
+            return fileSystem[i];
+        }
+
+    }
+    /*
+     * create snapshot
+     */
+
+     public static Answer createElastistorVolumeSnapshot(String volumeId, String snapshotName) throws Throwable{
+
+         CreateCmdResult result = null;
+         CreateStorageSnapshotCmd snapshotCmd = new CreateStorageSnapshotCmd();
+
+         snapshotCmd.putCommandParameter("id", volumeId);
+         snapshotCmd.putCommandParameter("name", snapshotName);
+
+         CreateStorageSnapshotCmdResponse snapshotCmdResponse = (CreateStorageSnapshotCmdResponse) getElastistorRestClient().executeCommand(snapshotCmd);
+
+         if(snapshotCmdResponse.getStorageSnapshot().getId() != null){
+             return new Answer(null, true, "snapshot succesfully taken");
+         }else{
+             return new Answer(null, false, "snapshot failed");
+         }
+     }
+
+     private static final class CreateStorageSnapshotCmd extends BaseCommand {
+
+            public CreateStorageSnapshotCmd() {
+                super("createStorageSnapshot", new CreateStorageSnapshotCmdResponse() );
+            }
+
+        }
+
+     private static final class CreateStorageSnapshotCmdResponse {
+
+            @SerializedName("createStorageSnapshotResponse")
+             private StorageSnapshotWrapper StorageSnapshot;
+
+            public StorageSnapshot getStorageSnapshot() {
+                return StorageSnapshot.getStorageSnapshot();
+            }
+        }
+
+     public static final class StorageSnapshotWrapper {
+
+            @SerializedName("StorageSnapshot")
+            private StorageSnapshot snapshot;
+
+
+
+            public StorageSnapshot getStorageSnapshot() {
+                return snapshot;
+            }
+
+        }
+
+     public static final class StorageSnapshot {
+
+         @SerializedName("id")
+         private String uuid;
+
+         @SerializedName("name")
+         private String name;
+
+         public String getId(){
+             return uuid;
+         }
+
+         public String getName(){
+             return name;
+         }
+     }
+
+     // update the TSM storage
+     public static UpdateTsmStorageCmdResponse updateElastistorTsmStorage(String capacityBytes,String uuid) throws Throwable{
+
+         Long size = (Long.valueOf(capacityBytes)/(1024 * 1024 * 1024));
+
+         String quotasize = null;
+
+         if(size > 1024){
+            quotasize = (String.valueOf(Long.valueOf(capacityBytes)/(1024)) + "T");
+         }else{
+            quotasize = String.valueOf(quotasize) + "G";
+         }
+         s_logger.info("elastistor tsm storage is updating to " + quotasize);
+         UpdateTsmStorageCmd updateTsmStorageCmd = new UpdateTsmStorageCmd();
+
+         updateTsmStorageCmd.putCommandParameter("id", uuid);
+         updateTsmStorageCmd.putCommandParameter("quotasize", quotasize);
+
+         UpdateTsmStorageCmdResponse updateTsmStorageCmdResponse = (UpdateTsmStorageCmdResponse) getElastistorRestClient().executeCommand(updateTsmStorageCmd);
+
+       return updateTsmStorageCmdResponse;
+     }
+
+     private static final class UpdateTsmStorageCmd extends BaseCommand {
+
+         public UpdateTsmStorageCmd() {
+             super("updateStorage", new UpdateTsmStorageCmdResponse());
+         }
+
+     }
+
+     public static final class UpdateTsmStorageCmdResponse {
+
+         @SerializedName("updatedatasetresponse")
+          private StorageWrapper storageWrapper;
+
+         public Storage getStorage() {
+             return storageWrapper.getStorage();
+         }
+     }
+
+     public static final class StorageWrapper {
+
+         @SerializedName("storage")
+         private Storage storage;
+
+         public Storage getStorage() {
+             return storage;
+         }
+
+     }
+
+     public static final class Storage {
+
+         @SerializedName("id")
+         private String uuid;
+
+         @SerializedName("name")
+         private String name;
+
+         @SerializedName("quota")
+         private String quota;
+
+         public String getId(){
+             return uuid;
+         }
+
+         public String getName(){
+             return name;
+         }
+
+         public String getsize(){
+             return quota;
+         }
+     }
+
+  // update the TSM IOPS
+     public static UpdateTsmCmdResponse updateElastistorTsmIOPS(String capacityIOPs,S

<TRUNCATED>