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
commit c43566349d41ca408f4c7b17d74f54a404e6dcbe Author: Gopi Kiran <[email protected]> AuthorDate: Wed Apr 29 16:09:47 2020 -0400 FTP secret grpc method implementation and reading resources from different backends --- .../mft/secret/server/backend/SecretBackend.java | 5 ++ .../backend/airavata/AiravataSecretBackend.java | 19 ++++++++ .../backend/file/FileBasedSecretBackend.java | 42 +++++++++++++++++ .../server/backend/sql/SQLSecretBackend.java | 28 ++++++++++++ .../server/backend/sql/entity/FTPSecretEntity.java | 48 ++++++++++++++++++++ .../sql/repository/FTPSecretRepository.java | 10 ++++ .../server/handler/SecretServiceHandler.java | 53 ++++++++++++++++++++++ 7 files changed, 205 insertions(+) diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java index 248f45b..81319ab 100644 --- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java +++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java @@ -55,4 +55,9 @@ public interface SecretBackend { public DropboxSecret createDropboxSecret(DropboxSecretCreateRequest request) throws Exception; public boolean updateDropboxSecret(DropboxSecretUpdateRequest request) throws Exception; public boolean deleteDropboxSecret(DropboxSecretDeleteRequest request) throws Exception; + + Optional<FTPSecret> getFTPSecret(FTPSecretGetRequest request) throws Exception; + FTPSecret createFTPSecret(FTPSecretCreateRequest request) throws Exception; + boolean updateFTPSecret(FTPSecretUpdateRequest request) throws Exception; + boolean deleteFTPSecret(FTPSecretDeleteRequest request) throws Exception; } diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java index 83e8147..f2835df 100644 --- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java +++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java @@ -180,5 +180,24 @@ public class AiravataSecretBackend implements SecretBackend { throw new UnsupportedOperationException("Operation is not supported in backend"); } + @Override + public Optional<FTPSecret> getFTPSecret(FTPSecretGetRequest request) { + throw new UnsupportedOperationException("Operation is not supported in backend"); + } + + @Override + public FTPSecret createFTPSecret(FTPSecretCreateRequest request) { + throw new UnsupportedOperationException("Operation is not supported in backend"); + } + + @Override + public boolean updateFTPSecret(FTPSecretUpdateRequest request) { + throw new UnsupportedOperationException("Operation is not supported in backend"); + } + + @Override + public boolean deleteFTPSecret(FTPSecretDeleteRequest request) { + throw new UnsupportedOperationException("Operation is not supported in backend"); + } } diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java index bcd47c0..4dd23bf 100644 --- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java +++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java @@ -33,6 +33,7 @@ import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; +@SuppressWarnings("unchecked") public class FileBasedSecretBackend implements SecretBackend { private static final Logger logger = LoggerFactory.getLogger(FileBasedSecretBackend.class); @@ -292,5 +293,46 @@ public class FileBasedSecretBackend implements SecretBackend { throw new UnsupportedOperationException("Operation is not supported in backend"); } + public Optional<FTPSecret> getFTPSecret(FTPSecretGetRequest request) throws Exception { + JSONParser jsonParser = new JSONParser(); + InputStream inputStream = FileBasedSecretBackend.class.getClassLoader().getResourceAsStream(secretFile); + + if (inputStream == null) { + throw new IOException("secrets file not found"); + } + + try (InputStreamReader reader = new InputStreamReader(inputStream)) { + Object obj = jsonParser.parse(reader); + JSONArray resourceList = (JSONArray) obj; + + List<FTPSecret> ftpSecrets = (List<FTPSecret>) resourceList.stream() + .filter(resource -> "FTP".equals(((JSONObject) resource).get("type").toString())) + .map(resource -> { + JSONObject r = (JSONObject) resource; + + return FTPSecret.newBuilder() + .setSecretId(r.get("secretId").toString()) + .setUserId(r.get("userId").toString()) + .setPassword(r.get("password").toString()).build(); + + }).collect(Collectors.toList()); + return ftpSecrets.stream().filter(r -> request.getSecretId().equals(r.getSecretId())).findFirst(); + } + } + + @Override + public FTPSecret createFTPSecret(FTPSecretCreateRequest request) { + throw new UnsupportedOperationException("Operation is not supported in backend"); + } + + @Override + public boolean updateFTPSecret(FTPSecretUpdateRequest request) { + throw new UnsupportedOperationException("Operation is not supported in backend"); + } + + @Override + public boolean deleteFTPSecret(FTPSecretDeleteRequest request) { + throw new UnsupportedOperationException("Operation is not supported in backend"); + } } 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 f642f7c..23f55f0 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 @@ -18,7 +18,9 @@ package org.apache.airavata.mft.secret.server.backend.sql; 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.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.service.*; import org.dozer.DozerBeanMapper; @@ -35,6 +37,9 @@ public class SQLSecretBackend implements SecretBackend { @Autowired private SecretRepository secretRepository; + @Autowired + private FTPSecretRepository ftpSecretRepository; + private DozerBeanMapper mapper = new DozerBeanMapper(); @Override @@ -171,4 +176,27 @@ public class SQLSecretBackend implements SecretBackend { throw new UnsupportedOperationException("Operation is not supported in backend"); } + @Override + public Optional<FTPSecret> getFTPSecret(FTPSecretGetRequest request) { + Optional<FTPSecretEntity> secretEty = ftpSecretRepository.findBySecretId(request.getSecretId()); + return secretEty.map(ftpSecretEntity -> mapper.map(ftpSecretEntity, FTPSecret.newBuilder().getClass()).build()); + } + + @Override + public FTPSecret createFTPSecret(FTPSecretCreateRequest request) { + FTPSecretEntity savedEntity = ftpSecretRepository.save(mapper.map(request, FTPSecretEntity.class)); + return mapper.map(savedEntity, FTPSecret.newBuilder().getClass()).build(); + } + + @Override + public boolean updateFTPSecret(FTPSecretUpdateRequest request) { + ftpSecretRepository.save(mapper.map(request, FTPSecretEntity.class)); + return true; + } + + @Override + public boolean deleteFTPSecret(FTPSecretDeleteRequest request) { + ftpSecretRepository.deleteById(request.getSecretId()); + return true; + } } diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/FTPSecretEntity.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/FTPSecretEntity.java new file mode 100644 index 0000000..61ac8b8 --- /dev/null +++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/entity/FTPSecretEntity.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 FTPSecretEntity { + + @Id + @Column(name = "SECRET_ID") + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String secretId; + + @Column(name = "USER_ID") + private String userId; + + @Column(name = "PASSWORD") + private String password; + + public String getSecretId() { + return secretId; + } + + public void setSecretId(String secretId) { + this.secretId = secretId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/FTPSecretRepository.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/FTPSecretRepository.java new file mode 100644 index 0000000..6236389 --- /dev/null +++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/repository/FTPSecretRepository.java @@ -0,0 +1,10 @@ +package org.apache.airavata.mft.secret.server.backend.sql.repository; + +import org.apache.airavata.mft.secret.server.backend.sql.entity.FTPSecretEntity; +import org.springframework.data.repository.CrudRepository; + +import java.util.Optional; + +public interface FTPSecretRepository extends CrudRepository<FTPSecretEntity, String> { + Optional<FTPSecretEntity> findBySecretId(String secretId); +} diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SecretServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SecretServiceHandler.java index 3345db7..cac5373 100644 --- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SecretServiceHandler.java +++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SecretServiceHandler.java @@ -365,5 +365,58 @@ public class SecretServiceHandler extends SecretServiceGrpc.SecretServiceImplBas } } + @Override + public void getFTPSecret(FTPSecretGetRequest request, StreamObserver<FTPSecret> responseObserver) { + try { + this.backend.getFTPSecret(request).ifPresentOrElse(secret -> { + responseObserver.onNext(secret); + responseObserver.onCompleted(); + }, () -> responseObserver.onError(Status.INTERNAL + .withDescription("No FTP Secret with id " + request.getSecretId()) + .asRuntimeException())); + + } catch (Exception e) { + logger.error("Error in retrieving FTP Secret with id " + request.getSecretId(), e); + responseObserver.onError(Status.INTERNAL.withCause(e) + .withDescription("Error in retrieving FTP Secret with id " + request.getSecretId()) + .asRuntimeException()); + } + } + + @Override + public void createFTPSecret(FTPSecretCreateRequest request, StreamObserver<FTPSecret> responseObserver) { + try { + this.backend.createFTPSecret(request); + } catch (Exception e) { + logger.error("Error in creating FTP Secret", e); + responseObserver.onError(Status.INTERNAL.withCause(e) + .withDescription("Error in creating FTP Secret") + .asRuntimeException()); + } + } + + @Override + public void updateFTPSecret(FTPSecretUpdateRequest request, StreamObserver<Empty> responseObserver) { + try { + this.backend.updateFTPSecret(request); + } catch (Exception e) { + logger.error("Error in updating FTP Secret with id {}", request.getSecretId(), e); + responseObserver.onError(Status.INTERNAL.withCause(e) + .withDescription("Error in updating FTP Secret with id " + request.getSecretId()) + .asRuntimeException()); + } + } + + @Override + public void deleteFTPSecret(FTPSecretDeleteRequest request, StreamObserver<Empty> responseObserver) { + try { + this.backend.deleteFTPSecret(request); + } catch (Exception e) { + logger.error("Error in deleting FTP Secret with id {}", request.getSecretId(), e); + responseObserver.onError(Status.INTERNAL.withCause(e) + .withDescription("Error in deleting FTP Secret with id " + request.getSecretId()) + .asRuntimeException()); + } + } }
