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