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

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


The following commit(s) were added to refs/heads/master by this push:
     new f764874  Add transfermappings
     new ec16722  Merge pull request #15 from isururanawaka/workflow_merge
f764874 is described below

commit f7648743014a75190d3327443c2175c1b8cb28c1
Author: Isuru Ranawaka <[email protected]>
AuthorDate: Tue Jul 6 17:36:23 2021 -0400

    Add transfermappings
---
 .../java/org/apache/airavata/drms/api/Client.java  |  40 ++-
 .../drms/api/handlers/ResourceServiceHandler.java  |  25 +-
 .../handlers/StoragePreferenceServiceHandler.java  | 320 ++++++++++++++++-----
 .../src/main/resources/application.properties      |   3 +-
 .../AnyStoragePreferenceDeserializer.java          |   2 +-
 .../deserializer/TransferMappingDeserializer.java  |  57 ++++
 .../preference/StoragePreferenceService.proto      | 133 ++++++---
 7 files changed, 458 insertions(+), 122 deletions(-)

diff --git 
a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/Client.java
 
b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/Client.java
index 24f8c34..e0e9428 100644
--- 
a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/Client.java
+++ 
b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/Client.java
@@ -20,11 +20,10 @@ import com.google.protobuf.Struct;
 import com.google.protobuf.util.JsonFormat;
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
-import org.apache.airavata.datalake.drms.AuthCredentialType;
-import org.apache.airavata.datalake.drms.AuthenticatedUser;
 import org.apache.airavata.datalake.drms.DRMSServiceAuthToken;
 import org.apache.airavata.datalake.drms.resource.GenericResource;
 import org.apache.airavata.datalake.drms.storage.*;
+import 
org.apache.airavata.datalake.drms.storage.preference.ssh.SSHStoragePreference;
 import org.apache.custos.clients.CustosClientProvider;
 import org.apache.custos.identity.management.client.IdentityManagementClient;
 import org.json.JSONObject;
