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 01:42:36 UTC

[airavata-mft] branch master updated: Adding an API to keep storage to secret mapping

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 d5ec3ce  Adding an API to keep storage to secret mapping
d5ec3ce is described below

commit d5ec3ce5cb65dd918e0cf29a794b091037e280dc
Author: Dimuthu Wannipurage <di...@gmail.com>
AuthorDate: Fri Mar 11 20:42:21 2022 -0500

    Adding an API to keep storage to secret mapping
---
 .../command/line/sub/s3/S3ResourceSubCommand.java  |  12 +++
 .../mft/resource/client/StorageServiceClient.java  |   5 +
 .../resource/server/backend/ResourceBackend.java   |   7 ++
 .../backend/airavata/AiravataResourceBackend.java  |  26 +++++
 .../backend/datalake/DatalakeResourceBackend.java  |  26 +++++
 .../backend/file/FileBasedResourceBackend.java     |  26 +++++
 .../server/backend/sql/SQLResourceBackend.java     |  39 +++++++-
 .../backend/sql/entity/GenericResourceEntity.java  |   2 +
 .../backend/sql/entity/LocalStorageEntity.java     |   2 +
 .../backend/sql/entity/StorageSecretEntity.java    |  58 +++++++++++
 .../sql/repository/StorageSecretRepository.java    |  12 +++
 .../server/handler/StorageSecretHandler.java       | 108 +++++++++++++++++++++
 .../distribution/conf/applicationContext.xml       |   2 +-
 .../proto/resourcesecretmap/StorageSecretMap.proto | 107 ++++++++++++++++++++
 .../server/backend/sql/SQLSecretBackend.java       |  29 ++++--
 .../server/backend/sql/entity/S3SecretEntity.java  |  48 +++++++++
 .../backend/sql/repository/S3SecretRepository.java |  11 +++
 ...retRepository.java => SCPSecretRepository.java} |   2 +-
 .../secret/server/handler/S3ServiceHandler.java    |   6 +-
 .../src/main/resources/applicationContext.xml      |   2 +-
 .../distribution/conf/applicationContext.xml       |   2 +-
 21 files changed, 514 insertions(+), 18 deletions(-)

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 eb2d7b6..fb5bbff 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,9 @@ 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.storage.stubs.storagesecret.StorageSecret;
+import org.apache.airavata.mft.storage.stubs.storagesecret.StorageSecretCreateRequest;
+import org.apache.airavata.mft.storage.stubs.storagesecret.StorageSecretServiceGrpc;
 import picocli.CommandLine;
 
 @CommandLine.Command(name = "remote")
