You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by di...@apache.org on 2022/03/12 06:33:25 UTC

[airavata-mft] branch master updated: Adding an API to keep list storages

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

dimuthuupe pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-mft.git


The following commit(s) were added to refs/heads/master by this push:
     new eee01c0  Adding an API to keep list storages
eee01c0 is described below

commit eee01c0d019e95ccddcc8b59bdb1e5cf40550a18
Author: Dimuthu Wannipurage <di...@gmail.com>
AuthorDate: Sat Mar 12 01:33:10 2022 -0500

    Adding an API to keep list storages
---
 .../command/line/sub/s3/S3ResourceSubCommand.java  | 12 ++++-
 .../resource/server/backend/ResourceBackend.java   |  8 ++++
 .../backend/airavata/AiravataResourceBackend.java  | 40 ++++++++++++++++
 .../backend/datalake/DatalakeResourceBackend.java  | 40 ++++++++++++++++
 .../backend/file/FileBasedResourceBackend.java     | 40 ++++++++++++++++
 .../server/backend/sql/SQLResourceBackend.java     | 55 ++++++++++++++++++++++
 .../backend/sql/entity/FTPStorageEntity.java       | 11 +++++
 .../backend/sql/entity/LocalStorageEntity.java     | 27 +++++++++++
 .../server/backend/sql/entity/S3StorageEntity.java | 11 +++++
 .../backend/sql/entity/SCPStorageEntity.java       | 11 +++++
 .../sql/repository/FTPStorageRepository.java       |  3 ++
 .../sql/repository/LocalStorageRepository.java     |  4 ++
 .../sql/repository/S3StorageRepository.java        |  4 ++
 .../sql/repository/SCPStorageRepository.java       |  3 ++
 .../resource/server/handler/FTPServiceHandler.java | 16 +++++++
 .../server/handler/LocalServiceHandler.java        | 16 +++++++
 .../resource/server/handler/S3ServiceHandler.java  | 15 ++++++
 .../resource/server/handler/SCPServiceHandler.java | 16 +++++++
 .../stub/src/main/proto/azure/AzureService.proto   |  6 +++
 .../stub/src/main/proto/azure/AzureStorage.proto   | 12 +++++
 .../stub/src/main/proto/box/BoxService.proto       |  5 ++
 .../stub/src/main/proto/box/BoxStorage.proto       | 12 +++++
 .../src/main/proto/dropbox/DropboxService.proto    |  5 ++
 .../src/main/proto/dropbox/DropboxStorage.proto    | 12 +++++
 .../stub/src/main/proto/ftp/FTPService.proto       |  6 +++
 .../stub/src/main/proto/ftp/FTPStorage.proto       | 12 +++++
 .../stub/src/main/proto/gcs/GCSService.proto       |  6 +++
 .../stub/src/main/proto/gcs/GCSStorage.proto       | 12 +++++
 .../stub/src/main/proto/local/LocalService.proto   |  6 +++
 .../stub/src/main/proto/local/LocalStorage.proto   | 12 +++++
 .../stub/src/main/proto/s3/S3Service.proto         |  6 +++
 .../stub/src/main/proto/s3/S3Storage.proto         | 12 +++++
 .../stub/src/main/proto/scp/SCPService.proto       |  7 +++
 .../stub/src/main/proto/scp/SCPStorage.proto       | 12 +++++
 34 files changed, 474 insertions(+), 1 deletion(-)

diff --git a/command-line/src/main/java/org/apache/airavata/mft/command/line/sub/s3/S3ResourceSubCommand.java b/command-line/src/main/java/org/apache/airavata/mft/command/line/sub/s3/S3ResourceSubCommand.java
index fb5bbff..85b17dc 100644
--- a/command-line/src/main/java/org/apache/airavata/mft/command/line/sub/s3/S3ResourceSubCommand.java
+++ b/command-line/src/main/java/org/apache/airavata/mft/command/line/sub/s3/S3ResourceSubCommand.java
@@ -7,6 +7,8 @@ import org.apache.airavata.mft.credential.stubs.s3.S3SecretCreateRequest;
 import org.apache.airavata.mft.resource.service.s3.S3StorageServiceGrpc;
 import org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage;
 import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageCreateRequest;
+import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListRequest;
+import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListResponse;
 import org.apache.airavata.mft.storage.stubs.storagesecret.StorageSecret;
 import org.apache.airavata.mft.storage.stubs.storagesecret.StorageSecretCreateRequest;
 import org.apache.airavata.mft.storage.stubs.storagesecret.StorageSecretServiceGrpc;
