FTP secret grpc method implementation and reading resources from different backends
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 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 @@
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.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 @@
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 @@
@Autowired
private SecretRepository secretRepository;
+ @Autowired
+ private FTPSecretRepository ftpSecretRepository;
+
private DozerBeanMapper mapper = new DozerBeanMapper();
@Override
@@ -171,4 +176,27 @@
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 @@
}
}
+ @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());
+ }
+ }
}