@@ -36,6 +39,7 @@ public class S3ResourceSubCommand {
 
         System.out.println("Adding S3 Storage");
         S3StorageServiceGrpc.S3StorageServiceBlockingStub s3StorageClient = mftApiClient.getStorageServiceClient().s3();
+        StorageSecretServiceGrpc.StorageSecretServiceBlockingStub storageSecretClient = mftApiClient.getStorageServiceClient().storageSecret();
 
         S3Storage s3Storage = s3StorageClient.createS3Storage(S3StorageCreateRequest.newBuilder()
                 .setStorageId(remoteName)
@@ -44,8 +48,16 @@ public class S3ResourceSubCommand {
                 .setUseTLS("Y".equals(useTLS))
                 .setRegion(region).build());
 
+
         System.out.println("Successfully created the remote " + remoteName);
 
+        StorageSecret storageSecret = storageSecretClient.createStorageSecret(StorageSecretCreateRequest.newBuilder()
+                .setStorageId(s3Storage.getStorageId())
+                .setSecretId(s3Secret.getSecretId())
+                .setType(StorageSecret.StorageType.S3).build());
+
+        System.out.println("Created the storage secret " + storageSecret.getId());
+
     }
 
     @CommandLine.Command(name = "delete")
diff --git a/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/StorageServiceClient.java b/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/StorageServiceClient.java
index 3b31d83..b632b92 100644
--- a/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/StorageServiceClient.java
+++ b/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/StorageServiceClient.java
@@ -9,6 +9,7 @@ import org.apache.airavata.mft.resource.service.gcs.GCSStorageServiceGrpc;
 import org.apache.airavata.mft.resource.service.local.LocalStorageServiceGrpc;
 import org.apache.airavata.mft.resource.service.s3.S3StorageServiceGrpc;
 import org.apache.airavata.mft.resource.service.scp.SCPStorageServiceGrpc;
+import org.apache.airavata.mft.storage.stubs.storagesecret.StorageSecretServiceGrpc;
 
 import java.io.Closeable;
 import java.io.IOException;
@@ -21,6 +22,10 @@ public class StorageServiceClient implements Closeable {
         this.channel = channel;
     }
 
+    public StorageSecretServiceGrpc.StorageSecretServiceBlockingStub storageSecret() {
+        return StorageSecretServiceGrpc.newBlockingStub(channel);
+    }
+
     public SCPStorageServiceGrpc.SCPStorageServiceBlockingStub scp() {
         return SCPStorageServiceGrpc.newBlockingStub(channel);
     }
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 b66da78..36b851f 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
@@ -26,6 +26,7 @@ import org.apache.airavata.mft.resource.stubs.gcs.storage.*;
 import org.apache.airavata.mft.resource.stubs.local.storage.*;
 import org.apache.airavata.mft.resource.stubs.s3.storage.*;
 import org.apache.airavata.mft.resource.stubs.scp.storage.*;
+import org.apache.airavata.mft.storage.stubs.storagesecret.*;
 
 import java.util.Optional;
 
@@ -39,6 +40,12 @@ public interface ResourceBackend {
     public boolean updateGenericResource(GenericResourceUpdateRequest request) throws Exception;
     public boolean deleteGenericResource(GenericResourceDeleteRequest request) throws Exception;
 
+    public Optional<StorageSecret> getStorageSecret(StorageSecretGetRequest request) throws Exception;
+    public StorageSecret createStorageSecret(StorageSecretCreateRequest request) throws Exception;
+    public boolean updateStorageSecret(StorageSecretUpdateRequest request) throws Exception;
+    public boolean deleteStorageSecret(StorageSecretDeleteRequest request) throws Exception;
+    public Optional<StorageSecret> searchStorageSecret(StorageSecretSearchRequest 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;
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 9e670d9..2cc29df 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
@@ -27,6 +27,7 @@ import org.apache.airavata.mft.resource.stubs.gcs.storage.*;
 import org.apache.airavata.mft.resource.stubs.local.storage.*;
 import org.apache.airavata.mft.resource.stubs.s3.storage.*;
 import org.apache.airavata.mft.resource.stubs.scp.storage.*;
+import org.apache.airavata.mft.storage.stubs.storagesecret.*;
 import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
 import org.apache.airavata.model.appcatalog.storageresource.StorageResourceDescription;
 import org.apache.airavata.model.data.movement.DataMovementInterface;
@@ -89,6 +90,31 @@ public class AiravataResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public Optional<StorageSecret> getStorageSecret(StorageSecretGetRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public StorageSecret createStorageSecret(StorageSecretCreateRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public boolean updateStorageSecret(StorageSecretUpdateRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public boolean deleteStorageSecret(StorageSecretDeleteRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public Optional<StorageSecret> searchStorageSecret(StorageSecretSearchRequest request) throws Exception {
+        return Optional.empty();
+    }
+
+    @Override
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest request) throws Exception {
 
         String resourceId = request.getStorageId();
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 931f6db..5a961e2 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
@@ -39,6 +39,7 @@ import org.apache.airavata.mft.resource.stubs.gcs.storage.*;
 import org.apache.airavata.mft.resource.stubs.local.storage.*;
 import org.apache.airavata.mft.resource.stubs.s3.storage.*;
 import org.apache.airavata.mft.resource.stubs.scp.storage.*;
+import org.apache.airavata.mft.storage.stubs.storagesecret.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -176,6 +177,31 @@ public class DatalakeResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public Optional<StorageSecret> getStorageSecret(StorageSecretGetRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public StorageSecret createStorageSecret(StorageSecretCreateRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public boolean updateStorageSecret(StorageSecretUpdateRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public boolean deleteStorageSecret(StorageSecretDeleteRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public Optional<StorageSecret> searchStorageSecret(StorageSecretSearchRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest 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 c1d5255..3d9be58 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
@@ -27,6 +27,7 @@ import org.apache.airavata.mft.resource.stubs.gcs.storage.*;
 import org.apache.airavata.mft.resource.stubs.local.storage.*;
 import org.apache.airavata.mft.resource.stubs.s3.storage.*;
 import org.apache.airavata.mft.resource.stubs.scp.storage.*;
+import org.apache.airavata.mft.storage.stubs.storagesecret.*;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -155,6 +156,31 @@ public class FileBasedResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public Optional<StorageSecret> getStorageSecret(StorageSecretGetRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public StorageSecret createStorageSecret(StorageSecretCreateRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public boolean updateStorageSecret(StorageSecretUpdateRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public boolean deleteStorageSecret(StorageSecretDeleteRequest request) throws Exception {
+        throw new UnsupportedOperationException("Operation is not supported in backend");
+    }
+
+    @Override
+    public Optional<StorageSecret> searchStorageSecret(StorageSecretSearchRequest request) throws Exception {
+        return Optional.empty();
+    }
+
+    @Override
     public Optional<SCPStorage> getSCPStorage(SCPStorageGetRequest 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 5703e91..26cfbdb 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
@@ -29,13 +29,12 @@ import org.apache.airavata.mft.resource.stubs.gcs.storage.*;
 import org.apache.airavata.mft.resource.stubs.local.storage.*;
 import org.apache.airavata.mft.resource.stubs.s3.storage.*;
 import org.apache.airavata.mft.resource.stubs.scp.storage.*;
+import org.apache.airavata.mft.storage.stubs.storagesecret.*;
 import org.dozer.DozerBeanMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.repository.CrudRepository;
 
-import javax.el.ELException;
 import java.util.Optional;
 
 public class SQLResourceBackend implements ResourceBackend {
@@ -57,6 +56,9 @@ public class SQLResourceBackend implements ResourceBackend {
     @Autowired
     private LocalStorageRepository localStorageRepository;
 
+    @Autowired
+    private StorageSecretRepository resourceSecretRepository;
+
     private DozerBeanMapper mapper = new DozerBeanMapper();
 
     @Override
@@ -172,6 +174,36 @@ public class SQLResourceBackend implements ResourceBackend {
     }
 
     @Override
+    public Optional<StorageSecret> getStorageSecret(StorageSecretGetRequest request) throws Exception {
+        Optional<StorageSecretEntity> resourceSecEty = resourceSecretRepository.findById(request.getId());
+        return resourceSecEty.map(ety -> mapper.map(ety, StorageSecret.newBuilder().getClass()).build());
+    }
+
+    @Override
+    public StorageSecret createStorageSecret(StorageSecretCreateRequest request) throws Exception {
+        StorageSecretEntity savedEntity = resourceSecretRepository.save(mapper.map(request, StorageSecretEntity.class));
+        return mapper.map(savedEntity, StorageSecret.newBuilder().getClass()).build();
+    }
+
+    @Override
+    public boolean updateStorageSecret(StorageSecretUpdateRequest request) throws Exception {
+        resourceSecretRepository.save(mapper.map(request, StorageSecretEntity.class));
+        return true;
+    }
+
+    @Override
+    public boolean deleteStorageSecret(StorageSecretDeleteRequest request) throws Exception {
+        resourceSecretRepository.deleteById(request.getId());
+        return false;
+    }
+
+    @Override
+    public Optional<StorageSecret> searchStorageSecret(StorageSecretSearchRequest request) throws Exception {
+        //resourceSecretRepository.findByStorageId();
+        return Optional.empty();
+    }
+
+    @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());
@@ -191,7 +223,8 @@ public class SQLResourceBackend implements ResourceBackend {
 
     @Override
     public boolean deleteSCPStorage(SCPStorageDeleteRequest request) {
-        //scpStorageRepository.delete(request.getStorageId());
+        scpStorageRepository.deleteById(request.getStorageId());
+        resourceRepository.deleteByStorageIdAndStorageType(request.getStorageId(), GenericResourceEntity.StorageType.SCP);
         return true;
     }
 
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/GenericResourceEntity.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/GenericResourceEntity.java
index 12c8e69..4829fdc 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/GenericResourceEntity.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/GenericResourceEntity.java
@@ -3,9 +3,11 @@ package org.apache.airavata.mft.resource.server.backend.sql.entity;
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.Column;
+import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 
+@Entity
 public class GenericResourceEntity {
 
     public enum ResourceType {
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 4ca7735..4197f12 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
@@ -3,9 +3,11 @@ package org.apache.airavata.mft.resource.server.backend.sql.entity;
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.Column;
+import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 
+@Entity
 public class LocalStorageEntity {
 
     @Id
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/StorageSecretEntity.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/StorageSecretEntity.java
new file mode 100644
index 0000000..b4dd381
--- /dev/null
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/entity/StorageSecretEntity.java
@@ -0,0 +1,58 @@
+package org.apache.airavata.mft.resource.server.backend.sql.entity;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class StorageSecretEntity {
+    @Id
+    @Column(name = "RESOURCE_SECRET_ID")
+    @GeneratedValue(generator = "uuid")
+    @GenericGenerator(name = "uuid", strategy = "uuid2")
+    private String id;
+
+    @Column(name = "STORAGE_ID")
+    private String storageId;
+
+    @Column(name = "SECRET_ID")
+    private String secretId;
+
+    @Column(name = "STORAGE_TYPE")
+    private String type;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getStorageId() {
+        return storageId;
+    }
+
+    public void setStorageId(String storageId) {
+        this.storageId = storageId;
+    }
+
+    public String getSecretId() {
+        return secretId;
+    }
+
+    public void setSecretId(String secretId) {
+        this.secretId = secretId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/StorageSecretRepository.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/StorageSecretRepository.java
new file mode 100644
index 0000000..d544311
--- /dev/null
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/sql/repository/StorageSecretRepository.java
@@ -0,0 +1,12 @@
+package org.apache.airavata.mft.resource.server.backend.sql.repository;
+
+import org.apache.airavata.mft.resource.server.backend.sql.entity.StorageSecretEntity;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.Optional;
+
+public interface StorageSecretRepository extends CrudRepository<StorageSecretEntity, String> {
+
+    public Optional<StorageSecretEntity> findByStorageId(String storageId);
+    public void deleteByStorageId(String resourceId);
+}
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/StorageSecretHandler.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/StorageSecretHandler.java
new file mode 100644
index 0000000..514dbf4
--- /dev/null
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/handler/StorageSecretHandler.java
@@ -0,0 +1,108 @@
+package org.apache.airavata.mft.resource.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.resource.server.backend.ResourceBackend;
+import org.apache.airavata.mft.storage.stubs.storagesecret.*;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class StorageSecretHandler extends StorageSecretServiceGrpc.StorageSecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(StorageSecretHandler.class);
+
+    @Autowired
+    private ResourceBackend backend;
+
+    @Override
+    public void getStorageSecret(StorageSecretGetRequest request, StreamObserver<StorageSecret> responseObserver) {
+        try {
+            this.backend.getStorageSecret(request).ifPresentOrElse(resource -> {
+                responseObserver.onNext(resource);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No storage secret with id " + request.getId())
+                        .asRuntimeException());
+            });
+        } catch (Exception e) {
+            logger.error("Failed in retrieving storage secret with id {}", request.getId(), e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in retrieving storage secret with id " + request.getId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void searchStorageSecret(StorageSecretSearchRequest request, StreamObserver<StorageSecretSearchResponse> responseObserver) {
+        try {
+            this.backend.searchStorageSecret(request).ifPresentOrElse(resource -> {
+                StorageSecretSearchResponse response = StorageSecretSearchResponse.newBuilder()
+                        .setStorageSecret(resource).build();
+                responseObserver.onNext(response);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No storage secret with storage id " + request.getStorageId())
+                        .asRuntimeException());
+            });
+        } catch (Exception e) {
+            logger.error("Failed in retrieving storage secret with storage id {}", request.getStorageId(), e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in retrieving storage secret with storage id " + request.getStorageId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void createStorageSecret(StorageSecretCreateRequest request, StreamObserver<StorageSecret> responseObserver) {
+        try {
+            responseObserver.onNext(this.backend.createStorageSecret(request));
+            responseObserver.onCompleted();
+        } catch (Exception e) {
+            logger.error("Failed in creating the storage secret", e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in creating the storage secret")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateStorageSecret(StorageSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.updateStorageSecret(request);
+            responseObserver.onCompleted();
+        } catch (Exception e) {
+            logger.error("Failed in updating the storage secret {}", request.getStorageSecret().getId(), e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in updating the S3 storage with id " + request.getStorageSecret().getId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteStorageSecret(StorageSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            boolean res = this.backend.deleteStorageSecret(request);
+            if (res) {
+                responseObserver.onCompleted();
+            } else {
+                responseObserver.onError(new Exception("Failed to delete storage secret with id " + request.getId()));
+            }
+        } catch (Exception e) {
+            logger.error("Failed in deleting the storage secret {}", request.getId(), e);
+
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Failed in deleting the storage secret with id " + request.getId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/resource-service/server/src/main/resources/distribution/conf/applicationContext.xml b/services/resource-service/server/src/main/resources/distribution/conf/applicationContext.xml
index ffd46d7..3ea3c25 100644
--- a/services/resource-service/server/src/main/resources/distribution/conf/applicationContext.xml
+++ b/services/resource-service/server/src/main/resources/distribution/conf/applicationContext.xml
@@ -6,6 +6,6 @@
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
 
-    <bean id="resourceBackend" class="org.apache.airavata.mft.resource.server.backend.file.FileBasedResourceBackend"
+    <bean id="resourceBackend" class="org.apache.airavata.mft.resource.server.backend.sql.SQLResourceBackend"
           init-method="init" destroy-method="destroy"></bean>
 </beans>
\ No newline at end of file
diff --git a/services/resource-service/stub/src/main/proto/resourcesecretmap/StorageSecretMap.proto b/services/resource-service/stub/src/main/proto/resourcesecretmap/StorageSecretMap.proto
new file mode 100644
index 0000000..678271d
--- /dev/null
+++ b/services/resource-service/stub/src/main/proto/resourcesecretmap/StorageSecretMap.proto
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.airavata.mft.storage.stubs.storagesecret;
+
+import "CredCommon.proto";
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+
+message StorageSecret {
+    string id = 1;
+    string storageId = 2;
+    string secretId = 3;
+    enum StorageType {
+        S3 = 0;
+        SCP = 1;
+        FTP = 2;
+        LOCAL = 3;
+        BOX = 4;
+        DROPBOX = 5;
+        GCS = 6;
+        AZURE = 7;
+    }
+    StorageType type = 4;
+}
+
+message StorageSecretCreateRequest {
+    string storageId = 1;
+    string secretId = 2;
+    StorageSecret.StorageType type = 3;
+    org.apache.airavata.mft.common.AuthToken authzToken = 4;
+}
+
+message StorageSecretDeleteRequest {
+    string id =1;
+    org.apache.airavata.mft.common.AuthToken authzToken = 2;
+}
+
+message StorageSecretUpdateRequest {
+    StorageSecret storageSecret = 1;
+    org.apache.airavata.mft.common.AuthToken authzToken = 2;
+}
+
+message StorageSecretGetRequest {
+    string id = 1;
+    org.apache.airavata.mft.common.AuthToken authzToken = 2;
+}
+
+message StorageSecretSearchRequest {
+    string storageId = 1;
+    StorageSecret.StorageType type = 2;
+    org.apache.airavata.mft.common.AuthToken authzToken = 3;
+}
+
+message StorageSecretSearchResponse {
+    StorageSecret storageSecret = 1;
+}
+
+service StorageSecretService {
+    rpc getStorageSecret (StorageSecretGetRequest) returns (StorageSecret) {
+        option (google.api.http) = {
+           get: "/v1.0/storagesecret"
+        };
+    }
+
+    rpc searchStorageSecret (StorageSecretSearchRequest) returns (StorageSecretSearchResponse) {
+        option (google.api.http) = {
+           get: "/v1.0/storagesecret/search"
+        };
+    }
+
+    rpc createStorageSecret (StorageSecretCreateRequest) returns (StorageSecret) {
+        option (google.api.http) = {
+           post: "/v1.0/storagesecret"
+        };
+    }
+
+    rpc updateStorageSecret (StorageSecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           post: "/v1.0/storagesecret"
+        };
+    }
+
+    rpc deleteStorageSecret (StorageSecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/storagesecret"
+        };
+    }
+}
+
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
index 8a1ab66..197b004 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
@@ -26,9 +26,11 @@ import org.apache.airavata.mft.credential.stubs.s3.*;
 import org.apache.airavata.mft.credential.stubs.scp.*;
 import org.apache.airavata.mft.secret.server.backend.SecretBackend;
 import org.apache.airavata.mft.secret.server.backend.sql.entity.FTPSecretEntity;
+import org.apache.airavata.mft.secret.server.backend.sql.entity.S3SecretEntity;
 import org.apache.airavata.mft.secret.server.backend.sql.entity.SCPSecretEntity;
 import org.apache.airavata.mft.secret.server.backend.sql.repository.FTPSecretRepository;
-import org.apache.airavata.mft.secret.server.backend.sql.repository.SecretRepository;
+import org.apache.airavata.mft.secret.server.backend.sql.repository.S3SecretRepository;
+import org.apache.airavata.mft.secret.server.backend.sql.repository.SCPSecretRepository;
 import org.dozer.DozerBeanMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,11 +43,14 @@ public class SQLSecretBackend implements SecretBackend {
     private static final Logger logger = LoggerFactory.getLogger(SQLSecretBackend.class);
 
     @Autowired
-    private SecretRepository secretRepository;
+    private SCPSecretRepository scpSecretRepository;
 
     @Autowired
     private FTPSecretRepository ftpSecretRepository;
 
+    @Autowired
+    private S3SecretRepository s3SecretRepository;
+
     private DozerBeanMapper mapper = new DozerBeanMapper();
 
     @Override
@@ -60,46 +65,50 @@ public class SQLSecretBackend implements SecretBackend {
 
     @Override
     public Optional<SCPSecret> getSCPSecret(SCPSecretGetRequest request) {
-        Optional<SCPSecretEntity> secretEty = secretRepository.findBySecretId(request.getSecretId());
+        Optional<SCPSecretEntity> secretEty = scpSecretRepository.findBySecretId(request.getSecretId());
         return secretEty.map(scpSecretEntity -> mapper.map(scpSecretEntity, SCPSecret.newBuilder().getClass()).build());
     }
 
     @Override
     public SCPSecret createSCPSecret(SCPSecretCreateRequest request) {
-        SCPSecretEntity savedEntity = secretRepository.save(mapper.map(request, SCPSecretEntity.class));
+        SCPSecretEntity savedEntity = scpSecretRepository.save(mapper.map(request, SCPSecretEntity.class));
         return mapper.map(savedEntity, SCPSecret.newBuilder().getClass()).build();
     }
 
     @Override
     public boolean updateSCPSecret(SCPSecretUpdateRequest request) {
-        secretRepository.save(mapper.map(request, SCPSecretEntity.class));
+        scpSecretRepository.save(mapper.map(request, SCPSecretEntity.class));
         return true;
     }
 
     @Override
     public boolean deleteSCPSecret(SCPSecretDeleteRequest request) {
-        secretRepository.deleteById(request.getSecretId());
+        scpSecretRepository.deleteById(request.getSecretId());
         return true;
     }
 
     @Override
     public Optional<S3Secret> getS3Secret(S3SecretGetRequest request) throws Exception {
-        throw new UnsupportedOperationException("Operation is not supported in backend");
+        Optional<S3SecretEntity> secretEty = s3SecretRepository.findBySecretId(request.getSecretId());
+        return secretEty.map(s3SecretEntity -> mapper.map(s3SecretEntity, S3Secret.newBuilder().getClass()).build());
     }
 
     @Override
     public S3Secret createS3Secret(S3SecretCreateRequest request) throws Exception {
-        throw new UnsupportedOperationException("Operation is not supported in backend");
+        S3SecretEntity savedEntity = s3SecretRepository.save(mapper.map(request, S3SecretEntity.class));
+        return mapper.map(savedEntity, S3Secret.newBuilder().getClass()).build();
     }
 
     @Override
     public boolean updateS3Secret(S3SecretUpdateRequest request) throws Exception {
-        throw new UnsupportedOperationException("Operation is not supported in backend");
+        s3SecretRepository.save(mapper.map(request, S3SecretEntity.class));
+        return true;
     }
 
     @Override
     public boolean deleteS3Secret(S3SecretDeleteRequest request) throws Exception {
-        throw new UnsupportedOperationException("Operation is not supported in backend");
+        s3SecretRepository.deleteById(request.getSecretId());
+        return true;
     }
 
     @Override
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/S3SecretEntity.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/S3SecretEntity.java
new file mode 100644
index 0000000..75490ed
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/S3SecretEntity.java
@@ -0,0 +1,48 @@
+package org.apache.airavata.mft.secret.server.backend.sql.entity;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class S3SecretEntity {
+
+    @Id
+    @Column(name = "SECRET_ID")
+    @GeneratedValue(generator = "uuid")
+    @GenericGenerator(name = "uuid", strategy = "uuid2")
+    private String secretId;
+
+    @Column(name = "ACCESS_KEY")
+    private String accessKey;
+
+    @Column(name = "SECRET_KEY")
+    private String secretKey;
+
+    public String getSecretId() {
+        return secretId;
+    }
+
+    public void setSecretId(String secretId) {
+        this.secretId = secretId;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/S3SecretRepository.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/S3SecretRepository.java
new file mode 100644
index 0000000..016b790
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/S3SecretRepository.java
@@ -0,0 +1,11 @@
+package org.apache.airavata.mft.secret.server.backend.sql.repository;
+
+import org.apache.airavata.mft.secret.server.backend.sql.entity.S3SecretEntity;
+import org.apache.airavata.mft.secret.server.backend.sql.entity.SCPSecretEntity;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.Optional;
+
+public interface S3SecretRepository extends CrudRepository<S3SecretEntity, String> {
+    Optional<S3SecretEntity> findBySecretId(String resourceId);
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/SecretRepository.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/SCPSecretRepository.java
similarity index 92%
rename from services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/SecretRepository.java
rename to services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/SCPSecretRepository.java
index 70bf6c9..78530d2 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/SecretRepository.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/SCPSecretRepository.java
@@ -22,6 +22,6 @@ import org.springframework.data.repository.CrudRepository;
 
 import java.util.Optional;
 
-public interface SecretRepository extends CrudRepository<SCPSecretEntity, String> {
+public interface SCPSecretRepository extends CrudRepository<SCPSecretEntity, String> {
     Optional<SCPSecretEntity> findBySecretId(String resourceId);
 }
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/S3ServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/S3ServiceHandler.java
index 8dc68b5..e26083d 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/S3ServiceHandler.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/S3ServiceHandler.java
@@ -59,7 +59,9 @@ public class S3ServiceHandler extends S3SecretServiceGrpc.S3SecretServiceImplBas
     @Override
     public void createS3Secret(S3SecretCreateRequest request, StreamObserver<S3Secret> responseObserver) {
         try {
-            this.backend.createS3Secret(request);
+            S3Secret s3Secret = this.backend.createS3Secret(request);
+            responseObserver.onNext(s3Secret);
+            responseObserver.onCompleted();
         } catch (Exception e) {
             logger.error("Error in creating S3 Secret", e);
             responseObserver.onError(Status.INTERNAL.withCause(e)
@@ -72,6 +74,7 @@ public class S3ServiceHandler extends S3SecretServiceGrpc.S3SecretServiceImplBas
     public void updateS3Secret(S3SecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
         try {
             this.backend.updateS3Secret(request);
+            responseObserver.onCompleted();
         } catch (Exception e) {
             logger.error("Error in updating S3 Secret with id {}", request.getSecretId(), e);
             responseObserver.onError(Status.INTERNAL.withCause(e)
@@ -84,6 +87,7 @@ public class S3ServiceHandler extends S3SecretServiceGrpc.S3SecretServiceImplBas
     public void deleteS3Secret(S3SecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
         try {
             this.backend.deleteS3Secret(request);
+            responseObserver.onCompleted();
         } catch (Exception e) {
             logger.error("Error in deleting S3 Secret with id {}", request.getSecretId(), e);
             responseObserver.onError(Status.INTERNAL.withCause(e)
diff --git a/services/secret-service/server/src/main/resources/applicationContext.xml b/services/secret-service/server/src/main/resources/applicationContext.xml
index 9bec46c..de09438 100644
--- a/services/secret-service/server/src/main/resources/applicationContext.xml
+++ b/services/secret-service/server/src/main/resources/applicationContext.xml
@@ -8,7 +8,7 @@
 
 <!--    <bean id="resourceBackend" class="org.apache.airavata.mft.secret.server.backend.file.FileBasedSecretBackend"-->
 <!--          init-method="init" destroy-method="destroy"></bean>-->
-    <bean id="resourceBackend" class="org.apache.airavata.mft.secret.server.backend.file.FileBasedSecretBackend"
+    <bean id="resourceBackend" class="org.apache.airavata.mft.secret.server.backend.sql.SQLSecretBackend"
           init-method="init" destroy-method="destroy"></bean>
 
 </beans>
\ No newline at end of file
diff --git a/services/secret-service/server/src/main/resources/distribution/conf/applicationContext.xml b/services/secret-service/server/src/main/resources/distribution/conf/applicationContext.xml
index 9bec46c..de09438 100644
--- a/services/secret-service/server/src/main/resources/distribution/conf/applicationContext.xml
+++ b/services/secret-service/server/src/main/resources/distribution/conf/applicationContext.xml
@@ -8,7 +8,7 @@
 
 <!--    <bean id="resourceBackend" class="org.apache.airavata.mft.secret.server.backend.file.FileBasedSecretBackend"-->
 <!--          init-method="init" destroy-method="destroy"></bean>-->
-    <bean id="resourceBackend" class="org.apache.airavata.mft.secret.server.backend.file.FileBasedSecretBackend"
+    <bean id="resourceBackend" class="org.apache.airavata.mft.secret.server.backend.sql.SQLSecretBackend"
           init-method="init" destroy-method="destroy"></bean>
 
 </beans>
\ No newline at end of file