@@ -42,7 +44,7 @@ public class S3ResourceSubCommand {
         StorageSecretServiceGrpc.StorageSecretServiceBlockingStub storageSecretClient = mftApiClient.getStorageServiceClient().storageSecret();
 
         S3Storage s3Storage = s3StorageClient.createS3Storage(S3StorageCreateRequest.newBuilder()
-                .setStorageId(remoteName)
+                .setName(remoteName)
                 .setEndpoint(endpoint)
                 .setBucketName(bucket)
                 .setUseTLS("Y".equals(useTLS))
@@ -68,6 +70,14 @@ public class S3ResourceSubCommand {
     @CommandLine.Command(name = "list")
     void listS3Resource() {
         System.out.println("Listing S3 Resource");
+        MFTApiClient mftApiClient = MFTApiClient.MFTApiClientBuilder.newBuilder().build();
+
+        S3StorageListResponse s3StorageListResponse = mftApiClient.getStorageServiceClient().s3()
+                .listS3Storage(S3StorageListRequest.newBuilder().setOffset(0).setLimit(10).build());
+
+        s3StorageListResponse.getStoragesList().forEach(s -> {
+            System.out.println("Storage Id : " + s.getStorageId() + " Name : " + s.getName()+ " Bucket : " + s.getBucketName());
+        });
     }
 
     @CommandLine.Command(name = "get")
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/ResourceBackend.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/ResourceBackend.java
index 36b851f..2f5fa68 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/ResourceBackend.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/ResourceBackend.java
@@ -46,41 +46,49 @@ public interface ResourceBackend {
     public boolean deleteStorageSecret(StorageSecretDeleteRequest request) throws Exception;
     public Optional<StorageSecret> searchStorageSecret(StorageSecretSearchRequest request) throws Exception;
 
+    public SCPStorageListResponse listSCPStorage(SCPStorageListRequest request) throws Exception;
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest request) throws Exception;
     public SCPStorage createSCPStorage(SCPStorageCreateRequest request) throws Exception;
     public boolean updateSCPStorage(SCPStorageUpdateRequest request) throws Exception;
     public boolean deleteSCPStorage(SCPStorageDeleteRequest request) throws Exception;
 
+    public LocalStorageListResponse listLocalStorage(LocalStorageListRequest request) throws Exception;
     public Optional<LocalStorage> getLocalStorage(LocalStorageGetRequest request) throws Exception;
     public LocalStorage createLocalStorage(LocalStorageCreateRequest request) throws Exception;
     public boolean updateLocalStorage(LocalStorageUpdateRequest request) throws Exception;
     public boolean deleteLocalStorage(LocalStorageDeleteRequest request) throws Exception;
 
+    public S3StorageListResponse listS3Storage(S3StorageListRequest request) throws Exception;
     public Optional<S3Storage> getS3Storage(S3StorageGetRequest request) throws Exception;
     public S3Storage createS3Storage(S3StorageCreateRequest request) throws Exception;
     public boolean updateS3Storage(S3StorageUpdateRequest request) throws Exception;
     public boolean deleteS3Storage(S3StorageDeleteRequest request) throws Exception;
 
+    public BoxStorageListResponse listBoxStorage(BoxStorageListRequest request) throws Exception;
     public Optional<BoxStorage> getBoxStorage(BoxStorageGetRequest request) throws Exception;
     public BoxStorage createBoxStorage(BoxStorageCreateRequest request) throws Exception;
     public boolean updateBoxStorage(BoxStorageUpdateRequest request) throws Exception;
     public boolean deleteBoxStorage(BoxStorageDeleteRequest request) throws Exception;
 
+    public AzureStorageListResponse listAzureStorage(AzureStorageListRequest request) throws Exception;
     public Optional<AzureStorage> getAzureStorage(AzureStorageGetRequest request) throws Exception;
     public AzureStorage createAzureStorage(AzureStorageCreateRequest request) throws Exception;
     public boolean updateAzureStorage(AzureStorageUpdateRequest request) throws Exception;
     public boolean deleteAzureStorage(AzureStorageDeleteRequest request) throws Exception;
 
+    public GCSStorageListResponse listGCSStorage(GCSStorageListRequest request) throws Exception;
     public Optional<GCSStorage> getGCSStorage(GCSStorageGetRequest request) throws Exception;
     public GCSStorage createGCSStorage(GCSStorageCreateRequest request) throws Exception;
     public boolean updateGCSStorage(GCSStorageUpdateRequest request) throws Exception;
     public boolean deleteGCSStorage(GCSStorageDeleteRequest request) throws Exception;
 
+    public DropboxStorageListResponse listDropboxStorage(DropboxStorageListRequest request) throws Exception;
     public Optional<DropboxStorage> getDropboxStorage(DropboxStorageGetRequest request) throws Exception;
     public DropboxStorage createDropboxStorage(DropboxStorageCreateRequest request) throws Exception;
     public boolean updateDropboxStorage(DropboxStorageUpdateRequest request) throws Exception;
     public boolean deleteDropboxStorage(DropboxStorageDeleteRequest request) throws Exception;
 
+    public FTPStorageListResponse listFTPStorage(FTPStorageListRequest request) throws Exception;
     Optional<FTPStorage> getFTPStorage(FTPStorageGetRequest request) throws Exception;
     FTPStorage createFTPStorage(FTPStorageCreateRequest request) throws Exception;
     boolean updateFTPStorage(FTPStorageUpdateRequest request) throws Exception;
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/airavata/AiravataResourceBackend.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/airavata/AiravataResourceBackend.java
index 2cc29df..0656185 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/airavata/AiravataResourceBackend.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/airavata/AiravataResourceBackend.java
@@ -115,6 +115,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public SCPStorageListResponse listSCPStorage(SCPStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest request) throws Exception {
 
         String resourceId = request.getStorageId();
@@ -173,6 +178,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public LocalStorageListResponse listLocalStorage(LocalStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<LocalStorage> getLocalStorage(LocalStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -193,6 +203,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public S3StorageListResponse listS3Storage(S3StorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<S3Storage> getS3Storage(S3StorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -213,6 +228,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public BoxStorageListResponse listBoxStorage(BoxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<BoxStorage> getBoxStorage(BoxStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -233,6 +253,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public AzureStorageListResponse listAzureStorage(AzureStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<AzureStorage> getAzureStorage(AzureStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -253,6 +278,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public GCSStorageListResponse listGCSStorage(GCSStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<GCSStorage> getGCSStorage(GCSStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -273,6 +303,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public DropboxStorageListResponse listDropboxStorage(DropboxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<DropboxStorage> getDropboxStorage(DropboxStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -293,6 +328,11 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public FTPStorageListResponse listFTPStorage(FTPStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<FTPStorage> getFTPStorage(FTPStorageGetRequest request) {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/datalake/DatalakeResourceBackend.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/datalake/DatalakeResourceBackend.java
index 5a961e2..360a824 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/datalake/DatalakeResourceBackend.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/datalake/DatalakeResourceBackend.java
@@ -202,6 +202,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public SCPStorageListResponse listSCPStorage(SCPStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest request) throws Exception {
         return Optional.empty();
     }
@@ -222,6 +227,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public LocalStorageListResponse listLocalStorage(LocalStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<LocalStorage> getLocalStorage(LocalStorageGetRequest request) throws Exception {
         return Optional.empty();
     }
@@ -242,6 +252,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public S3StorageListResponse listS3Storage(S3StorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<S3Storage> getS3Storage(S3StorageGetRequest request) throws Exception {
         return Optional.empty();
     }
@@ -262,6 +277,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public BoxStorageListResponse listBoxStorage(BoxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<BoxStorage> getBoxStorage(BoxStorageGetRequest request) throws Exception {
         return Optional.empty();
     }
@@ -282,6 +302,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public AzureStorageListResponse listAzureStorage(AzureStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<AzureStorage> getAzureStorage(AzureStorageGetRequest request) throws Exception {
         return Optional.empty();
     }
@@ -302,6 +327,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public GCSStorageListResponse listGCSStorage(GCSStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<GCSStorage> getGCSStorage(GCSStorageGetRequest request) throws Exception {
         return Optional.empty();
     }
@@ -322,6 +352,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public DropboxStorageListResponse listDropboxStorage(DropboxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<DropboxStorage> getDropboxStorage(DropboxStorageGetRequest request) throws Exception {
         return Optional.empty();
     }
@@ -342,6 +377,11 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public FTPStorageListResponse listFTPStorage(FTPStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<FTPStorage> getFTPStorage(FTPStorageGetRequest request) throws Exception {
         return Optional.empty();
     }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java
index 3d9be58..0a9d9c0 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java
@@ -181,6 +181,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public SCPStorageListResponse listSCPStorage(SCPStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest request) throws Exception {
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(storageFile);
 
@@ -229,6 +234,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public LocalStorageListResponse listLocalStorage(LocalStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<LocalStorage> getLocalStorage(LocalStorageGetRequest request) throws Exception {
         JSONParser jsonParser = new JSONParser();
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(storageFile);
@@ -270,6 +280,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public S3StorageListResponse listS3Storage(S3StorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<S3Storage> getS3Storage(S3StorageGetRequest request) throws Exception {
         JSONParser jsonParser = new JSONParser();
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(storageFile);
@@ -312,6 +327,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public BoxStorageListResponse listBoxStorage(BoxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<BoxStorage> getBoxStorage(BoxStorageGetRequest request) throws Exception {
         JSONParser jsonParser = new JSONParser();
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(storageFile);
@@ -353,6 +373,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public AzureStorageListResponse listAzureStorage(AzureStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<AzureStorage> getAzureStorage(AzureStorageGetRequest request) throws Exception {
         JSONParser jsonParser = new JSONParser();
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(storageFile);
@@ -394,6 +419,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public GCSStorageListResponse listGCSStorage(GCSStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<GCSStorage> getGCSStorage(GCSStorageGetRequest request) throws Exception {
         JSONParser jsonParser = new JSONParser();
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(storageFile);
@@ -435,6 +465,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public DropboxStorageListResponse listDropboxStorage(DropboxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<DropboxStorage> getDropboxStorage(DropboxStorageGetRequest request) throws Exception {
         JSONParser jsonParser = new JSONParser();
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(resourceFile);
@@ -477,6 +512,11 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public FTPStorageListResponse listFTPStorage(FTPStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<FTPStorage> getFTPStorage(FTPStorageGetRequest request) throws Exception {
         InputStream inputStream = FileBasedResourceBackend.class.getClassLoader().getResourceAsStream(storageFile);
 
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackend.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackend.java
index 26cfbdb..a3d3cd8 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackend.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/SQLResourceBackend.java
@@ -34,7 +34,10 @@ import org.dozer.DozerBeanMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
 
+import java.util.List;
 import java.util.Optional;
 
 public class SQLResourceBackend implements ResourceBackend {
@@ -204,6 +207,14 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public SCPStorageListResponse listSCPStorage(SCPStorageListRequest request) throws Exception {
+        SCPStorageListResponse.Builder respBuilder = SCPStorageListResponse.newBuilder();
+        List<SCPStorageEntity> all = scpStorageRepository.findAll(PageRequest.of(request.getOffset(), request.getLimit()));
+        all.forEach(ety -> respBuilder.addStorages(mapper.map(ety, SCPStorage.newBuilder().getClass())));
+        return respBuilder.build();
+    }
+
+    @Override
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest request) {
         Optional<SCPStorageEntity> storageEty = scpStorageRepository.findByStorageId(request.getStorageId());
         return storageEty.map(scpStorageEntity -> mapper.map(scpStorageEntity, SCPStorage.newBuilder().getClass()).build());
@@ -229,6 +240,14 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public LocalStorageListResponse listLocalStorage(LocalStorageListRequest request) throws Exception {
+        LocalStorageListResponse.Builder respBuilder = LocalStorageListResponse.newBuilder();
+        List<LocalStorageEntity> all = localStorageRepository.findAll(PageRequest.of(request.getOffset(), request.getLimit()));
+        all.forEach(ety -> respBuilder.addStorages(mapper.map(ety, LocalStorage.newBuilder().getClass())));
+        return respBuilder.build();
+    }
+
+    @Override
     public Optional<LocalStorage> getLocalStorage(LocalStorageGetRequest request) throws Exception {
         Optional<LocalStorageEntity> entity = localStorageRepository.findById(request.getStorageId());
         return entity.map(e -> mapper.map(e, LocalStorage.newBuilder().getClass()).build());
@@ -254,6 +273,14 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public S3StorageListResponse listS3Storage(S3StorageListRequest request) throws Exception {
+        S3StorageListResponse.Builder respBuilder = S3StorageListResponse.newBuilder();
+        List<S3StorageEntity> all = s3StorageRepository.findAll(PageRequest.of(request.getOffset(), request.getLimit()));
+        all.forEach(ety -> respBuilder.addStorages(mapper.map(ety, S3Storage.newBuilder().getClass())));
+        return respBuilder.build();
+    }
+
+    @Override
     public Optional<S3Storage> getS3Storage(S3StorageGetRequest request) throws Exception {
         Optional<S3StorageEntity> entity = s3StorageRepository.findById(request.getStorageId());
         return entity.map(e -> mapper.map(e, S3Storage.newBuilder().getClass()).build());
@@ -279,6 +306,11 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public BoxStorageListResponse listBoxStorage(BoxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<BoxStorage> getBoxStorage(BoxStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -299,6 +331,11 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public AzureStorageListResponse listAzureStorage(AzureStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<AzureStorage> getAzureStorage(AzureStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -319,6 +356,11 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public GCSStorageListResponse listGCSStorage(GCSStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<GCSStorage> getGCSStorage(GCSStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -339,6 +381,11 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public DropboxStorageListResponse listDropboxStorage(DropboxStorageListRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<DropboxStorage> getDropboxStorage(DropboxStorageGetRequest request) throws Exception {
         throw new UnsupportedOperationException("Operation is not supported in backend");
     }
@@ -359,6 +406,14 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public FTPStorageListResponse listFTPStorage(FTPStorageListRequest request) throws Exception {
+        FTPStorageListResponse.Builder respBuilder = FTPStorageListResponse.newBuilder();
+        List<FTPStorageEntity> all = ftpStorageRepository.findAll(PageRequest.of(request.getOffset(), request.getLimit()));
+        all.forEach(ety -> respBuilder.addStorages(mapper.map(ety, FTPStorage.newBuilder().getClass())));
+        return respBuilder.build();
+    }
+
+    @Override
     public Optional<FTPStorage> getFTPStorage(FTPStorageGetRequest request) {
         Optional<FTPStorageEntity> entity = ftpStorageRepository.findByStorageId(request.getStorageId());
         return entity.map(e -> mapper.map(e, FTPStorage.newBuilder().getClass()).build());
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/FTPStorageEntity.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/FTPStorageEntity.java
index 868ea7f..07a60fb 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/FTPStorageEntity.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/FTPStorageEntity.java
@@ -33,6 +33,9 @@ public class FTPStorageEntity {
     @GenericGenerator(name = "uuid", strategy = "uuid2")
     private String storageId;
 
+    @Column(name = "STORAGE_NAME")
+    private String name;
+
     @Column(name = "HOST")
     private String host;
 
@@ -62,4 +65,12 @@ public class FTPStorageEntity {
     public void setPort(int port) {
         this.port = port;
     }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/LocalStorageEntity.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/LocalStorageEntity.java
index 4197f12..d5621e5 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/LocalStorageEntity.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/LocalStorageEntity.java
@@ -16,6 +16,33 @@ public class LocalStorageEntity {
     @GenericGenerator(name = "uuid", strategy = "uuid2")
     private String storageId;
 
+    @Column(name = "STORAGE_NAME")
+    private String name;
+
     @Column(name = "AGENT_ID")
     private String agentId;
+
+    public String getStorageId() {
+        return storageId;
+    }
+
+    public void setStorageId(String storageId) {
+        this.storageId = storageId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId;
+    }
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/S3StorageEntity.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/S3StorageEntity.java
index a9c7f19..b9b6ac2 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/S3StorageEntity.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/S3StorageEntity.java
@@ -16,6 +16,9 @@ public class S3StorageEntity {
     @GenericGenerator(name = "uuid", strategy = "uuid2")
     private String storageId;
 
+    @Column(name = "STORAGE_NAME")
+    private String name;
+
     @Column(name = "BUCKET_NAME")
     private String bucketName;
 
@@ -67,4 +70,12 @@ public class S3StorageEntity {
     public void setUseTLS(boolean useTLS) {
         this.useTLS = useTLS;
     }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SCPStorageEntity.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SCPStorageEntity.java
index 776bbc4..0678062 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SCPStorageEntity.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/SCPStorageEntity.java
@@ -32,6 +32,9 @@ public class SCPStorageEntity {
     @GenericGenerator(name = "uuid", strategy = "uuid2")
     private String storageId;
 
+    @Column(name = "STORAGE_NAME")
+    private String name;
+
     @Column(name = "HOST")
     private String host;
 
@@ -61,4 +64,12 @@ public class SCPStorageEntity {
     public void setPort(int port) {
         this.port = port;
     }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/FTPStorageRepository.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/FTPStorageRepository.java
index 152ae34..c56ccfa 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/FTPStorageRepository.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/FTPStorageRepository.java
@@ -18,10 +18,13 @@
 package org.apache.airavata.mft.resource.server.backend.sql.repository;
 
 import org.apache.airavata.mft.resource.server.backend.sql.entity.FTPStorageEntity;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.repository.CrudRepository;
 
+import java.util.List;
 import java.util.Optional;
 
 public interface FTPStorageRepository extends CrudRepository<FTPStorageEntity, String> {
     Optional<FTPStorageEntity> findByStorageId(String storageId);
+    List<FTPStorageEntity> findAll(Pageable pageable);
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/LocalStorageRepository.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/LocalStorageRepository.java
index 7761148..a3084c6 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/LocalStorageRepository.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/LocalStorageRepository.java
@@ -1,7 +1,11 @@
 package org.apache.airavata.mft.resource.server.backend.sql.repository;
 
 import org.apache.airavata.mft.resource.server.backend.sql.entity.LocalStorageEntity;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.repository.CrudRepository;
 
+import java.util.List;
+
 public interface LocalStorageRepository extends CrudRepository<LocalStorageEntity, String> {
+    List<LocalStorageEntity> findAll(Pageable pageable);
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/S3StorageRepository.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/S3StorageRepository.java
index f879189..1c37fe5 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/S3StorageRepository.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/S3StorageRepository.java
@@ -1,8 +1,12 @@
 package org.apache.airavata.mft.resource.server.backend.sql.repository;
 
 import org.apache.airavata.mft.resource.server.backend.sql.entity.S3StorageEntity;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.repository.CrudRepository;
 
+import java.util.List;
+
 public interface S3StorageRepository extends CrudRepository<S3StorageEntity, String> {
+    List<S3StorageEntity> findAll(Pageable pageable);
 
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/SCPStorageRepository.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/SCPStorageRepository.java
index 3772e15..dbd77cd 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/SCPStorageRepository.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/SCPStorageRepository.java
@@ -18,10 +18,13 @@
 package org.apache.airavata.mft.resource.server.backend.sql.repository;
 
 import org.apache.airavata.mft.resource.server.backend.sql.entity.SCPStorageEntity;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.repository.CrudRepository;
 
+import java.util.List;
 import java.util.Optional;
 
 public interface SCPStorageRepository extends CrudRepository<SCPStorageEntity, String> {
     Optional<SCPStorageEntity> findByStorageId(String storageId);
+    List<SCPStorageEntity> findAll(Pageable pageable);
 }
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/FTPServiceHandler.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/FTPServiceHandler.java
index bfc083a..d7d6858 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/FTPServiceHandler.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/FTPServiceHandler.java
@@ -23,6 +23,7 @@ import io.grpc.stub.StreamObserver;
 import org.apache.airavata.mft.resource.server.backend.ResourceBackend;
 import org.apache.airavata.mft.resource.service.ftp.FTPStorageServiceGrpc;
 import org.apache.airavata.mft.resource.stubs.ftp.storage.*;
+import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListResponse;
 import org.lognet.springboot.grpc.GRpcService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,6 +38,21 @@ public class FTPServiceHandler extends FTPStorageServiceGrpc.FTPStorageServiceIm
     private ResourceBackend backend;
 
     @Override
+    public void listFTPStorage(FTPStorageListRequest request, StreamObserver<FTPStorageListResponse> responseObserver) {
+        try {
+            FTPStorageListResponse response = this.backend.listFTPStorage(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+        } catch (Exception e) {
+            logger.error("Failed in retrieving FTP storage list", e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in retrieving FTP storage list")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
     public void getFTPStorage(FTPStorageGetRequest request, StreamObserver<FTPStorage> responseObserver) {
         try {
             this.backend.getFTPStorage(request).ifPresentOrElse(storage -> {
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/LocalServiceHandler.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/LocalServiceHandler.java
index 0db9b41..ff206ee 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/LocalServiceHandler.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/LocalServiceHandler.java
@@ -23,6 +23,7 @@ import io.grpc.stub.StreamObserver;
 import org.apache.airavata.mft.resource.server.backend.ResourceBackend;
 import org.apache.airavata.mft.resource.service.local.LocalStorageServiceGrpc;
 import org.apache.airavata.mft.resource.stubs.local.storage.*;
+import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListResponse;
 import org.lognet.springboot.grpc.GRpcService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,6 +38,21 @@ public class LocalServiceHandler extends LocalStorageServiceGrpc.LocalStorageSer
     private ResourceBackend backend;
 
     @Override
+    public void listLocalStorage(LocalStorageListRequest request, StreamObserver<LocalStorageListResponse> responseObserver) {
+        try {
+            LocalStorageListResponse response = this.backend.listLocalStorage(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+        } catch (Exception e) {
+            logger.error("Failed in retrieving Local storage list", e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in retrieving Local storage list")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
     public void getLocalStorage(LocalStorageGetRequest request, StreamObserver<LocalStorage> responseObserver) {
         try {
             this.backend.getLocalStorage(request).ifPresentOrElse(resource -> {
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandler.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandler.java
index 51a0a41..7a7b7d2 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandler.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/S3ServiceHandler.java
@@ -37,6 +37,21 @@ public class S3ServiceHandler extends S3StorageServiceGrpc.S3StorageServiceImplB
     private ResourceBackend backend;
 
     @Override
+    public void listS3Storage(S3StorageListRequest request, StreamObserver<S3StorageListResponse> responseObserver) {
+        try {
+            S3StorageListResponse response = this.backend.listS3Storage(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+        } catch (Exception e) {
+            logger.error("Failed in retrieving S3 storage list", e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in retrieving S3 storage list")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
     public void getS3Storage(S3StorageGetRequest request, StreamObserver<S3Storage> responseObserver) {
         try {
             this.backend.getS3Storage(request).ifPresentOrElse(resource -> {
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/SCPServiceHandler.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/SCPServiceHandler.java
index 35524b4..9667f54 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/SCPServiceHandler.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/SCPServiceHandler.java
@@ -22,6 +22,7 @@ import io.grpc.Status;
 import io.grpc.stub.StreamObserver;
 import org.apache.airavata.mft.resource.server.backend.ResourceBackend;
 import org.apache.airavata.mft.resource.service.scp.SCPStorageServiceGrpc;
+import org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListResponse;
 import org.apache.airavata.mft.resource.stubs.scp.storage.*;
 import org.lognet.springboot.grpc.GRpcService;
 import org.slf4j.Logger;
@@ -37,6 +38,21 @@ public class SCPServiceHandler extends SCPStorageServiceGrpc.SCPStorageServiceIm
     private ResourceBackend backend;
 
     @Override
+    public void listSCPStorage(SCPStorageListRequest request, StreamObserver<SCPStorageListResponse> responseObserver) {
+        try {
+            SCPStorageListResponse response = this.backend.listSCPStorage(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+        } catch (Exception e) {
+            logger.error("Failed in retrieving SCP storage list", e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in retrieving SCP storage list")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
     public void getSCPStorage(SCPStorageGetRequest request, StreamObserver<SCPStorage> responseObserver) {
         try {
             this.backend.getSCPStorage(request).ifPresentOrElse(storage -> {
diff --git a/services/resource-service/stub/src/main/proto/azure/AzureService.proto b/services/resource-service/stub/src/main/proto/azure/AzureService.proto
index a6991ef..21fde8c 100644
--- a/services/resource-service/stub/src/main/proto/azure/AzureService.proto
+++ b/services/resource-service/stub/src/main/proto/azure/AzureService.proto
@@ -28,6 +28,12 @@ service AzureStorageService {
     
     // Storage
 
+    rpc listAzureStorage (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorageListRequest) returns (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/azure/storage"
+        };
+    }
+    
     rpc getAzureStorage (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorageGetRequest) returns
     (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorage) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/azure/AzureStorage.proto b/services/resource-service/stub/src/main/proto/azure/AzureStorage.proto
index 960225d..c7fb625 100644
--- a/services/resource-service/stub/src/main/proto/azure/AzureStorage.proto
+++ b/services/resource-service/stub/src/main/proto/azure/AzureStorage.proto
@@ -23,6 +23,16 @@ package org.apache.airavata.mft.resource.stubs.azure.storage;
 message AzureStorage {
     string storageId = 1;
     string container = 2;
+    string name = 3;
+}
+
+message AzureStorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message AzureStorageListResponse {
+    repeated AzureStorage storages = 1;
 }
 
 message AzureStorageGetRequest {
@@ -32,11 +42,13 @@ message AzureStorageGetRequest {
 message AzureStorageCreateRequest {
     string container = 1;
     string storageId = 2;
+    string name = 3;
 }
 
 message AzureStorageUpdateRequest {
     string storageId = 1;
     string container = 2;
+    string name = 3;
 }
 
 message AzureStorageDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/box/BoxService.proto b/services/resource-service/stub/src/main/proto/box/BoxService.proto
index a46ad80..e580e1f 100644
--- a/services/resource-service/stub/src/main/proto/box/BoxService.proto
+++ b/services/resource-service/stub/src/main/proto/box/BoxService.proto
@@ -27,6 +27,11 @@ import "box/BoxStorage.proto";
 service BoxStorageService {
 
     // Storage
+    rpc listBoxStorage (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorageListRequest) returns (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/box/storage"
+        };
+    }
 
     rpc getBoxStorage (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorageGetRequest) returns
     (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorage) {
diff --git a/services/resource-service/stub/src/main/proto/box/BoxStorage.proto b/services/resource-service/stub/src/main/proto/box/BoxStorage.proto
index aec0555..f5f223f 100644
--- a/services/resource-service/stub/src/main/proto/box/BoxStorage.proto
+++ b/services/resource-service/stub/src/main/proto/box/BoxStorage.proto
@@ -22,6 +22,16 @@ package org.apache.airavata.mft.resource.stubs.box.storage;
 
 message BoxStorage {
     string storageId = 1;
+    string name = 2;
+}
+
+message BoxStorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message BoxStorageListResponse {
+    repeated BoxStorage storages = 1;
 }
 
 message BoxStorageGetRequest {
@@ -30,10 +40,12 @@ message BoxStorageGetRequest {
 
 message BoxStorageCreateRequest {
     string storageId = 1;
+    string name = 2;
 }
 
 message BoxStorageUpdateRequest {
     string storageId = 1;
+    string name = 2;
 }
 
 message BoxStorageDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto b/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto
index 8f52959..638a0ec 100644
--- a/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto
+++ b/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto
@@ -27,6 +27,11 @@ import "dropbox/DropboxStorage.proto";
 service DropboxStorageService {
 
     // Storage
+    rpc listDropboxStorage (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorageListRequest) returns (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/dropbox/storage"
+        };
+    }
 
     rpc getDropboxStorage (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorageGetRequest) returns
                                                     (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorage) {
diff --git a/services/resource-service/stub/src/main/proto/dropbox/DropboxStorage.proto b/services/resource-service/stub/src/main/proto/dropbox/DropboxStorage.proto
index 26cfc11..4012f7d 100644
--- a/services/resource-service/stub/src/main/proto/dropbox/DropboxStorage.proto
+++ b/services/resource-service/stub/src/main/proto/dropbox/DropboxStorage.proto
@@ -22,6 +22,16 @@ package org.apache.airavata.mft.resource.stubs.dropbox.storage;
 
 message DropboxStorage {
     string storageId = 1;
+    string name = 2;
+}
+
+message DropboxStorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message DropboxStorageListResponse {
+    repeated DropboxStorage storages = 1;
 }
 
 message DropboxStorageGetRequest {
@@ -30,10 +40,12 @@ message DropboxStorageGetRequest {
 
 message DropboxStorageCreateRequest {
     string storageId = 4;
+    string name = 2;
 }
 
 message DropboxStorageUpdateRequest {
     string storageId = 1;
+    string name = 2;
 }
 
 message DropboxStorageDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/ftp/FTPService.proto b/services/resource-service/stub/src/main/proto/ftp/FTPService.proto
index 1331dc7..73eb4f1 100644
--- a/services/resource-service/stub/src/main/proto/ftp/FTPService.proto
+++ b/services/resource-service/stub/src/main/proto/ftp/FTPService.proto
@@ -26,6 +26,12 @@ import "ftp/FTPStorage.proto";
 
 service FTPStorageService {
 
+    rpc listFTPStorage (org.apache.airavata.mft.resource.stubs.ftp.storage.FTPStorageListRequest) returns (org.apache.airavata.mft.resource.stubs.ftp.storage.FTPStorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/ftp/storage"
+        };
+    }
+    
     rpc getFTPStorage (org.apache.airavata.mft.resource.stubs.ftp.storage.FTPStorageGetRequest) returns
                                                         (org.apache.airavata.mft.resource.stubs.ftp.storage.FTPStorage) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto b/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto
index 6c1dd56..c52bab0 100644
--- a/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto
+++ b/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto
@@ -24,6 +24,16 @@ message FTPStorage {
     string storageId = 1;
     string host = 2;
     int32 port = 3;
+    string name = 4;
+}
+
+message FTPStorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message FTPStorageListResponse {
+    repeated FTPStorage storages = 1;
 }
 
 message FTPStorageGetRequest {
@@ -34,12 +44,14 @@ message FTPStorageCreateRequest {
     string host = 1;
     int32 port = 2;
     string storageId = 3;
+    string name = 4;
 }
 
 message FTPStorageUpdateRequest {
     string storageId = 1;
     string host = 2;
     int32 port = 3;
+    string name = 4;
 }
 
 message FTPStorageDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/gcs/GCSService.proto b/services/resource-service/stub/src/main/proto/gcs/GCSService.proto
index 1fab0ef..51d5de7 100644
--- a/services/resource-service/stub/src/main/proto/gcs/GCSService.proto
+++ b/services/resource-service/stub/src/main/proto/gcs/GCSService.proto
@@ -26,6 +26,12 @@ import "gcs/GCSStorage.proto";
 
 service GCSStorageService {
 
+    rpc listGCSStorage (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorageListRequest) returns (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/gcs/storage"
+        };
+    }
+    
     rpc getGCSStorage (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorageGetRequest) returns
                                                     (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorage) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/gcs/GCSStorage.proto b/services/resource-service/stub/src/main/proto/gcs/GCSStorage.proto
index a74b574..a638728 100644
--- a/services/resource-service/stub/src/main/proto/gcs/GCSStorage.proto
+++ b/services/resource-service/stub/src/main/proto/gcs/GCSStorage.proto
@@ -23,6 +23,16 @@ package org.apache.airavata.mft.resource.stubs.gcs.storage;
 message GCSStorage {
     string storageId = 1;
     string bucketName = 2;
+    string name = 3;
+}
+
+message GCSStorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message GCSStorageListResponse {
+    repeated GCSStorage storages = 1;
 }
 
 message GCSStorageGetRequest {
@@ -32,11 +42,13 @@ message GCSStorageGetRequest {
 message GCSStorageCreateRequest {
     string bucketName = 1;
     string storageId = 2;
+    string name = 3;
 }
 
 message GCSStorageUpdateRequest {
     string storageId = 1;
     string bucketName = 2;
+    string name = 3;
 }
 
 message GCSStorageDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/local/LocalService.proto b/services/resource-service/stub/src/main/proto/local/LocalService.proto
index 35dcbdf..e138633 100644
--- a/services/resource-service/stub/src/main/proto/local/LocalService.proto
+++ b/services/resource-service/stub/src/main/proto/local/LocalService.proto
@@ -27,6 +27,12 @@ import "local/LocalStorage.proto";
 service LocalStorageService {
 
     // Storage
+    rpc listLocalStorage (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorageListRequest) returns (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/local/storage"
+        };
+    }
+    
     rpc getLocalStorage (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorageGetRequest) returns (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorage) {
         option (google.api.http) = {
            get: "/v1.0/resource/local/storage"
diff --git a/services/resource-service/stub/src/main/proto/local/LocalStorage.proto b/services/resource-service/stub/src/main/proto/local/LocalStorage.proto
index 2f9ffe5..7eff691 100644
--- a/services/resource-service/stub/src/main/proto/local/LocalStorage.proto
+++ b/services/resource-service/stub/src/main/proto/local/LocalStorage.proto
@@ -23,6 +23,16 @@ package org.apache.airavata.mft.resource.stubs.local.storage;
 message LocalStorage {
     string storageId = 1;
     string agentId = 2;
+    string name = 3;
+}
+
+message LocalStorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message LocalStorageListResponse {
+    repeated LocalStorage storages = 1;
 }
 
 message LocalStorageGetRequest {
@@ -32,11 +42,13 @@ message LocalStorageGetRequest {
 message LocalStorageCreateRequest {
     string agentId = 1;
     string storageId = 2;
+    string name = 3;
 }
 
 message LocalStorageUpdateRequest {
     string storageId = 1;
     string agentId = 2;
+    string name = 3;
 }
 
 message LocalStorageDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/s3/S3Service.proto b/services/resource-service/stub/src/main/proto/s3/S3Service.proto
index f450fc2..70591b0 100644
--- a/services/resource-service/stub/src/main/proto/s3/S3Service.proto
+++ b/services/resource-service/stub/src/main/proto/s3/S3Service.proto
@@ -27,6 +27,12 @@ import "s3/S3Storage.proto";
 service S3StorageService {
 
     // Storage
+    rpc listS3Storage (org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListRequest) returns (org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/s3/storage"
+        };
+    }
+    
     rpc getS3Storage (org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageGetRequest) returns (org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage) {
         option (google.api.http) = {
            get: "/v1.0/resource/s3/storage"
diff --git a/services/resource-service/stub/src/main/proto/s3/S3Storage.proto b/services/resource-service/stub/src/main/proto/s3/S3Storage.proto
index 34b9ba7c..2228485 100644
--- a/services/resource-service/stub/src/main/proto/s3/S3Storage.proto
+++ b/services/resource-service/stub/src/main/proto/s3/S3Storage.proto
@@ -26,6 +26,16 @@ message S3Storage {
     string region = 3;
     string endpoint = 4;
     bool useTLS = 5;
+    string name = 6;
+}
+
+message S3StorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message S3StorageListResponse {
+    repeated S3Storage storages = 1;
 }
 
 message S3StorageGetRequest {
@@ -38,6 +48,7 @@ message S3StorageCreateRequest {
     string storageId = 3;
     string endpoint = 4;
     bool useTLS = 5;
+    string name = 6;
 }
 
 message S3StorageUpdateRequest {
@@ -46,6 +57,7 @@ message S3StorageUpdateRequest {
     string region = 3;
     string endpoint = 4;
     bool useTLS = 5;
+    string name = 6;
 }
 
 message S3StorageDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/scp/SCPService.proto b/services/resource-service/stub/src/main/proto/scp/SCPService.proto
index d0ca2f3..a9f8662 100644
--- a/services/resource-service/stub/src/main/proto/scp/SCPService.proto
+++ b/services/resource-service/stub/src/main/proto/scp/SCPService.proto
@@ -25,6 +25,13 @@ import "google/protobuf/empty.proto";
 import "scp/SCPStorage.proto";
 
 service SCPStorageService {
+
+    rpc listSCPStorage (org.apache.airavata.mft.resource.stubs.scp.storage.SCPStorageListRequest) returns (org.apache.airavata.mft.resource.stubs.scp.storage.SCPStorageListResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/scp/storage"
+        };
+    }
+
     rpc getSCPStorage (org.apache.airavata.mft.resource.stubs.scp.storage.SCPStorageGetRequest) returns (org.apache.airavata.mft.resource.stubs.scp.storage.SCPStorage) {
         option (google.api.http) = {
            get: "/v1.0/resource/scp/storage"
diff --git a/services/resource-service/stub/src/main/proto/scp/SCPStorage.proto b/services/resource-service/stub/src/main/proto/scp/SCPStorage.proto
index 163c0dc..dd73ed0 100644
--- a/services/resource-service/stub/src/main/proto/scp/SCPStorage.proto
+++ b/services/resource-service/stub/src/main/proto/scp/SCPStorage.proto
@@ -24,6 +24,16 @@ message SCPStorage {
     string storageId = 1;
     string host = 2;
     int32 port = 3;
+    string name = 4;
+}
+
+message SCPStorageListRequest {
+    int32 offset = 1;
+    int32 limit = 2;
+}
+
+message SCPStorageListResponse {
+    repeated SCPStorage storages = 1;
 }
 
 message SCPStorageGetRequest {
@@ -35,12 +45,14 @@ message SCPStorageCreateRequest {
     int32 port = 2;
     string user = 3;
     string storageId = 4;
+    string name = 5;
 }
 
 message SCPStorageUpdateRequest {
     string storageId = 1;
     string host = 2;
     int32 port = 3;
+    string name = 4;
 }
 
 message SCPStorageDeleteRequest {