@@ -114,7 +113,34 @@ public class Client {
 //
 //        
storagePreferenceServiceBlockingStub.createStoragePreference(storagePreferenceCreateRequest);
 
+        TransferMapping transferMapping = TransferMapping.newBuilder()
+                .setUserId("[email protected]")
+                .setTransferScope(TransferScope.GLOBAL)
+                
.setDestinationStoragePreference(AnyStoragePreference.newBuilder()
+                        
.setSshStoragePreference(SSHStoragePreference.newBuilder()
+                                
.setStoragePreferenceId("ssh_storage_preference").build()))
+                .setSourceStoragePreference(AnyStoragePreference.newBuilder()
+                        
.setSshStoragePreference(SSHStoragePreference.newBuilder()
+                                
.setStoragePreferenceId("ssh_storage_preference_2").build()))
+                .build();
+
+        CreateTransferMappingRequest request = 
CreateTransferMappingRequest.newBuilder()
+                .setAuthToken(authToken)
+                .setTransferMapping(transferMapping)
+                .build();
 
+        FindTransferMappingsRequest findTransferMappingsRequest = 
FindTransferMappingsRequest.newBuilder()
+                .setAuthToken(authToken)
+                .build();
+
+        DeleteTransferMappingRequest transferMappingRequest = 
DeleteTransferMappingRequest.newBuilder()
+                .setAuthToken(authToken)
+                .setId("ssh_storage_preference_2_ssh_storage_preference")
+                .build();
+
+//        
storagePreferenceServiceBlockingStub.deleteTransferMappings(transferMappingRequest);
+
+        storagePreferenceServiceBlockingStub.createTransferMapping(request);
         ResourceServiceGrpc.ResourceServiceBlockingStub 
resourceServiceBlockingStub = ResourceServiceGrpc.newBlockingStub(channel);
 
 //        ResourceSearchQuery query = 
ResourceSearchQuery.newBuilder().setField("type").setValue("COLLECTION").build();
@@ -153,11 +179,11 @@ public class Client {
 //                        .setTenantId("custos-whedmgamitu357p4wuke-10002708"))
 //                
.setAuthCredentialType(AuthCredentialType.AGENT_ACCOUNT_CREDENTIAL)
 //                .build();
-        ResourceCreateRequest resourceCreateRequest = 
ResourceCreateRequest.newBuilder()
-                .setAuthToken(authToken)
-                .setResource(genericResource)
-                .build();
-        resourceServiceBlockingStub.createResource(resourceCreateRequest);
+//        ResourceCreateRequest resourceCreateRequest = 
ResourceCreateRequest.newBuilder()
+//                .setAuthToken(authToken)
+//                .setResource(genericResource)
+//                .build();
+//        resourceServiceBlockingStub.createResource(resourceCreateRequest);
 
 
 //        System.out.println(authToken.getAccessToken());
diff --git 
a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
 
b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
index ad345de..750b885 100644
--- 
a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
+++ 
b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/ResourceServiceHandler.java
@@ -140,7 +140,7 @@ public class ResourceServiceHandler extends 
ResourceServiceGrpc.ResourceServiceI
 
             if (exEntity.isPresent()) {
                 serializedMap.put("description", 
exEntity.get().getDescription());
-                serializedMap.put("name", exEntity.get().getName());
+                serializedMap.put("resourceName", exEntity.get().getName());
                 serializedMap.put("createdTime", 
String.valueOf(exEntity.get().getCreatedAt()));
                 serializedMap.put("tenantId", callUser.getTenantId());
                 serializedMap.put("entityId", exEntity.get().getId());
@@ -148,15 +148,12 @@ public class ResourceServiceHandler extends 
ResourceServiceGrpc.ResourceServiceI
                 serializedMap.put("lastModifiedTime", 
exEntity.get().getCreatedAt());
                 serializedMap.put("owner", exEntity.get().getOwnerId());
 
-
-                HashMap<String, Object> hashMap = new HashMap<>();
-
                 if (!storagePreferenceId.isEmpty()) {
                     
this.neo4JConnector.mergeNodesWithParentChildRelationShip(serializedMap, new 
HashMap<>(),
                             request.getResource().getType(), 
StoragePreferenceConstants.STORAGE_PREFERENCE_LABEL,
                             callUser.getUsername(), entityId, 
storagePreferenceId, callUser.getTenantId());
                 } else {
-                    this.neo4JConnector.mergeNode(hashMap, 
request.getResource().getType(),
+                    this.neo4JConnector.mergeNode(serializedMap, 
request.getResource().getType(),
                             callUser.getUsername(), entityId, 
callUser.getTenantId());
                 }
             } else {
@@ -181,9 +178,17 @@ public class ResourceServiceHandler extends 
ResourceServiceGrpc.ResourceServiceI
             List<Record> records = this.neo4JConnector.searchNodes(exProps, 
query);
 
             List<GenericResource> genericResourceList = 
GenericResourceDeserializer.deserializeList(records);
+            GenericResource genericResource = genericResourceList.get(0);
+            if (genericResource.getPropertiesMap().containsKey("name")) {
+                genericResource = genericResource.toBuilder()
+                        
.setResourceName(genericResource.getPropertiesMap().get("name")).build();
+            } else if 
(genericResource.getPropertiesMap().containsKey("resourceName")) {
+                genericResource = genericResource.toBuilder()
+                        
.setResourceName(genericResource.getPropertiesMap().get("resourceName")).build();
+            }
             ResourceCreateResponse response = ResourceCreateResponse
                     .newBuilder()
-                    .setResource(genericResourceList.get(0))
+                    .setResource(genericResource)
                     .build();
             responseObserver.onNext(response);
             responseObserver.onCompleted();
@@ -457,9 +462,9 @@ public class ResourceServiceHandler extends 
ResourceServiceGrpc.ResourceServiceI
                 userProps.put("tenantId", callUser.getTenantId());
                 userProps.put("entityId", resource.getResourceId());
                 userProps.put("childEntityId", childResource.getResourceId());
-                String query = "MATCH  (r:" + resource.getType() + "), (cr:" + 
childResource.getType() + ")  where " +
+                String query = "MATCH (cr:" + childResource.getType() + 
")-[crel:CHILD_OF]->(r:" + resource.getType() + ")  where " +
                         " r.entityId = $entityId AND r.tenantId = $tenantId  
AND cr.entityId = $childEntityId AND cr.tenantId = $tenantId " +
-                        " MATCH (cr)-[crel:CHILD_OF]->(r) delete crel";
+                        "delete crel";
                 this.neo4JConnector.runTransactionalQuery(userProps, query);
             });
 
@@ -514,6 +519,10 @@ public class ResourceServiceHandler extends 
ResourceServiceGrpc.ResourceServiceI
                     builder.putAllProperties(genericResourceMap);
                     responseObserver.onNext(builder.build());
                     responseObserver.onCompleted();
+                } else {
+                    ParentResourcesFetchResponse.Builder builder = 
ParentResourcesFetchResponse.newBuilder();
+                    responseObserver.onNext(builder.build());
+                    responseObserver.onCompleted();
                 }
             } else {
                 String msg = " Don't have access to change memberships";
diff --git 
a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/StoragePreferenceServiceHandler.java
 
b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/StoragePreferenceServiceHandler.java
index 4548745..ef07212 100644
--- 
a/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/StoragePreferenceServiceHandler.java
+++ 
b/data-resource-management-service/drms-api/src/main/java/org/apache/airavata/drms/api/handlers/StoragePreferenceServiceHandler.java
@@ -17,6 +17,7 @@
 package org.apache.airavata.drms.api.handlers;
 
 import com.google.protobuf.Empty;
+import io.grpc.Status;
 import io.grpc.stub.StreamObserver;
 import org.apache.airavata.datalake.drms.AuthenticatedUser;
 import org.apache.airavata.datalake.drms.storage.*;
@@ -25,6 +26,7 @@ import org.apache.airavata.drms.core.Neo4JConnector;
 import org.apache.airavata.drms.core.constants.StorageConstants;
 import org.apache.airavata.drms.core.constants.StoragePreferenceConstants;
 import 
org.apache.airavata.drms.core.deserializer.AnyStoragePreferenceDeserializer;
+import org.apache.airavata.drms.core.deserializer.TransferMappingDeserializer;
 import org.apache.airavata.drms.core.serializer.AnyStoragePreferenceSerializer;
 import org.apache.airavata.drms.core.serializer.AnyStorageSerializer;
 import org.apache.custos.clients.CustosClientProvider;
@@ -57,48 +59,54 @@ public class StoragePreferenceServiceHandler extends 
StoragePreferenceServiceGrp
 
     @Override
     public void fetchStoragePreference(StoragePreferenceFetchRequest request, 
StreamObserver<StoragePreferenceFetchResponse> responseObserver) {
-        AuthenticatedUser callUser = 
request.getAuthToken().getAuthenticatedUser();
+        try {
+            AuthenticatedUser callUser = 
request.getAuthToken().getAuthenticatedUser();
 
-        Map<String, Object> userProps = new HashMap<>();
-        userProps.put("username", callUser.getUsername());
-        userProps.put("tenantId", callUser.getTenantId());
-        userProps.put("storagePreferenceId", request.getStoragePreferenceId());
+            Map<String, Object> userProps = new HashMap<>();
+            userProps.put("username", callUser.getUsername());
+            userProps.put("tenantId", callUser.getTenantId());
+            userProps.put("storagePreferenceId", 
request.getStoragePreferenceId());
 
-        List<Record> records = this.neo4JConnector.searchNodes(userProps,
-                " MATCH (u:User) where u.username = $username AND u.tenantId = 
$tenantId" +
-                        " OPTIONAL MATCH 
(u)<-[:SHARED_WITH]-(s1:Storage)<-[:CHILD_OF]->(sp1:StoragePreference) where 
sp1.storagePreferenceId = $storagePreferenceId" +
-                        " OPTIONAL MATCH 
(cg:Group)-[:CHILD_OF*]->(g:Group)<-[:MEMBER_OF]-(u)" +
-                        " OPTIONAL MATCH 
(sp2:StoragePreference)-[:CHILD_OF]->(s2:Storage)-[:SHARED_WITH]->(cg) where 
sp2.storagePreferenceId = $storagePreferenceId" +
-                        " OPTIONAL MATCH 
(sp3:StoragePreference)-[:CHILD_OF]->(s3:Storage)-[:SHARED_WITH]->(g) where 
sp3.storagePreferenceId = $storagePreferenceId" +
-                        " OPTIONAL MATCH 
(s4:Storage)<-[:CHILD_OF]->(sp4:StoragePreference)-[:SHARED_WITH]->(u) where 
sp4.storagePreferenceId = $storagePreferenceId" +
-                        " OPTIONAL MATCH 
(s5:Storage)<-[:CHILD_OF]->(sp5:StoragePreference)-[:SHARED_WITH]->(cg) where 
sp5.storagePreferenceId = $storagePreferenceId" +
-                        " OPTIONAL MATCH 
(s6:Storage)<-[:CHILD_OF]->(sp6:StoragePreference)-[:SHARED_WITH]->(g) where 
sp6.storagePreferenceId = $storagePreferenceId" +
-                        " return distinct s1, sp1, s2, sp2, s3, sp3, s4,sp4, 
s5,sp5, s6,sp6");
+            List<Record> records = this.neo4JConnector.searchNodes(userProps,
+                    " MATCH (u:User) where u.username = $username AND 
u.tenantId = $tenantId" +
+                            " OPTIONAL MATCH 
(u)<-[:SHARED_WITH]-(s1:Storage)<-[:CHILD_OF]->(sp1:StoragePreference) where 
sp1.storagePreferenceId = $storagePreferenceId" +
+                            " OPTIONAL MATCH 
(cg:Group)-[:CHILD_OF*]->(g:Group)<-[:MEMBER_OF]-(u)" +
+                            " OPTIONAL MATCH 
(sp2:StoragePreference)-[:CHILD_OF]->(s2:Storage)-[:SHARED_WITH]->(cg) where 
sp2.storagePreferenceId = $storagePreferenceId" +
+                            " OPTIONAL MATCH 
(sp3:StoragePreference)-[:CHILD_OF]->(s3:Storage)-[:SHARED_WITH]->(g) where 
sp3.storagePreferenceId = $storagePreferenceId" +
+                            " OPTIONAL MATCH 
(s4:Storage)<-[:CHILD_OF]->(sp4:StoragePreference)-[:SHARED_WITH]->(u) where 
sp4.storagePreferenceId = $storagePreferenceId" +
+                            " OPTIONAL MATCH 
(s5:Storage)<-[:CHILD_OF]->(sp5:StoragePreference)-[:SHARED_WITH]->(cg) where 
sp5.storagePreferenceId = $storagePreferenceId" +
+                            " OPTIONAL MATCH 
(s6:Storage)<-[:CHILD_OF]->(sp6:StoragePreference)-[:SHARED_WITH]->(g) where 
sp6.storagePreferenceId = $storagePreferenceId" +
+                            " return distinct s1, sp1, s2, sp2, s3, sp3, 
s4,sp4, s5,sp5, s6,sp6");
 
-        if (!records.isEmpty()) {
-            try {
-                List keyList = new ArrayList();
-                keyList.add("s1:sp1");
-                keyList.add("s2:sp2");
-                keyList.add("s3:sp3");
-                keyList.add("s4:sp4");
-                keyList.add("s5:sp5");
-                keyList.add("s6:sp6");
-                List<AnyStoragePreference> storagePrefList = 
AnyStoragePreferenceDeserializer.deserializeList(records, keyList);
-                StoragePreferenceFetchResponse.Builder builder = 
StoragePreferenceFetchResponse.newBuilder();
-                if (!storagePrefList.isEmpty()) {
-                    builder.setStoragePreference(storagePrefList.get(0));
+            if (!records.isEmpty()) {
+                try {
+                    List keyList = new ArrayList();
+                    keyList.add("s1:sp1");
+                    keyList.add("s2:sp2");
+                    keyList.add("s3:sp3");
+                    keyList.add("s4:sp4");
+                    keyList.add("s5:sp5");
+                    keyList.add("s6:sp6");
+                    List<AnyStoragePreference> storagePrefList = 
AnyStoragePreferenceDeserializer.deserializeList(records, keyList);
+                    StoragePreferenceFetchResponse.Builder builder = 
StoragePreferenceFetchResponse.newBuilder();
+                    if (!storagePrefList.isEmpty()) {
+                        builder.setStoragePreference(storagePrefList.get(0));
+                    }
+                    responseObserver.onNext(builder.build());
+                    responseObserver.onCompleted();
+                } catch (Exception e) {
+                    String msg = "Errored while searching storage preferences; 
Message:" + e.getMessage();
+                    logger.error("Errored while searching storage preferences; 
Message: {}", e.getMessage(), e);
+                    
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
                 }
-                responseObserver.onNext(builder.build());
-                responseObserver.onCompleted();
-            } catch (Exception e) {
-                String msg = "Errored while searching storage preferences; 
Message:" + e.getMessage();
-                logger.error("Errored while searching storage preferences; 
Message: {}", e.getMessage(), e);
+            } else {
+                String msg = "Could not find a storage preference with id" + 
request.getStoragePreferenceId();
+                logger.error("Could not find a storage preference with id {}", 
request.getStoragePreferenceId());
                 
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
             }
-        } else {
-            String msg = "Could not find a storage preference with id" + 
request.getStoragePreferenceId();
-            logger.error("Could not find a storage preference with id {}", 
request.getStoragePreferenceId());
+        } catch (Exception e) {
+            String msg = "Errored while searching storage preferences; 
Message:" + e.getMessage();
+            logger.error("Errored while searching storage preferences; 
Message: {}", e.getMessage(), e);
             
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
@@ -206,46 +214,224 @@ public class StoragePreferenceServiceHandler extends 
StoragePreferenceServiceGrp
 
     @Override
     public void searchStoragePreference(StoragePreferenceSearchRequest 
request, StreamObserver<StoragePreferenceSearchResponse> responseObserver) {
-        AuthenticatedUser callUser = 
request.getAuthToken().getAuthenticatedUser();
+        try {
+            AuthenticatedUser callUser = 
request.getAuthToken().getAuthenticatedUser();
+
+            Map<String, Object> userProps = new HashMap<>();
+            userProps.put("username", callUser.getUsername());
+            userProps.put("tenantId", callUser.getTenantId());
+
+            List<Record> records = this.neo4JConnector.searchNodes(userProps,
+                    " MATCH (u:User) where u.username = $username AND 
u.tenantId = $tenantId" +
+                            " OPTIONAL MATCH 
(u)<-[:SHARED_WITH]-(s1:Storage)<-[:CHILD_OF]->(sp1:StoragePreference)" +
+                            " OPTIONAL MATCH 
(cg:Group)-[:CHILD_OF*]->(g:Group)<-[:MEMBER_OF]-(u)" +
+                            " OPTIONAL MATCH 
(sp2:StoragePreference)-[:CHILD_OF]->(s2:Storage)-[:SHARED_WITH]->(cg) " +
+                            " OPTIONAL MATCH 
(sp3:StoragePreference)-[:CHILD_OF]->(s3:Storage)-[:SHARED_WITH]->(g)" +
+                            " OPTIONAL MATCH 
(s4:Storage)<-[:CHILD_OF]->(sp4:StoragePreference)-[:SHARED_WITH]->(u)" +
+                            " OPTIONAL MATCH 
(s5:Storage)<-[:CHILD_OF]->(sp5:StoragePreference)-[:SHARED_WITH]->(cg)" +
+                            " OPTIONAL MATCH 
(s6:Storage)<-[:CHILD_OF]->(sp6:StoragePreference)-[:SHARED_WITH]->(g)" +
+                            " return distinct s1, sp1, s2, sp2, s3, sp3, 
s4,sp4, s5,sp5, s6,sp6");
+            if (!records.isEmpty()) {
+                try {
+                    List keyList = new ArrayList();
+                    keyList.add("s1:sp1");
+                    keyList.add("s2:sp2");
+                    keyList.add("s3:sp3");
+                    keyList.add("s4:sp4");
+                    keyList.add("s5:sp5");
+                    keyList.add("s6:sp6");
+                    List<AnyStoragePreference> storagePrefList = 
AnyStoragePreferenceDeserializer.deserializeList(records, keyList);
+                    StoragePreferenceSearchResponse.Builder builder = 
StoragePreferenceSearchResponse.newBuilder();
+                    builder.addAllStoragesPreference(storagePrefList);
+                    responseObserver.onNext(builder.build());
+                    responseObserver.onCompleted();
+                } catch (Exception e) {
+                    String msg = "Errored while searching storage preferences; 
Message:" + e.getMessage();
+                    logger.error("Errored while searching storage preferences; 
Message: {}", e.getMessage(), e);
+                    
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+                }
+            } else {
+                
responseObserver.onNext(StoragePreferenceSearchResponse.newBuilder().build());
+                responseObserver.onCompleted();
+            }
+        } catch (Exception e) {
+            String msg = "Errored while searching storage preferences; 
Message:" + e.getMessage();
+            logger.error("Errored while searching storage preferences; 
Message: {}", e.getMessage(), e);
+            
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void createTransferMapping(CreateTransferMappingRequest request, 
StreamObserver<CreateTransferMappingResponse> responseObserver) {
+        try {
+            AuthenticatedUser authenticatedUser = 
request.getAuthToken().getAuthenticatedUser();
+            AnyStoragePreference sourceStoragePreference = 
request.getTransferMapping().getSourceStoragePreference();
+            AnyStoragePreference destinationStoragePreference = 
request.getTransferMapping().getDestinationStoragePreference();
+            String sourceId = getStorageId(sourceStoragePreference);
+            String destinationId = getStorageId(destinationStoragePreference);
+
+            TransferScope scope = 
request.getTransferMapping().getTransferScope();
+            Map<String, Object> properties = new HashMap<>();
+            Map<String, Object> props = new HashMap<>();
+            props.put("tenantId", authenticatedUser.getTenantId());
+            props.put("owner", authenticatedUser.getUsername());
+            props.put("srcStoragePreferenceId", sourceId);
+            props.put("dstStoragePreferenceId", destinationId);
+            String entityId = sourceId + "_" + destinationId;
+            if (scope.equals(TransferScope.GLOBAL)) {
+                props.put("scope", TransferScope.GLOBAL.name());
+            } else {
+                props.put("scope", TransferScope.USER.name());
+            }
+            properties.put("props", props);
+            properties.put("tenantId", authenticatedUser.getTenantId());
+            properties.put("entityId", entityId);
+            properties.put("username", authenticatedUser.getUsername());
+            properties.put("srcStoragePreferenceId", sourceId);
+            properties.put("dstStoragePreferenceId", destinationId);
+            properties.put("owner", authenticatedUser.getUsername());
+
+
+            if (hasAccess(authenticatedUser.getUsername(), 
authenticatedUser.getTenantId(), sourceId) &&
+                    hasAccess(authenticatedUser.getUsername(), 
authenticatedUser.getTenantId(), destinationId)) {
+                String query = " Match (u:User), (srcSp:StoragePreference), 
(dstSp:StoragePreference) where " +
+                        " u.username=$username AND u.tenantId=$tenantId AND " +
+                        "srcSp.storagePreferenceId=$srcStoragePreferenceId AND 
" +
+                        "srcSp.tenantId = $tenantId AND 
dstSp.storagePreferenceId=$dstStoragePreferenceId " +
+                        "AND dstSp.tenantId =$tenantId " +
+                        " Merge 
(u)-[:HAS_TRANSFER_MAPPING]->(tm:TransferMapping{entityId:$entityId, 
tenantId:$tenantId, " +
+                        "srcStoragePreferenceId:$srcStoragePreferenceId," +
+                        
"dstStoragePreferenceId:$dstStoragePreferenceId,owner:$owner}) set tm += 
$props" +
+                        " Merge (tm)<-[:TRANSFER_OUT]-(srcSp)" +
+                        " Merge (tm)-[:TRANSFER_IN]->(dstSp) return (tm)";
+                this.neo4JConnector.runTransactionalQuery(properties, query);
+
+                String searchQuery = " Match (srcStr:Storage)<-[:CHILD_OF]-" +
+                        
"(srcSp:StoragePreference)-[:TRANSFER_OUT]->(tm:TransferMapping)" +
+                        
"-[:TRANSFER_IN]->(dstSp:StoragePreference)-[:CHILD_OF]->(dstStr:Storage)  
where " +
+                        " tm.entityId=$entityId AND tm.tenantId=$tenantId 
return srcStr, srcSp, dstStr, dstSp, tm";
+                List<Record> records = 
this.neo4JConnector.searchNodes(properties, searchQuery);
+                if (!records.isEmpty()) {
+                    List<TransferMapping> transferMappings = 
TransferMappingDeserializer.deserializeList(records);
+                    if (!transferMappings.isEmpty()) {
+                        CreateTransferMappingResponse response = 
CreateTransferMappingResponse
+                                .newBuilder()
+                                .setTransferMapping(transferMappings.get(0))
+                                .build();
+                        responseObserver.onNext(response);
+                        responseObserver.onCompleted();
+                    } else {
+                        String msg = "Errored while creating transfer mapping; 
Message:";
+                        logger.error("Errored while creating transfer mapping; 
Message:");
+                        
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+                    }
+                } else {
+                    String msg = "Errored while creating transfer mapping; 
Message:";
+                    logger.error("Errored while creating transfer mapping; 
Message:");
+                    
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+                }
+            } else {
+                String msg = "User does not have permission to create mapping 
";
+                logger.error("User does not have permission to create mapping 
");
+                
responseObserver.onError(Status.PERMISSION_DENIED.withDescription(msg).asRuntimeException());
+
+            }
+        } catch (Exception e) {
+            String msg = "Errored while creating transfer mapping; Message:" + 
e.getMessage();
+            logger.error("Errored while creating transfer mapping; Message: 
{}", e.getMessage(), e);
+            
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void getTransferMappings(FindTransferMappingsRequest request, 
StreamObserver<FindTransferMappingsResponse> responseObserver) {
+        try {
+            List<TransferMapping> transferMappings = new ArrayList<>();
+            AuthenticatedUser authenticatedUser = 
request.getAuthToken().getAuthenticatedUser();
+            Map<String, Object> properties = new HashMap<>();
+            properties.put("username", authenticatedUser.getUsername());
+            properties.put("tenantId", authenticatedUser.getTenantId());
+            properties.put("scope", TransferScope.USER.name());
+            String query = " MATCH 
(u:User)-[:HAS_TRANSFER_MAPPING]->(t:TransferMapping{scope:$scope}) where 
u.username = $username AND u.tenantId = $tenantId" +
+                    " Match 
(srcStr:Storage)<-[:CHILD_OF]-(srcSp:StoragePreference)-[:TRANSFER_OUT]->(t)-[:TRANSFER_IN]->(dstSp:StoragePreference)-[:CHILD_OF]->(dstStr:Storage)"
 +
+                    " return srcStr, srcSp, dstStr, dstSp, t";
+            List<Record> records = this.neo4JConnector.searchNodes(properties, 
query);
+            properties.put("scope", TransferScope.GLOBAL.name());
+            String queryFetchGlobal = "Match (srcStr:Storage)<-[:CHILD_OF]-" +
+                    
"(srcSp:StoragePreference)-[:TRANSFER_OUT]->(t:TransferMapping{scope:$scope, 
tenantId:$tenantId})-[:TRANSFER_IN]->(dstSp:StoragePreference)-[:CHILD_OF]->(dstStr:Storage)"
 +
+                    " return srcStr, srcSp, dstStr, dstSp, t";
+            List<Record> globalRecords = 
this.neo4JConnector.searchNodes(properties, queryFetchGlobal);
+            if (!records.isEmpty()) {
+                transferMappings = 
TransferMappingDeserializer.deserializeList(records);
+            }
+            if (!globalRecords.isEmpty()) {
+                
transferMappings.addAll(TransferMappingDeserializer.deserializeList(globalRecords));
+            }
+            FindTransferMappingsResponse findTransferMappingsResponse = 
FindTransferMappingsResponse
+                    .newBuilder()
+                    .addAllMappings(transferMappings)
+                    .build();
+            responseObserver.onNext(findTransferMappingsResponse);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Errored while fetching transfer mappings, Message:" 
+ ex.getMessage();
+            logger.error("Errored while fetching transfer mappings, Message: 
{}", ex.getMessage(), ex);
+            
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteTransferMappings(DeleteTransferMappingRequest request, 
StreamObserver<Empty> responseObserver) {
+        try {
+            AuthenticatedUser authenticatedUser = 
request.getAuthToken().getAuthenticatedUser();
+            String transferMappingId = request.getId();
+            Map<String, Object> properties = new HashMap<>();
+            properties.put("username", authenticatedUser.getUsername());
+            properties.put("tenantId", authenticatedUser.getTenantId());
+            properties.put("entityId", transferMappingId);
+            String query = " MATCH (u:User)-[:HAS_TRANSFER_MAPPING]->" +
+                    "(t:TransferMapping{entityId:$entityId})" +
+                    " where u.username = $username AND u.tenantId = $tenantId 
detach delete t";
+            this.neo4JConnector.runTransactionalQuery(properties, query);
+            responseObserver.onNext(Empty.newBuilder().build());
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Errored while delete transfer mappings, Message:" + 
ex.getMessage();
+            logger.error("Errored while delete transfer mappings, Message: 
{}", ex.getMessage(), ex);
+            
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
 
+    private boolean hasAccess(String username, String tenantId, String 
storagePrefId) throws Exception {
         Map<String, Object> userProps = new HashMap<>();
-        userProps.put("username", callUser.getUsername());
-        userProps.put("tenantId", callUser.getTenantId());
+        userProps.put("username", username);
+        userProps.put("tenantId", tenantId);
+        userProps.put("entityId", storagePrefId);
 
         List<Record> records = this.neo4JConnector.searchNodes(userProps,
                 " MATCH (u:User) where u.username = $username AND u.tenantId = 
$tenantId" +
-                        " OPTIONAL MATCH 
(u)<-[:SHARED_WITH]-(s1:Storage)<-[:CHILD_OF]->(sp1:StoragePreference)" +
+                        " OPTIONAL MATCH 
(u)<-[:SHARED_WITH]-(s1:Storage)<-[:CHILD_OF]->(sp1:StoragePreference{entityId:$entityId})"
 +
                         " OPTIONAL MATCH 
(cg:Group)-[:CHILD_OF*]->(g:Group)<-[:MEMBER_OF]-(u)" +
-                        " OPTIONAL MATCH 
(sp2:StoragePreference)-[:CHILD_OF]->(s2:Storage)-[:SHARED_WITH]->(cg) " +
-                        " OPTIONAL MATCH 
(sp3:StoragePreference)-[:CHILD_OF]->(s3:Storage)-[:SHARED_WITH]->(g)" +
-                        " OPTIONAL MATCH 
(s4:Storage)<-[:CHILD_OF]->(sp4:StoragePreference)-[:SHARED_WITH]->(u)" +
-                        " OPTIONAL MATCH 
(s5:Storage)<-[:CHILD_OF]->(sp5:StoragePreference)-[:SHARED_WITH]->(cg)" +
-                        " OPTIONAL MATCH 
(s6:Storage)<-[:CHILD_OF]->(sp6:StoragePreference)-[:SHARED_WITH]->(g)" +
+                        " OPTIONAL MATCH 
(sp2:StoragePreference{entityId:$entityId})-[:CHILD_OF]->(s2:Storage)-[:SHARED_WITH]->(cg)
 " +
+                        " OPTIONAL MATCH (sp3:StoragePreference 
{entityId:$entityId})-[:CHILD_OF]->(s3:Storage)-[:SHARED_WITH]->(g)" +
+                        " OPTIONAL MATCH 
(s4:Storage)<-[:CHILD_OF]->(sp4:StoragePreference{entityId:$entityId})-[:SHARED_WITH]->(u)"
 +
+                        " OPTIONAL MATCH 
(s5:Storage)<-[:CHILD_OF]->(sp5:StoragePreference{entityId:$entityId})-[:SHARED_WITH]->(cg)"
 +
+                        " OPTIONAL MATCH 
(s6:Storage)<-[:CHILD_OF]->(sp6:StoragePreference{entityId:$entityId})-[:SHARED_WITH]->(g)"
 +
                         " return distinct s1, sp1, s2, sp2, s3, sp3, s4,sp4, 
s5,sp5, s6,sp6");
         if (!records.isEmpty()) {
-            try {
-                List keyList = new ArrayList();
-                keyList.add("s1:sp1");
-                keyList.add("s2:sp2");
-                keyList.add("s3:sp3");
-                keyList.add("s4:sp4");
-                keyList.add("s5:sp5");
-                keyList.add("s6:sp6");
-                List<AnyStoragePreference> storagePrefList = 
AnyStoragePreferenceDeserializer.deserializeList(records, keyList);
-                StoragePreferenceSearchResponse.Builder builder = 
StoragePreferenceSearchResponse.newBuilder();
-                builder.addAllStoragesPreference(storagePrefList);
-                responseObserver.onNext(builder.build());
-                responseObserver.onCompleted();
-            } catch (Exception e) {
-                String msg = "Errored while searching storage preferences; 
Message:" + e.getMessage();
-                logger.error("Errored while searching storage preferences; 
Message: {}", e.getMessage(), e);
-                
responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
-        } else {
-            
responseObserver.onNext(StoragePreferenceSearchResponse.newBuilder().build());
-            responseObserver.onCompleted();
+            return true;
         }
+        return false;
     }
 
-
+    private String getStorageId(AnyStoragePreference storage) {
+        if (storage.getStorageCase()
+                
.equals(AnyStoragePreference.StorageCase.S3_STORAGE_PREFERENCE)) {
+            return storage.getS3StoragePreference().getStoragePreferenceId();
+        } else {
+            return storage.getSshStoragePreference().getStoragePreferenceId();
+        }
+    }
 }
diff --git 
a/data-resource-management-service/drms-api/src/main/resources/application.properties
 
b/data-resource-management-service/drms-api/src/main/resources/application.properties
index 2829a56..0d9237a 100644
--- 
a/data-resource-management-service/drms-api/src/main/resources/application.properties
+++ 
b/data-resource-management-service/drms-api/src/main/resources/application.properties
@@ -25,4 +25,5 @@ custos.id=custos-whedmgamitu357p4wuke-10002708
 custos.secret=mrMdl86Ia1H94cikW7CvHoh7L0ASNXQVt2aRzSIj
 custos.host=custos.scigap.org
 custos.port=31499
-grpc.port=7070
\ No newline at end of file
+grpc.port=7070
+local.grpc.port=7070
\ No newline at end of file
diff --git 
a/data-resource-management-service/drms-core/src/main/java/org/apache/airavata/drms/core/deserializer/AnyStoragePreferenceDeserializer.java
 
b/data-resource-management-service/drms-core/src/main/java/org/apache/airavata/drms/core/deserializer/AnyStoragePreferenceDeserializer.java
index 314455f..8db4031 100644
--- 
a/data-resource-management-service/drms-core/src/main/java/org/apache/airavata/drms/core/deserializer/AnyStoragePreferenceDeserializer.java
+++ 
b/data-resource-management-service/drms-core/src/main/java/org/apache/airavata/drms/core/deserializer/AnyStoragePreferenceDeserializer.java
@@ -56,7 +56,7 @@ public class AnyStoragePreferenceDeserializer {
                         try {
                             storage = 
AnyStorageDeserializer.deriveStorageFromMap(stVal.asMap());
                             AnyStoragePreference preference = 
deriveStoragePrefFromMap(spVal.asMap(), storage);
-                            storagePreferenceMap.computeIfAbsent(stVal.id(), v 
-> {
+                            storagePreferenceMap.computeIfAbsent(spVal.id(), v 
-> {
                                 return new ArrayList<AnyStoragePreference>();
                             }).add(preference);
 
diff --git 
a/data-resource-management-service/drms-core/src/main/java/org/apache/airavata/drms/core/deserializer/TransferMappingDeserializer.java
 
b/data-resource-management-service/drms-core/src/main/java/org/apache/airavata/drms/core/deserializer/TransferMappingDeserializer.java
new file mode 100644
index 0000000..461bbe8
--- /dev/null
+++ 
b/data-resource-management-service/drms-core/src/main/java/org/apache/airavata/drms/core/deserializer/TransferMappingDeserializer.java
@@ -0,0 +1,57 @@
+package org.apache.airavata.drms.core.deserializer;
+
+import org.apache.airavata.datalake.drms.storage.AnyStorage;
+import org.apache.airavata.datalake.drms.storage.AnyStoragePreference;
+import org.apache.airavata.datalake.drms.storage.TransferMapping;
+import org.apache.airavata.datalake.drms.storage.TransferScope;
+import org.neo4j.driver.Record;
+import org.neo4j.driver.Value;
+import org.neo4j.driver.internal.InternalRecord;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class TransferMappingDeserializer {
+
+    public static List<TransferMapping> deserializeList(List<Record> 
neo4jRecords) throws Exception {
+        List<TransferMapping> transferMappings = new ArrayList<>();
+        for (Record record : neo4jRecords) {
+            InternalRecord internalRecord = (InternalRecord) record;
+            List<Value> values = internalRecord.values();
+
+            if (values.size() == 5) {
+                Value srcStr = values.get(0);
+                Value srcSpr = values.get(1);
+                Value dstStr = values.get(2);
+                Value dstSp = values.get(3);
+                Value tm = values.get(4);
+
+                if (!srcStr.isNull() && !srcSpr.isNull() && !tm.isNull()
+                        && !dstStr.isNull() && !dstSp.isNull()) {
+                    AnyStorage storage = 
AnyStorageDeserializer.deriveStorageFromMap(srcStr.asMap());
+                    AnyStoragePreference srcPreference = 
AnyStoragePreferenceDeserializer
+                            .deriveStoragePrefFromMap(srcSpr.asMap(), storage);
+
+                    AnyStorage dstStorage = 
AnyStorageDeserializer.deriveStorageFromMap(dstStr.asMap());
+                    AnyStoragePreference dstPreference = 
AnyStoragePreferenceDeserializer
+                            .deriveStoragePrefFromMap(dstSp.asMap(), 
dstStorage);
+
+                    Map<String, Object> map = tm.asMap();
+                    TransferMapping transferMapping = 
TransferMapping.newBuilder()
+                            
.setTransferScope(TransferScope.valueOf(map.get("scope").toString()))
+                            .setId(map.get("entityId").toString())
+                            .setSourceStoragePreference(srcPreference)
+                            .setDestinationStoragePreference(dstPreference)
+                            .setUserId(map.get("owner").toString())
+                            .build();
+
+                    transferMappings.add(transferMapping);
+
+                }
+            }
+        }
+        return transferMappings;
+    }
+
+}
diff --git 
a/data-resource-management-service/drms-stubs/src/main/proto/preference/StoragePreferenceService.proto
 
b/data-resource-management-service/drms-stubs/src/main/proto/preference/StoragePreferenceService.proto
index 117408b..6c2c6ef 100644
--- 
a/data-resource-management-service/drms-stubs/src/main/proto/preference/StoragePreferenceService.proto
+++ 
b/data-resource-management-service/drms-stubs/src/main/proto/preference/StoragePreferenceService.proto
@@ -27,89 +27,146 @@ import "preference/S3Preference.proto";
 import "google/protobuf/empty.proto";
 
 message AnyStoragePreference {
-  oneof storage {
-    
org.apache.airavata.datalake.drms.storage.preference.ssh.SSHStoragePreference 
ssh_storage_preference = 1;
-    
org.apache.airavata.datalake.drms.storage.preference.s3.S3StoragePreference 
s3_storage_preference = 2;
-  }
+    oneof storage {
+        
org.apache.airavata.datalake.drms.storage.preference.ssh.SSHStoragePreference 
ssh_storage_preference = 1;
+        
org.apache.airavata.datalake.drms.storage.preference.s3.S3StoragePreference 
s3_storage_preference = 2;
+    }
 }
 message StoragePreferenceFetchRequest {
-  org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
-  string storage_preference_id = 2;
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    string storage_preference_id = 2;
 }
 
 message StoragePreferenceFetchResponse {
-  AnyStoragePreference storage_preference = 1;
+    AnyStoragePreference storage_preference = 1;
 }
 
 message StoragePreferenceCreateRequest {
-  org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
-  AnyStoragePreference storage_preference = 2;
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    AnyStoragePreference storage_preference = 2;
 }
 
 message StoragePreferenceCreateResponse {
-  AnyStoragePreference storage_preference = 1;
+    AnyStoragePreference storage_preference = 1;
 }
 
 message StoragePreferenceUpdateRequest {
-  org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
-  string storage_preference_id = 2;
-  AnyStoragePreference storage_preference = 3;
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    string storage_preference_id = 2;
+    AnyStoragePreference storage_preference = 3;
 }
 
 message StoragePreferenceUpdateResponse {
-  AnyStoragePreference storage_preference = 1;
+    AnyStoragePreference storage_preference = 1;
 }
 
 message StoragePreferenceDeleteRequest {
-  org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
-  string storage_preference_id = 2;
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    string storage_preference_id = 2;
 }
 
 message StoragePreferenceSearchQuery {
-  string field = 1;
-  string value = 2;
-  string options = 3; // LIKE, NOT, EQUALS, GREATER, LESS
+    string field = 1;
+    string value = 2;
+    string options = 3; // LIKE, NOT, EQUALS, GREATER, LESS
 }
 
 message StoragePreferenceSearchRequest {
-  org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
-  repeated StoragePreferenceSearchQuery queries = 2;
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    repeated StoragePreferenceSearchQuery queries = 2;
 }
 
 message StoragePreferenceSearchResponse {
-  org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
-  repeated AnyStoragePreference storages_preference = 2;
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    repeated AnyStoragePreference storages_preference = 2;
 }
 
+enum TransferScope {
+    UNKNOWN = 0;
+    GLOBAL = 1;
+    USER = 2;
+}
+
+message TransferMapping {
+    string id = 1;
+    string user_id = 2;
+    AnyStoragePreference source_storage_preference = 3;
+    AnyStoragePreference destination_storage_preference = 4;
+    TransferScope transfer_scope = 5;
+}
+
+message CreateTransferMappingRequest {
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    TransferMapping transfer_mapping = 2;
+}
+
+message CreateTransferMappingResponse {
+    TransferMapping transfer_mapping = 1;
+}
+
+message FindTransferMappingsRequest {
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    string id = 2;
+    TransferScope transfer_scope = 3;
+}
+
+message FindTransferMappingsResponse {
+    repeated TransferMapping mappings = 1;
+}
+
+message DeleteTransferMappingRequest {
+    org.apache.airavata.datalake.drms.DRMSServiceAuthToken auth_token = 1;
+    string id = 2;
+}
+
+
 service StoragePreferenceService {
 
-  rpc fetchStoragePreference (StoragePreferenceFetchRequest) returns 
(StoragePreferenceFetchResponse) {
-    option (google.api.http) = {
+    rpc fetchStoragePreference (StoragePreferenceFetchRequest) returns 
(StoragePreferenceFetchResponse) {
+        option (google.api.http) = {
       get: "/v1.0/api/drms/storagePreference"
     };
-  }
+    }
 
-  rpc createStoragePreference (StoragePreferenceCreateRequest) returns 
(StoragePreferenceCreateResponse) {
-    option (google.api.http) = {
+    rpc createStoragePreference (StoragePreferenceCreateRequest) returns 
(StoragePreferenceCreateResponse) {
+        option (google.api.http) = {
       post: "/v1.0/api/drms/storagePreference"
     };
-  }
+    }
 
-  rpc updateStoragePreference (StoragePreferenceUpdateRequest) returns 
(StoragePreferenceUpdateResponse) {
-    option (google.api.http) = {
+    rpc updateStoragePreference (StoragePreferenceUpdateRequest) returns 
(StoragePreferenceUpdateResponse) {
+        option (google.api.http) = {
       put: "/v1.0/api/drms/storagePreference"
     };
-  }
+    }
 
-  rpc deletePreferenceStorage (StoragePreferenceDeleteRequest) returns 
(google.protobuf.Empty) {
-    option (google.api.http) = {
+    rpc deletePreferenceStorage (StoragePreferenceDeleteRequest) returns 
(google.protobuf.Empty) {
+        option (google.api.http) = {
       delete: "/v1.0/api/drms/storagePreference"
     };
-  }
+    }
 
-  rpc searchStoragePreference (StoragePreferenceSearchRequest) returns 
(StoragePreferenceSearchResponse) {
-    option (google.api.http) = {
+    rpc searchStoragePreference (StoragePreferenceSearchRequest) returns 
(StoragePreferenceSearchResponse) {
+        option (google.api.http) = {
       post: "/v1.0/api/drms/storagePreference/searchPreference"
     };
-  }
+    }
+
+    rpc createTransferMapping (CreateTransferMappingRequest) returns 
(CreateTransferMappingResponse) {
+        option (google.api.http) = {
+      post: "/v1.0/api/drms/storagePreference/transferMapping"
+    };
+    }
+
+    rpc getTransferMappings (FindTransferMappingsRequest) returns 
(FindTransferMappingsResponse) {
+        option (google.api.http) = {
+      get: "/v1.0/api/drms/storagePreference/transferMapping"
+    };
+    }
+
+    rpc deleteTransferMappings (DeleteTransferMappingRequest) returns 
(google.protobuf.Empty) {
+        option (google.api.http) = {
+      delete: "/v1.0/api/drms/storagePreference/transferMapping"
+    };
+    }
 }
\ No newline at end of file

Reply via email to