Add merger for updates
diff --git a/metadata-service/db-service/client/src/main/java/org/apache/airavata/datalake/metadata/clients/Test.java b/metadata-service/db-service/client/src/main/java/org/apache/airavata/datalake/metadata/clients/Test.java
index a506d75..b70c246 100644
--- a/metadata-service/db-service/client/src/main/java/org/apache/airavata/datalake/metadata/clients/Test.java
+++ b/metadata-service/db-service/client/src/main/java/org/apache/airavata/datalake/metadata/clients/Test.java
@@ -101,7 +101,36 @@
.setTenant(tenant)
.build();
- stub.createTenant(request);
+// stub.createTenant(request);
+//
+
+// ResourceMetadataServiceGrpc.ResourceMetadataServiceBlockingStub resourceMetadataServiceBlockingStub = serviceClient.resource();
+//
+// ResourcePermissionRequest permissionRequest = ResourcePermissionRequest
+// .newBuilder()
+// .setPermissionType("READ")
+// .setUsername("TestingUserA")
+// .setResourceName("R5")
+// .setTenantId("100010402")
+// .build();
+// ResourcePermissionResponse response = resourceMetadataServiceBlockingStub.hasAccess(permissionRequest);
+
+
+// TenantMetadataAPIRequest tenantMetadataAPIRequest = TenantMetadataAPIRequest
+// .newBuilder()
+// .setTenant(tenant)
+// .build();
+//
+// stub.deleteTenant(tenantMetadataAPIRequest);
+
+ tenant = tenant.toBuilder().setDomain("testing.com").build();
+
+
+ TenantMetadataAPIRequest tenantMetadataAPIRequest = TenantMetadataAPIRequest
+ .newBuilder()
+ .setTenant(tenant)
+ .build();
+ stub.updateTenant(tenantMetadataAPIRequest);
}
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/AppConfig.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/AppConfig.java
index 0e03c32..05ee7a4 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/AppConfig.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/AppConfig.java
@@ -1,15 +1,18 @@
package org.apache.airavata.datalake.metadata;
+import io.grpc.ServerInterceptor;
import org.apache.airavata.datalake.metadata.backend.Connector;
-import org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators.ResourceServiceImpl;
-import org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators.SearchOperator;
import org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators.TenantServiceImpl;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Group;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Resource;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User;
+import org.apache.airavata.datalake.metadata.interceptors.Authenticator;
+import org.apache.airavata.datalake.metadata.interceptors.InterceptorPipelineExecutor;
+import org.apache.airavata.datalake.metadata.interceptors.ServiceInterceptor;
import org.dozer.DozerBeanMapper;
import org.dozer.loader.api.BeanMappingBuilder;
+import org.lognet.springboot.grpc.GRpcGlobalInterceptor;
import org.neo4j.ogm.cypher.ComparisonOperator;
import org.neo4j.ogm.cypher.Filter;
import org.slf4j.Logger;
@@ -18,8 +21,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Stack;
@Configuration
@@ -132,26 +134,37 @@
tenant.add(resource, 0, 0, null);
TenantServiceImpl tenantService = new TenantServiceImpl(connector);
- tenantService.createOrUpdate(tenant);
+// tenantService.createOrUpdate(tenant);
Filter filter = new Filter("name", ComparisonOperator.EQUALS, "R3");
- ResourceServiceImpl resourceService = new ResourceServiceImpl(connector);
- SearchOperator searchOperator = new SearchOperator();
- searchOperator.setKey("name");
- searchOperator.setValue("R2");
- searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
- List searchList = new ArrayList<>();
- searchList.add(searchOperator);
- List<Resource> collections = (List<Resource>) resourceService.search(searchList);
- LOGGER.info("Size", collections.size());
- for (Resource collection : collections) {
- LOGGER.info("#############" + collection.getName() + "Created At" + collection.getCreatedAt());
- }
+// ResourceServiceImpl resourceService = new ResourceServiceImpl(connector);
+// SearchOperator searchOperator = new SearchOperator();
+// searchOperator.setKey("name");
+// searchOperator.setValue("R2");
+// searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+// List searchList = new ArrayList<>();
+// searchList.add(searchOperator);
+// List<Resource> collections = (List<Resource>) resourceService.search(searchList);
+// LOGGER.info("Size", collections.size());
+// for (Resource collection : collections) {
+// LOGGER.info("#############" + collection.getName() + "Created At" + collection.getCreatedAt());
+// }
return tenant;
}
+ @Bean
+ public Stack<ServiceInterceptor> getInterceptorSet(Authenticator authInterceptor) {
+ Stack<ServiceInterceptor> interceptors = new Stack<>();
+ interceptors.add(authInterceptor);
+ return interceptors;
+ }
+ @Bean
+ @GRpcGlobalInterceptor
+ ServerInterceptor validationInterceptor(Stack<ServiceInterceptor> integrationServiceInterceptors) {
+ return new InterceptorPipelineExecutor(integrationServiceInterceptors);
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/Neo4JServiceInitializer.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/Neo4JServiceInitializer.java
index 0850cc7..1e414b7 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/Neo4JServiceInitializer.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/Neo4JServiceInitializer.java
@@ -11,4 +11,6 @@
public static void main(String[] args) {
SpringApplication.run(Neo4JServiceInitializer.class, args);
}
+
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GenericService.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GenericService.java
index a199dfe..3d44dbd 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GenericService.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GenericService.java
@@ -9,14 +9,15 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.Closeable;
+import java.io.IOException;
import java.util.Collection;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
-public abstract class GenericService<T> implements Service<T> {
+public abstract class GenericService<T> implements Service<T>, Closeable {
private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
@@ -77,8 +78,8 @@
}
@Override
- public Iterable<Map<String, Object>> execute(String query) {
- return session.query(query, Collections.EMPTY_MAP);
+ public Iterable<Map<String, Object>> execute(String query, Map<String, ?> parameterMap) {
+ return session.query(query, parameterMap);
}
@Override
@@ -87,4 +88,9 @@
}
abstract Class<T> getEntityType();
+
+ @Override
+ public void close() throws IOException {
+ this.session.clear();
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupService.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupService.java
index 8e870fa..6e34f19 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupService.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupService.java
@@ -1,4 +1,5 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
public interface GroupService {
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupServiceImpl.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupServiceImpl.java
index 1b7c9ad..fcdaf9e 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupServiceImpl.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/GroupServiceImpl.java
@@ -1,7 +1,13 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
import org.apache.airavata.datalake.metadata.backend.Connector;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Group;
+import org.neo4j.ogm.cypher.ComparisonOperator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
public class GroupServiceImpl extends GenericService<Group> implements GroupService {
@@ -13,4 +19,26 @@
Class<Group> getEntityType() {
return Group.class;
}
+
+ @Override
+ public List<Group> find( Group group) {
+ List<SearchOperator> searchOperatorList = new ArrayList<>();
+ if (group.getTenantId() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("tenant_id");
+ searchOperator.setValue(group.getTenantId());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+
+ if (group.getName() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("name");
+ searchOperator.setValue(group.getName());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+ Collection<Group> groups = super.search(searchOperatorList);
+ return new ArrayList<>(groups);
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceService.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceService.java
index be6d06c..36b57eb 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceService.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceService.java
@@ -1,4 +1,8 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
public interface ResourceService {
+
+ public boolean hasAccess(String username, String resourceName, String permissionType, String tenantId);
+
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceServiceImpl.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceServiceImpl.java
index e1b8a35..fe7e2d9 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceServiceImpl.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/ResourceServiceImpl.java
@@ -1,9 +1,14 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
import org.apache.airavata.datalake.metadata.backend.Connector;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Resource;
+import org.neo4j.ogm.cypher.ComparisonOperator;
-public class ResourceServiceImpl extends GenericService<Resource> implements UserService {
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class ResourceServiceImpl extends GenericService<Resource> implements ResourceService {
public ResourceServiceImpl(Connector connector) {
super(connector);
@@ -13,4 +18,49 @@
Class<Resource> getEntityType() {
return Resource.class;
}
+
+
+ @Override
+ public boolean hasAccess(String username, String resourceName, String permissionType, String tenantId) {
+ String query =
+ "match (u:User{name:$username})-[:MEMBER_OF|HAS_CHILD_GROUP*]->(g:Group{tenant_id:$tenantId})" +
+ "-[r:HAS_ACCESS]->(m:Resource{tenant_id:$tenantId})-[l:HAS_CHILD_RESOURCE*]-> " +
+ "(p:Resource{tenant_id:$tenantId}) " +
+ "where r.permission_type=$permissionType and m.name=$resourceName or p.name=$resourceName return m,p";
+ Map<String, String> parameterMap = new HashMap<>();
+ parameterMap.put("username", username);
+ parameterMap.put("permissionType", permissionType);
+ parameterMap.put("resourceName", resourceName);
+ parameterMap.put("tenantId", tenantId);
+ Iterable<Map<String, Object>> mapIterable = super.execute(query, parameterMap);
+ AtomicBoolean accessible = new AtomicBoolean(false);
+ mapIterable.forEach(map -> {
+ if (!map.isEmpty()) {
+ accessible.set(true);
+ }
+ });
+ return accessible.get();
+ }
+
+ @Override
+ public List<Resource> find( Resource resource) {
+ List<SearchOperator> searchOperatorList = new ArrayList<>();
+ if (resource.getTenantId() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("tenant_id");
+ searchOperator.setValue(resource.getTenantId());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+
+ if (resource.getName() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("name");
+ searchOperator.setValue(resource.getName());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+ Collection<Resource> resources = super.search(searchOperatorList);
+ return new ArrayList<>(resources);
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/Service.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/Service.java
index 1694973..e1fecb7 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/Service.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/Service.java
@@ -1,5 +1,7 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant;
import org.neo4j.ogm.cypher.query.SortOrder;
import java.util.Collection;
@@ -20,8 +22,10 @@
Iterable<T> sortAndPaging(SortOrder.Direction direction, int pageNumber, int itemsPerPage, String property);
- Iterable<Map<String,Object>> execute(String query);
+ Iterable<Map<String,Object>> execute(String query, Map<String, ?> parameterMap);
void createOrUpdate(T Object);
+ public List<T> find(T entity);
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantService.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantService.java
index 1034d1a..87c5583 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantService.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantService.java
@@ -1,4 +1,6 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
public interface TenantService {
+
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantServiceImpl.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantServiceImpl.java
index fb6c776..f727997 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantServiceImpl.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/TenantServiceImpl.java
@@ -1,7 +1,13 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
import org.apache.airavata.datalake.metadata.backend.Connector;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant;
+import org.neo4j.ogm.cypher.ComparisonOperator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
public class TenantServiceImpl extends GenericService<Tenant> implements TenantService {
public TenantServiceImpl(Connector connector) {
@@ -12,4 +18,32 @@
Class<Tenant> getEntityType() {
return Tenant.class;
}
+
+ @Override
+ public List<Tenant> find(Tenant tenant) {
+ List<SearchOperator> searchOperatorList = new ArrayList<>();
+ if (tenant.getTenantId() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("tenant_id");
+ searchOperator.setValue(tenant.getTenantId());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+
+ if (tenant.getName() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("name");
+ searchOperator.setValue(tenant.getName());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+ Collection<Tenant> tenants = super.search(searchOperatorList);
+ return new ArrayList<>(tenants);
+ }
+
+
+ @Override
+ public void createOrUpdate(Tenant tenant) {
+ super.createOrUpdate(tenant);
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserService.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserService.java
index 737b93a..6efded7 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserService.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserService.java
@@ -1,4 +1,5 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators;
public interface UserService {
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserServiceImpl.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserServiceImpl.java
index 542cce3..7d24263 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserServiceImpl.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/curd/operators/UserServiceImpl.java
@@ -2,6 +2,11 @@
import org.apache.airavata.datalake.metadata.backend.Connector;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User;
+import org.neo4j.ogm.cypher.ComparisonOperator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
public class UserServiceImpl extends GenericService<User> implements UserService {
@@ -13,4 +18,27 @@
Class<User> getEntityType() {
return User.class;
}
+
+
+ @Override
+ public List<User> find(User user) {
+ List<SearchOperator> searchOperatorList = new ArrayList<>();
+ if (user.getTenantId() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("tenant_id");
+ searchOperator.setValue(user.getTenantId());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+
+ if (user.getUsername() != null) {
+ SearchOperator searchOperator = new SearchOperator();
+ searchOperator.setKey("username");
+ searchOperator.setValue(user.getUsername());
+ searchOperator.setComparisonOperator(ComparisonOperator.EQUALS);
+ searchOperatorList.add(searchOperator);
+ }
+ Collection<User> users = super.search(searchOperatorList);
+ return new ArrayList<>(users);
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/model/nodes/Entity.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/model/nodes/Entity.java
index aba5035..c1a2bcc 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/model/nodes/Entity.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/backend/neo4j/model/nodes/Entity.java
@@ -1,6 +1,7 @@
package org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.relationships.Has;
+import org.apache.airavata.datalake.metadata.parsers.ExecutionContext;
import org.neo4j.ogm.annotation.*;
import java.util.HashMap;
@@ -35,6 +36,9 @@
@Property(name = "tenant_id")
private String tenantId;
+ @Transient
+ private ExecutionContext executionContext;
+
public Long getId() {
@@ -113,4 +117,12 @@
public String getSearchableId() {
return primaryExternalKey+"@"+tenantId;
}
+
+ public ExecutionContext getExecutionContext() {
+ return executionContext;
+ }
+
+ public void setExecutionContext(ExecutionContext executionContext) {
+ this.executionContext = executionContext;
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/GroupServiceHandler.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/GroupServiceHandler.java
index fb46b49..e6efab6 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/GroupServiceHandler.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/GroupServiceHandler.java
@@ -3,36 +3,91 @@
import io.grpc.stub.StreamObserver;
import org.apache.airavata.datalake.metadata.service.*;
import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@GRpcService
public class GroupServiceHandler extends GroupMetadataServiceGrpc.GroupMetadataServiceImplBase {
+ private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceHandler.class);
+
@Override
- public void createGroup(GroupMetadataAPIRequest request, StreamObserver<GroupMetadataAPIResponse> responseObserver) {
- super.createGroup(request, responseObserver);
+ public void createGroup(GroupMetadataAPIRequest request,
+ StreamObserver<GroupMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while creating group " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void getGroup(GroupMetadataAPIRequest request, StreamObserver<Group> responseObserver) {
- super.getGroup(request, responseObserver);
+ public void getGroup(GroupMetadataAPIRequest request,
+ StreamObserver<Group> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while fetching group " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void updateGroup(GroupMetadataAPIRequest request, StreamObserver<GroupMetadataAPIResponse> responseObserver) {
- super.updateGroup(request, responseObserver);
+ public void updateGroup(GroupMetadataAPIRequest request,
+ StreamObserver<GroupMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while updating group " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void deleteGroup(GroupMetadataAPIRequest request, StreamObserver<GroupMetadataAPIResponse> responseObserver) {
- super.deleteGroup(request, responseObserver);
+ public void deleteGroup(GroupMetadataAPIRequest request,
+ StreamObserver<GroupMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while deleting group " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void createGroupMemberships(GroupMembershipAPIRequest request, StreamObserver<GroupMetadataAPIResponse> responseObserver) {
- super.createGroupMemberships(request, responseObserver);
+ public void createGroupMemberships(GroupMembershipAPIRequest request,
+ StreamObserver<GroupMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while creating group memberships " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void deleteGroupMemberships(GroupMembershipAPIRequest request, StreamObserver<GroupMetadataAPIResponse> responseObserver) {
- super.deleteGroupMemberships(request, responseObserver);
+ public void deleteGroupMemberships(GroupMembershipAPIRequest request,
+ StreamObserver<GroupMetadataAPIResponse> responseObserver) {
+ try {
+
+
+
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while deleting group memberships " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/ResourceServiceHandler.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/ResourceServiceHandler.java
index 1de7898..1009fb1 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/ResourceServiceHandler.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/ResourceServiceHandler.java
@@ -1,38 +1,125 @@
package org.apache.airavata.datalake.metadata.handlers;
import io.grpc.stub.StreamObserver;
+import org.apache.airavata.datalake.metadata.backend.Connector;
+import org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators.ResourceServiceImpl;
+import org.apache.airavata.datalake.metadata.parsers.ResourceParser;
import org.apache.airavata.datalake.metadata.service.*;
+import org.dozer.DozerBeanMapper;
import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
@GRpcService
public class ResourceServiceHandler extends ResourceMetadataServiceGrpc.ResourceMetadataServiceImplBase {
+ private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceHandler.class);
+ @Autowired
+ private DozerBeanMapper dozerBeanMapper;
+
+ @Autowired
+ private ResourceParser resourceParser;
+
+ @Autowired
+ private Connector connector;
+
+
@Override
- public void createResource(ResourceMetadataAPIRequest request, StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
- super.createResource(request, responseObserver);
+ public void createResource(ResourceMetadataAPIRequest request,
+ StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while creating tenant " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void getResource(ResourceMetadataAPIRequest request, StreamObserver<Resource> responseObserver) {
- super.getResource(request, responseObserver);
+ public void getResource(ResourceMetadataAPIRequest request,
+ StreamObserver<Resource> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while fetching tenant " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void updateResource(ResourceMetadataAPIRequest request, StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
- super.updateResource(request, responseObserver);
+ public void updateResource(ResourceMetadataAPIRequest request,
+ StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while updating tenant " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void deleteResource(ResourceMetadataAPIRequest request, StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
- super.deleteResource(request, responseObserver);
+ public void deleteResource(ResourceMetadataAPIRequest request,
+ StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while deleting tenant " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void shareResource(ResourceMetadataSharingRequest request, StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
- super.shareResource(request, responseObserver);
+ public void shareResource(ResourceMetadataSharingRequest request,
+ StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while sharing resource " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
}
@Override
- public void deleteSharing(ResourceMetadataSharingRequest request, StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
- super.deleteSharing(request, responseObserver);
+ public void deleteSharing(ResourceMetadataSharingRequest request,
+ StreamObserver<ResourceMetadataAPIResponse> responseObserver) {
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while delete sharing " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
+ }
+ }
+
+ @Override
+ public void hasAccess(ResourcePermissionRequest request,
+ StreamObserver<ResourcePermissionResponse> responseObserver) {
+ try {
+ ResourceServiceImpl resourceService = new ResourceServiceImpl(connector);
+ boolean accessible = resourceService.hasAccess(request.getUsername(),
+ request.getResourceName(), request.getPermissionType(),
+ request.getTenantId());
+
+ ResourcePermissionResponse response = ResourcePermissionResponse
+ .newBuilder()
+ .setAccessible(accessible)
+ .build();
+ responseObserver.onNext(response);
+ responseObserver.onCompleted();
+ } catch (Exception ex) {
+
+ }
+
}
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/TenantServiceHandler.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/TenantServiceHandler.java
index 66a2f42..aef3115 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/TenantServiceHandler.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/TenantServiceHandler.java
@@ -4,16 +4,16 @@
import org.apache.airavata.datalake.metadata.backend.Connector;
import org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators.TenantServiceImpl;
import org.apache.airavata.datalake.metadata.parsers.TenantParser;
-import org.apache.airavata.datalake.metadata.service.Tenant;
-import org.apache.airavata.datalake.metadata.service.TenantMetadataAPIRequest;
-import org.apache.airavata.datalake.metadata.service.TenantMetadataAPIResponse;
-import org.apache.airavata.datalake.metadata.service.TenantMetadataServiceGrpc;
+import org.apache.airavata.datalake.metadata.service.*;
import org.dozer.DozerBeanMapper;
import org.lognet.springboot.grpc.GRpcService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import java.util.List;
+import java.util.stream.Collectors;
+
@GRpcService
public class TenantServiceHandler extends TenantMetadataServiceGrpc.TenantMetadataServiceImplBase {
private static final Logger LOGGER = LoggerFactory.getLogger(TenantServiceHandler.class);
@@ -27,14 +27,14 @@
@Autowired
private Connector connector;
+
@Override
public void createTenant(TenantMetadataAPIRequest request,
StreamObserver<TenantMetadataAPIResponse> responseObserver) {
try {
Tenant tenant = request.getTenant();
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant parsedTenant =
- (org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant)
- tenantParser.parse(tenant);
+ tenantParser.parse(tenant);
TenantServiceImpl tenantService = new TenantServiceImpl(connector);
tenantService.createOrUpdate(parsedTenant);
@@ -51,12 +51,31 @@
@Override
public void getTenant(TenantMetadataAPIRequest request,
- StreamObserver<Tenant> responseObserver) {
+ StreamObserver<FindTenantResponse> responseObserver) {
try {
+ Tenant tenant = request.getTenant();
+ org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant parsedTenant = tenantParser
+ .parse(tenant);
+ TenantServiceImpl tenantService = new TenantServiceImpl(connector);
+ List<org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant> tenantList =
+ tenantService.find(parsedTenant);
+
+ if (tenantList.isEmpty()) {
+ responseObserver.onCompleted();
+ }
+
+ List<Tenant> tenants = tenantList.stream().map(t -> {
+ return tenantParser.parse(t);
+ }).collect(Collectors.toList());
+
+ FindTenantResponse response = FindTenantResponse.newBuilder().addAllTenants(tenants).build();
+ responseObserver.onNext(response);
} catch (Exception ex) {
-
+ String msg = "Exception occurred while fetching tenant " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
}
}
@@ -65,9 +84,30 @@
StreamObserver<TenantMetadataAPIResponse> responseObserver) {
try {
+ TenantServiceImpl tenantService = new TenantServiceImpl(connector);
+ Tenant tenant = request.getTenant();
+ org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant parsedTenant =
+ tenantParser
+ .parseAndMerge(tenant);
+
+
+ List<org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant> tenantList =
+ tenantService.find(parsedTenant);
+
+ if (tenantList.isEmpty()) {
+ responseObserver.onCompleted();
+ }
+
+ tenantService.createOrUpdate(parsedTenant);
+ TenantMetadataAPIResponse response = TenantMetadataAPIResponse.newBuilder().setStatus(true).build();
+ responseObserver.onNext(response);
+ responseObserver.onCompleted();
+
} catch (Exception ex) {
-
+ String msg = "Exception occurred while updating tenant " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
}
}
@@ -75,10 +115,28 @@
public void deleteTenant(TenantMetadataAPIRequest request,
StreamObserver<TenantMetadataAPIResponse> responseObserver) {
try {
+ Tenant tenant = request.getTenant();
+ org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant parsedTenant = tenantParser
+ .parse(tenant);
+
+ TenantServiceImpl tenantService = new TenantServiceImpl(connector);
+ List<org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant> tenantList =
+ tenantService.find(parsedTenant);
+
+ if (tenantList.isEmpty()) {
+ responseObserver.onCompleted();
+ }
+
+ tenantService.delete(tenantList.get(0).getId());
+ TenantMetadataAPIResponse response = TenantMetadataAPIResponse.newBuilder().setStatus(true).build();
+ responseObserver.onNext(response);
+ responseObserver.onCompleted();
} catch (Exception ex) {
-
+ String msg = "Exception occurred while deleting tenant " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(new Exception(msg));
}
}
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/UserServiceHandler.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/UserServiceHandler.java
index af2ceec..c4462c1 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/UserServiceHandler.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/handlers/UserServiceHandler.java
@@ -1,29 +1,67 @@
package org.apache.airavata.datalake.metadata.handlers;
+import io.grpc.Status;
import io.grpc.stub.StreamObserver;
-import org.apache.airavata.datalake.metadata.service.*;
+import org.apache.airavata.datalake.metadata.service.User;
+import org.apache.airavata.datalake.metadata.service.UserMetadataAPIRequest;
+import org.apache.airavata.datalake.metadata.service.UserMetadataAPIResponse;
+import org.apache.airavata.datalake.metadata.service.UserMetadataServiceGrpc;
import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@GRpcService
public class UserServiceHandler extends UserMetadataServiceGrpc.UserMetadataServiceImplBase {
+ private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceHandler.class);
+
@Override
public void createUser(UserMetadataAPIRequest request, StreamObserver<UserMetadataAPIResponse> responseObserver) {
- super.createUser(request, responseObserver);
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while creating user " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+ }
}
@Override
public void getUser(UserMetadataAPIRequest request, StreamObserver<User> responseObserver) {
- super.getUser(request, responseObserver);
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while fetching user " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+ }
}
@Override
public void updateUser(UserMetadataAPIRequest request, StreamObserver<UserMetadataAPIResponse> responseObserver) {
- super.updateUser(request, responseObserver);
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while updating user " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+ }
}
@Override
public void deleteUser(UserMetadataAPIRequest request, StreamObserver<UserMetadataAPIResponse> responseObserver) {
- super.deleteUser(request, responseObserver);
+ try {
+
+
+ } catch (Exception ex) {
+ String msg = "Exception occurred while deleting user " + ex;
+ LOGGER.error(msg);
+ responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+ }
}
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/Authenticator.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/Authenticator.java
new file mode 100644
index 0000000..2eeaa0e
--- /dev/null
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/Authenticator.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datalake.metadata.interceptors;
+
+import io.grpc.Metadata;
+import org.apache.airavata.datalake.metadata.AppConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Authenticator implements ServiceInterceptor {
+ private static final Logger LOGGER = LoggerFactory.getLogger(AppConfig.class);
+
+ @Override
+ public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
+ LOGGER.info("Calling interceptor #######");
+ return msg;
+ }
+
+}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/InterceptorPipelineExecutor.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/InterceptorPipelineExecutor.java
new file mode 100644
index 0000000..7e0e72a
--- /dev/null
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/InterceptorPipelineExecutor.java
@@ -0,0 +1,69 @@
+package org.apache.airavata.datalake.metadata.interceptors;
+
+import io.grpc.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Iterator;
+import java.util.Stack;
+
+/**
+ * This class execute interceptor stack sequentially
+ */
+
+public class InterceptorPipelineExecutor implements ServerInterceptor {
+ private final Logger LOGGER = LoggerFactory.getLogger(InterceptorPipelineExecutor.class);
+
+ private Stack<ServiceInterceptor> interceptorSet;
+
+ public InterceptorPipelineExecutor(Stack<ServiceInterceptor> integrationServiceInterceptors) {
+ this.interceptorSet = integrationServiceInterceptors;
+ }
+
+ @Override
+ public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall,
+ Metadata metadata, ServerCallHandler<ReqT, RespT> serverCallHandler) {
+ String fullMethod = serverCall.getMethodDescriptor().getFullMethodName();
+ String methodName = fullMethod.split("/")[1];
+ String serviceName = fullMethod.split("/")[0];
+
+ LOGGER.debug("Calling method : " + serverCall.getMethodDescriptor().getFullMethodName());
+ metadata.put(Metadata.Key.of("service-name", Metadata.ASCII_STRING_MARSHALLER), serviceName);
+
+ return new ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(serverCallHandler.startCall(serverCall, metadata)) {
+
+ ReqT resp = null;
+
+ @Override
+ public void onMessage(ReqT message) {
+ try {
+ Iterator it = interceptorSet.iterator();
+ while (it.hasNext()) {
+ ServiceInterceptor interceptor = (ServiceInterceptor) it.next();
+ resp = interceptor.intercept(methodName, metadata, (resp == null) ? message : resp);
+ }
+ super.onMessage(resp);
+ } catch (Exception ex) {
+ String msg = "Error while validating method " + methodName + ", " + ex.getMessage();
+ LOGGER.error(msg, ex);
+ serverCall.close(Status.INVALID_ARGUMENT.withDescription(msg), new Metadata());
+ }
+ }
+
+ @Override
+ public void onHalfClose() {
+ try {
+ super.onHalfClose();
+ } catch (IllegalStateException e) {
+ LOGGER.debug(e.getMessage());
+ } catch (Exception e) {
+ String msg = "Error while validating method " + methodName + ", " + e.getMessage();
+ LOGGER.error(msg);
+ serverCall.close(Status.INVALID_ARGUMENT.withDescription(msg), metadata);
+ }
+ }
+
+ };
+
+ }
+}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/ServiceInterceptor.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/ServiceInterceptor.java
new file mode 100644
index 0000000..ba05742
--- /dev/null
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/interceptors/ServiceInterceptor.java
@@ -0,0 +1,7 @@
+package org.apache.airavata.datalake.metadata.interceptors;
+
+import io.grpc.Metadata;
+
+public interface ServiceInterceptor {
+ public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg);
+}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/mergers/GenericMerger.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/mergers/GenericMerger.java
new file mode 100644
index 0000000..c3a003c
--- /dev/null
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/mergers/GenericMerger.java
@@ -0,0 +1,46 @@
+package org.apache.airavata.datalake.metadata.mergers;
+
+import org.apache.airavata.datalake.metadata.backend.Connector;
+import org.apache.airavata.datalake.metadata.backend.neo4j.curd.operators.*;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.*;
+import org.apache.airavata.datalake.metadata.parsers.ExecutionContext;
+
+import java.util.List;
+
+
+public class GenericMerger implements Merger {
+
+ private static Connector connector;
+
+ public GenericMerger(Connector connector) {
+ this.connector = connector;
+ }
+
+ @Override
+ public Entity merge(Entity entity) {
+ ExecutionContext executionContext = entity.getExecutionContext();
+ executionContext.getNeo4JConvertedModels().values().forEach(en -> {
+ List<Entity> entityList = genericService((Entity) en).find(en);
+ if (!entityList.isEmpty()) {
+ Entity exEnt = entityList.get(0);
+ ((Entity) en).setId(exEnt.getId());
+ }
+ });
+ return entity;
+ }
+
+ public static GenericService genericService(Entity entity) {
+ if (entity instanceof Tenant) {
+ return new TenantServiceImpl(connector);
+ } else if (entity instanceof Resource) {
+ return new ResourceServiceImpl(connector);
+ } else if (entity instanceof Group) {
+ return new GroupServiceImpl(connector);
+ } else if (entity instanceof User) {
+ return new UserServiceImpl(connector);
+ }
+ return null;
+ }
+
+
+}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/mergers/Merger.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/mergers/Merger.java
new file mode 100644
index 0000000..d63b2f1
--- /dev/null
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/mergers/Merger.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.mergers;
+
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
+
+public interface Merger {
+
+ public Entity merge(Entity entity);
+
+}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ExecutionContext.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ExecutionContext.java
index 0a8365a..e468237 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ExecutionContext.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ExecutionContext.java
@@ -14,4 +14,8 @@
public void addNeo4JConvertedModels(String key, Object obj) {
this.neo4JConvertedModels.put(key, obj);
}
+
+ public Map<String, Object> getNeo4JConvertedModels() {
+ return neo4JConvertedModels;
+ }
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/GroupParser.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/GroupParser.java
index f486841..06fd918 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/GroupParser.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/GroupParser.java
@@ -4,6 +4,7 @@
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Group;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User;
+import org.apache.airavata.datalake.metadata.mergers.Merger;
import org.apache.airavata.datalake.metadata.service.GroupMembership;
import org.dozer.DozerBeanMapper;
import org.slf4j.Logger;
@@ -22,7 +23,7 @@
@Override
- public Entity parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext) {
+ public Group parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext, Merger merger) {
if (entity instanceof org.apache.airavata.datalake.metadata.service.Group) {
org.apache.airavata.datalake.metadata.service.Group group = (org.apache.airavata.datalake.metadata.service.Group) entity;
Group newParentGroup = null;
@@ -31,6 +32,7 @@
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Group.class);
LOGGER.info("Creating group "+ newParentGroup.getName() + " class"+ newParentGroup.toString());
executionContext.addNeo4JConvertedModels(newParentGroup.getSearchableId(),newParentGroup);
+ newParentGroup.setExecutionContext(executionContext);
} else if (parentEntity != null){
newParentGroup = (Group) parentEntity;
Group childGroup = dozerBeanMapper.map(group,
@@ -41,7 +43,7 @@
childGroup.getCreatedAt() != 0 ? childGroup.getCreatedAt() : System.currentTimeMillis(),
childGroup.getLastModifiedAt() != 0 ? childGroup.getLastModifiedAt() : System.currentTimeMillis(),
null); // Improve this with relatioship propertie
-
+ childGroup.setExecutionContext(executionContext);
newParentGroup = childGroup;
}
@@ -66,7 +68,7 @@
Group finalNewParentGroup = newParentGroup;
groups.forEach(gr -> {
- this.parse(gr, finalNewParentGroup, executionContext);
+ this.parse(gr, finalNewParentGroup, executionContext,merger);
});
}
@@ -80,11 +82,16 @@
@Override
public Entity parse(GeneratedMessageV3 entity, ExecutionContext executionContext) {
- return this.parse(entity,null, executionContext);
+ return this.parse(entity,null, executionContext,null);
}
@Override
public Entity parse(GeneratedMessageV3 entity) {
- return this.parse(entity,null,new ExecutionContext());
+ return this.parse(entity,null,new ExecutionContext(),null);
+ }
+
+ @Override
+ public Entity parseAndMerge(GeneratedMessageV3 entity) {
+ return null;
}
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/Parser.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/Parser.java
index 9ed0683..2ce567b 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/Parser.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/Parser.java
@@ -2,12 +2,15 @@
import com.google.protobuf.GeneratedMessageV3;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
+import org.apache.airavata.datalake.metadata.mergers.Merger;
public interface Parser {
- public Entity parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext);
+ public Entity parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext, Merger merger);
public Entity parse(GeneratedMessageV3 entity, ExecutionContext executionContext);
public Entity parse(GeneratedMessageV3 entity);
+
+ public Entity parseAndMerge(GeneratedMessageV3 entity);
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ResourceParser.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ResourceParser.java
index 29a7a95..565aa6d 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ResourceParser.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/ResourceParser.java
@@ -5,6 +5,7 @@
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Group;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Resource;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User;
+import org.apache.airavata.datalake.metadata.mergers.Merger;
import org.apache.airavata.datalake.metadata.service.ResourceSharings;
import org.dozer.DozerBeanMapper;
import org.slf4j.Logger;
@@ -29,7 +30,7 @@
@Override
- public Entity parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext) {
+ public Resource parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext, Merger merger) {
if (entity instanceof org.apache.airavata.datalake.metadata.service.Resource) {
org.apache.airavata.datalake.metadata.service.Resource resource =
(org.apache.airavata.datalake.metadata.service.Resource) entity;
@@ -39,15 +40,19 @@
newParentResource = dozerBeanMapper.map(resource,
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Resource.class);
executionContext.addNeo4JConvertedModels(newParentResource.getSearchableId(), newParentResource);
+ newParentResource.setExecutionContext(executionContext);
} else {
newParentResource = (Resource) parentEntity;
+
Resource childResource = dozerBeanMapper.map(resource,
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Resource.class);
executionContext.addNeo4JConvertedModels(newParentResource.getSearchableId(), newParentResource);
+
newParentResource.addChildResource(childResource,
childResource.getCreatedAt() != 0 ? childResource.getCreatedAt() : System.currentTimeMillis(),
childResource.getLastModifiedAt() != 0 ? childResource.getLastModifiedAt() : System.currentTimeMillis(),
- null); // Improve this with relatioship properties
+ null); // Improve this with relationship properties
+ childResource.setExecutionContext(executionContext);
newParentResource = childResource;
}
@@ -102,7 +107,7 @@
if (!resources.isEmpty()) {
Resource finalNewParentResource = newParentResource;
resources.forEach(gr -> {
- this.parse(gr, finalNewParentResource, executionContext);
+ this.parse(gr, finalNewParentResource, executionContext, merger);
});
}
return newParentResource;
@@ -115,11 +120,16 @@
@Override
public Entity parse(GeneratedMessageV3 entity, ExecutionContext executionContext) {
- return this.parse(entity, null, executionContext);
+ return this.parse(entity, null, executionContext, null);
}
@Override
public Entity parse(GeneratedMessageV3 entity) {
- return this.parse(entity, null, new ExecutionContext());
+ return this.parse(entity, null, new ExecutionContext(),null);
+ }
+
+ @Override
+ public Entity parseAndMerge(GeneratedMessageV3 entity) {
+ return null;
}
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/TenantParser.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/TenantParser.java
index efba859..796273b 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/TenantParser.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/TenantParser.java
@@ -1,7 +1,11 @@
package org.apache.airavata.datalake.metadata.parsers;
import com.google.protobuf.GeneratedMessageV3;
+import org.apache.airavata.datalake.metadata.backend.Connector;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant;
+import org.apache.airavata.datalake.metadata.mergers.GenericMerger;
+import org.apache.airavata.datalake.metadata.mergers.Merger;
import org.apache.airavata.datalake.metadata.service.Group;
import org.apache.airavata.datalake.metadata.service.Resource;
import org.apache.airavata.datalake.metadata.service.User;
@@ -29,8 +33,12 @@
@Autowired
private ResourceParser resourceParser;
+ @Autowired
+ private Connector connector;
+
+
@Override
- public Entity parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext) {
+ public Tenant parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext, Merger merger) {
if (entity instanceof org.apache.airavata.datalake.metadata.service.Tenant) {
org.apache.airavata.datalake.metadata.service.Tenant tenant =
@@ -44,14 +52,14 @@
dozerBeanMapper.map(tenant,
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Tenant.class);
neo4JTenant.setPrimaryExternalKey(neo4JTenant.getTenantId());
- executionContext.addNeo4JConvertedModels(neo4JTenant.getSearchableId(),neo4JTenant);
+ neo4JTenant.setExecutionContext(executionContext);
+ executionContext.addNeo4JConvertedModels(neo4JTenant.getSearchableId(), neo4JTenant);
if (!groups.isEmpty()) {
groups.stream().forEach(group -> {
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Group neo4JGr =
- (org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Group)
- groupParser.parse(group, null, executionContext);
- executionContext.addNeo4JConvertedModels(neo4JGr.getSearchableId(),neo4JGr);
+ groupParser.parse(group, null, executionContext, merger);
+ executionContext.addNeo4JConvertedModels(neo4JGr.getSearchableId(), neo4JGr);
neo4JTenant.add(neo4JGr, tenant.getCreatedAt() != 0 ? tenant.getCreatedAt() : System.currentTimeMillis(),
tenant.getLastModifiedAt() != 0 ? tenant.getLastModifiedAt() : System.currentTimeMillis(),
null);
@@ -61,9 +69,8 @@
if (!users.isEmpty()) {
users.stream().forEach(user -> {
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User usr =
- (org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User)
- userParser.parse(user, null, executionContext);
- executionContext.addNeo4JConvertedModels(usr.getSearchableId(),usr);
+ userParser.parse(user, null, executionContext, merger);
+ executionContext.addNeo4JConvertedModels(usr.getSearchableId(), usr);
neo4JTenant.add(usr, tenant.getCreatedAt() != 0 ? tenant.getCreatedAt() : System.currentTimeMillis(),
tenant.getLastModifiedAt() != 0 ? tenant.getLastModifiedAt() : System.currentTimeMillis(),
null);
@@ -73,14 +80,16 @@
if (!resources.isEmpty()) {
resources.stream().forEach(resource -> {
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Resource neo4JResource =
- (org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Resource)
- resourceParser.parse(resource, null, executionContext);
- executionContext.addNeo4JConvertedModels(neo4JResource.getSearchableId(),neo4JResource);
+ resourceParser.parse(resource, null, executionContext, merger);
+ executionContext.addNeo4JConvertedModels(neo4JResource.getSearchableId(), neo4JResource);
neo4JTenant.add(neo4JResource, tenant.getCreatedAt() != 0 ? tenant.getCreatedAt() : System.currentTimeMillis(),
tenant.getLastModifiedAt() != 0 ? tenant.getLastModifiedAt() : System.currentTimeMillis(),
null);
});
}
+ if (merger != null) {
+ merger.merge(neo4JTenant);
+ }
return neo4JTenant;
} else {
String msg = "Wrong entity type detected for parser Tenant Parser, Expected Tenant";
@@ -90,12 +99,25 @@
}
@Override
- public Entity parse(GeneratedMessageV3 entity, ExecutionContext executionContext) {
- return this.parse(entity, null, executionContext);
+ public Tenant parse(GeneratedMessageV3 entity, ExecutionContext executionContext) {
+ return this.parse(entity, null, executionContext, null);
}
@Override
- public Entity parse(GeneratedMessageV3 entity) {
- return this.parse(entity, null, new ExecutionContext());
+ public Tenant parse(GeneratedMessageV3 entity) {
+ return this.parse(entity, null, new ExecutionContext(), null);
}
+
+ @Override
+ public Tenant parseAndMerge(GeneratedMessageV3 entity) {
+ return this.parse(entity, null, new ExecutionContext(), new GenericMerger(connector));
+ }
+
+ public org.apache.airavata.datalake.metadata.service.Tenant parse(Tenant tenant) {
+ Object obj = dozerBeanMapper.
+ map(tenant, org.apache.airavata.datalake.metadata.service.Tenant.newBuilder().getClass());
+ return (org.apache.airavata.datalake.metadata.service.Tenant) obj;
+
+ }
+
}
diff --git a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/UserParser.java b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/UserParser.java
index 371c316..dbd8b91 100644
--- a/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/UserParser.java
+++ b/metadata-service/db-service/server/src/main/java/org/apache/airavata/datalake/metadata/parsers/UserParser.java
@@ -2,6 +2,8 @@
import com.google.protobuf.GeneratedMessageV3;
import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.Entity;
+import org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User;
+import org.apache.airavata.datalake.metadata.mergers.Merger;
import org.dozer.DozerBeanMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -18,12 +20,15 @@
@Override
- public Entity parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext) {
+ public User parse(GeneratedMessageV3 entity, Entity parentEntity, ExecutionContext executionContext, Merger merger) {
if (entity instanceof org.apache.airavata.datalake.metadata.service.User) {
org.apache.airavata.datalake.metadata.service.User user =
(org.apache.airavata.datalake.metadata.service.User) entity;
- return dozerBeanMapper.map(user,
+ User usr = (User) dozerBeanMapper.map(user,
org.apache.airavata.datalake.metadata.backend.neo4j.model.nodes.User.class);
+ executionContext.addNeo4JConvertedModels(usr.getSearchableId(), usr);
+ usr.setExecutionContext(executionContext);
+ return usr;
} else {
String msg = "Wrong entity type detected for parser User Parser, Expected User";
LOGGER.error(msg);
@@ -33,11 +38,16 @@
@Override
public Entity parse(GeneratedMessageV3 entity, ExecutionContext executionContext) {
- return this.parse(entity, null, executionContext);
+ return this.parse(entity, null, executionContext,null);
}
@Override
public Entity parse(GeneratedMessageV3 entity) {
- return this.parse(entity, null, new ExecutionContext());
+ return this.parse(entity, null, new ExecutionContext(),null);
+ }
+
+ @Override
+ public Entity parseAndMerge(GeneratedMessageV3 entity) {
+ return null;
}
}
diff --git a/metadata-service/db-service/stub/src/main/proto/resource/Resource.proto b/metadata-service/db-service/stub/src/main/proto/resource/Resource.proto
index ce52a04..7e52cb9 100644
--- a/metadata-service/db-service/stub/src/main/proto/resource/Resource.proto
+++ b/metadata-service/db-service/stub/src/main/proto/resource/Resource.proto
@@ -26,6 +26,20 @@
bool status = 1;
}
+message ResourcePermissionRequest {
+ string username = 1;
+ string groupname = 2;
+ string permission_type = 3;
+ string tenant_id = 4;
+ string resource_name = 5;
+ map<string, string> resource_properties = 6;
+}
+
+message ResourcePermissionResponse {
+ bool accessible = 1;
+}
+
+
message Resource {
string tenant_id = 1;
@@ -95,4 +109,10 @@
};
}
+ rpc hasAccess (ResourcePermissionRequest) returns (ResourcePermissionResponse) {
+ option (google.api.http) = {
+ get: "/v1.0/api/metadata/resource/permission"
+ };
+ }
+
}
\ No newline at end of file
diff --git a/metadata-service/db-service/stub/src/main/proto/tenant/Tenant.proto b/metadata-service/db-service/stub/src/main/proto/tenant/Tenant.proto
index d0063ea..c1c59a4 100644
--- a/metadata-service/db-service/stub/src/main/proto/tenant/Tenant.proto
+++ b/metadata-service/db-service/stub/src/main/proto/tenant/Tenant.proto
@@ -37,6 +37,10 @@
}
+message FindTenantResponse {
+ repeated Tenant tenants = 1;
+}
+
service TenantMetadataService {
@@ -46,7 +50,7 @@
};
}
- rpc getTenant (TenantMetadataAPIRequest) returns (Tenant) {
+ rpc getTenant (TenantMetadataAPIRequest) returns (FindTenantResponse) {
option (google.api.http) = {
get: "/v1.0/api/metadata/tenant"
};