You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by is...@apache.org on 2021/06/01 02:14:15 UTC

[airavata-custos] branch develop updated: Add getAllDirectShares

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 7a6ee0e  Add getAllDirectShares
     new d6ddbd0  Merge pull request #182 from isururanawaka/develop
7a6ee0e is described below

commit 7a6ee0e2a0bbb4c42cb286adccc01f1d6d730c7b
Author: Isuru Ranawaka <ir...@gmail.com>
AuthorDate: Mon May 31 22:12:38 2021 -0400

    Add getAllDirectShares
---
 .../management/client/SharingManagementClient.java |   4 +
 .../custos/sharing/client/SharingClient.java       |   4 +
 .../persistance/repository/EntityRepository.java   |   4 +
 .../custos/sharing/service/SharingService.java     |  79 +++++
 .../custos/sharing/validator/InputValidator.java   |  21 +-
 .../src/main/proto/SharingService.proto            |  15 +-
 .../user/profile/mapper/UserProfileMapper.java     |   2 +-
 .../user/profile/service/UserProfileService.java   |   2 +-
 .../src/main/proto/UserProfileService.proto        |   4 +-
 .../protos/SharingManagementService.proto          |   7 +
 .../src/main/resources/protos/SharingService.proto |  15 +-
 .../main/resources/protos/UserProfileService.proto |   4 +-
 .../src/main/resources/group-management-service.pb | Bin 122043 -> 122233 bytes
 .../interceptors/ClientAuthInterceptorImpl.java    |   1 +
 .../main/resources/sharing-management-service.pb   | Bin 85419 -> 87361 bytes
 .../service/SharingManagementService.java          | 349 +++++++++++----------
 .../src/main/proto/SharingManagementService.proto  |   7 +
 .../service/TenantManagementService.java           |  30 ++
 .../src/main/resources/user-management-service.pb  | Bin 123620 -> 125267 bytes
 19 files changed, 366 insertions(+), 182 deletions(-)

diff --git a/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java b/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java
index 0d81812..a177814 100644
--- a/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java
@@ -269,5 +269,9 @@ public class SharingManagementClient {
         return blockingStub.userHasAccess(request);
     }
 
+    public GetAllDirectSharingsResponse getAllDirectSharings(String clientId, SharingRequest request) {
+        request = request.toBuilder().setClientId(clientId).build();
+        return blockingStub.getAllDirectSharings(request);
+    }
 
 }
diff --git a/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java b/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java
index 7226d82..fa9a88f 100644
--- a/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java
+++ b/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java
@@ -187,5 +187,9 @@ public class SharingClient {
         return sharingServiceBlockingStub.userHasAccess(request);
     }
 
+    public GetAllDirectSharingsResponse getAllDirectSharings(org.apache.custos.sharing.service.SharingRequest request){
+        return sharingServiceBlockingStub.getAllDirectSharings(request);
+    }
+
 
 }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java
index f6623fa..813482c 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java
@@ -28,6 +28,10 @@ public interface EntityRepository  extends JpaRepository<Entity, String>, Search
 
     public List<Entity> findAllByExternalParentIdAndTenantId(String externalParentId, long tenantId);
 
+    public List<Entity> findAllByTenantId(long tenantId);
+
+
+
 
 
 }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java
index 18f7b4f..9a60a6d 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java
@@ -35,6 +35,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -1156,6 +1157,84 @@ public class SharingService extends org.apache.custos.sharing.service.SharingSer
     }
 
 
+    @Override
+    public void getAllDirectSharings(SharingRequest request, StreamObserver<GetAllDirectSharingsResponse> responseObserver) {
+        try {
+            LOGGER.debug("Request received to getAllEntities in " + request.getTenantId());
+            List<org.apache.custos.sharing.persistance.model.Entity> entities = entityRepository
+                    .findAllByTenantId(request.getTenantId());
+            List<org.apache.custos.sharing.persistance.model.PermissionType> permissionTypes =
+                    permissionTypeRepository.findAllByTenantId(request.getTenantId());
+            List<org.apache.custos.sharing.service.Entity> arrayList = new ArrayList<>();
+            List<SharingMetadata> sharingMetadata = new ArrayList<>();
+            entities.forEach(entity -> {
+                try {
+                    Entity en = EntityMapper.createEntity(entity);
+                    permissionTypes.forEach(perm -> {
+                        String permId = perm.getId();
+                        List<String> sharingList = new ArrayList<>();
+                        sharingList.add(Constants.DIRECT_CASCADING);
+                        sharingList.add(Constants.DIRECT_NON_CASCADING);
+
+                        List<Sharing> sharings = sharingRepository.
+                                findAllByEntityAndPermissionTypeAndOwnerTypeAndSharingType(request.getTenantId(), entity.getId(),
+                                        permId, Constants.USER, sharingList);
+                        org.apache.custos.sharing.service.SharedOwners owners = SharingMapper.getSharedOwners(sharings);
+
+                        if (owners != null) {
+                            owners.getOwnerIdsList().forEach(ownerId -> {
+                                SharingMetadata metadata =
+                                        SharingMetadata.newBuilder()
+                                                .setEntity(en)
+                                                .setOwnerId(ownerId)
+                                                .setOwnerType(Constants.USER)
+                                                .setPermission(PermissionType.newBuilder()
+                                                        .setId(perm.getExternalId()).build()).build();
+                                sharingMetadata.add(metadata);
+
+                            });
+
+                        }
+
+                        List<Sharing> sharingsGroups = sharingRepository.
+                                findAllByEntityAndPermissionTypeAndOwnerTypeAndSharingType(request.getTenantId(), entity.getId(),
+                                        permId, Constants.GROUP, sharingList);
+                        org.apache.custos.sharing.service.SharedOwners groupOwners = SharingMapper.getSharedOwners(sharingsGroups);
+
+                        if (groupOwners != null) {
+                            groupOwners.getOwnerIdsList().forEach(ownerId -> {
+                                SharingMetadata metadata =
+                                        SharingMetadata.newBuilder()
+                                                .setEntity(en)
+                                                .setOwnerId(ownerId)
+                                                .setOwnerType(Constants.GROUP)
+                                                .setPermission(PermissionType.newBuilder().
+                                                        setId(perm.getExternalId()).build()).build();
+                                sharingMetadata.add(metadata);
+
+                            });
+
+                        }
+                    });
+
+                } catch (SQLException throwables) {
+                    String msg = "Error occurred while transforming entity" + entity.getId();
+                    LOGGER.error(msg);
+                }
+            });
+            GetAllDirectSharingsResponse response = GetAllDirectSharingsResponse
+                    .newBuilder().addAllSharedData(sharingMetadata).build();
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while fetching all entities related to " + request.getTenantId();
+            LOGGER.error(msg);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+
+    }
+
     private boolean addCascadingPermissionForEntity
             (org.apache.custos.sharing.persistance.model.Entity entity, String internalParentId, long tenantId) {
         List<String> newSharingTypes = new ArrayList<>();
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java
index e5ea4aa..6d533b3 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java
@@ -23,11 +23,6 @@ package org.apache.custos.sharing.validator;
 import org.apache.custos.core.services.commons.Validator;
 import org.apache.custos.core.services.commons.exceptions.MissingParameterException;
 import org.apache.custos.sharing.service.*;
-import org.apache.custos.sharing.service.EntityRequest;
-import org.apache.custos.sharing.service.EntityTypeRequest;
-import org.apache.custos.sharing.service.PermissionTypeRequest;
-import org.apache.custos.sharing.service.SearchRequest;
-import org.apache.custos.sharing.service.SharingRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -98,6 +93,9 @@ public class InputValidator implements Validator {
             case "userHasAccess":
                 validateCheckAccessRequest(obj, methodName);
                 break;
+            case "getAllDirectSharings":
+                validateGetAllDirectSharings(obj, methodName);
+                break;
             default:
                 throw new RuntimeException("Method not implemented");
         }
@@ -352,5 +350,18 @@ public class InputValidator implements Validator {
         return true;
     }
 
+    private boolean validateGetAllDirectSharings(Object object, String methodName) {
+        if (object instanceof SharingRequest) {
+            SharingRequest entityRequest = (SharingRequest) object;
+            if (entityRequest.getTenantId() == 0) {
+                throw new MissingParameterException("Tenant Id not found ", null);
+            }
+
+        } else {
+            throw new RuntimeException("Unexpected input type for method " + methodName);
+        }
+        return true;
+    }
+
 
 }
diff --git a/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto b/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto
index fca0096..b61b738 100644
--- a/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto
+++ b/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto
@@ -164,6 +164,17 @@ message SharedOwners {
     repeated string owner_ids = 1;
 }
 
+message GetAllDirectSharingsResponse {
+    repeated SharingMetadata  shared_data = 1;
+}
+
+message SharingMetadata {
+    Entity entity = 1;
+    string owner_id = 2;
+    string owner_type = 3;
+    PermissionType permission = 4;
+}
+
 service SharingService {
 
 
@@ -187,10 +198,12 @@ service SharingService {
     rpc searchEntities (SearchRequest) returns (Entities);
 
 
+
     rpc getListOfSharedUsers (SharingRequest) returns (SharedOwners);
     rpc getListOfDirectlySharedUsers (SharingRequest) returns (SharedOwners);
     rpc getListOfSharedGroups (SharingRequest) returns (SharedOwners);
     rpc getListOfDirectlySharedGroups (SharingRequest) returns (SharedOwners);
+    rpc getAllDirectSharings (SharingRequest) returns (GetAllDirectSharingsResponse);
 
     rpc shareEntityWithUsers (SharingRequest) returns (Status);
     rpc shareEntityWithGroups (SharingRequest) returns (Status);
@@ -199,6 +212,4 @@ service SharingService {
     rpc userHasAccess (SharingRequest) returns (Status);
 
 
-
-
 }
\ No newline at end of file
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java
index 2e13a1e..efcd135 100644
--- a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java
@@ -195,7 +195,7 @@ public class UserProfileMapper {
         }
 
         if (membershipType != null ) {
-            builder.setMembershipType(DefaultGroupMembershipTypes.valueOf(membershipType));
+            builder.setMembershipType(membershipType);
         }
 
         if (profileEntity.getType() == null) {
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java
index c39af1b..1ceeabf 100644
--- a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java
@@ -253,7 +253,7 @@ public class UserProfileService extends UserProfileServiceGrpc.UserProfileServic
             responseObserver.onCompleted();
         } catch (Exception ex) {
             String msg = "Error occurred while fetching  user profile for tenant " + request.getTenantId();
-            LOGGER.error(msg);
+            LOGGER.error(msg,ex);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
 
diff --git a/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto b/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto
index 66197e6..feef80d 100644
--- a/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto
+++ b/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto
@@ -65,7 +65,7 @@ message UserProfile {
     repeated string realm_roles = 9;
     int64 last_modified_at = 10;
     UserTypes type = 11;
-    DefaultGroupMembershipTypes membership_type = 12;
+    string membership_type = 12;
 }
 
 message UserProfileRequest {
@@ -115,7 +115,7 @@ message GroupRequest {
     Group group = 2;
     string performed_by = 3;
     string client_id = 4;
-    DefaultGroupMembershipTypes membership_type = 5;
+    string membership_type = 5;
     string id = 6;
     string client_sec =7;
 
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingManagementService.proto
index 594912f..978e69b 100644
--- a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingManagementService.proto
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingManagementService.proto
@@ -156,6 +156,13 @@ service SharingManagementService {
 
     }
 
+    rpc getAllDirectSharings (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.GetAllDirectSharingsResponse) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/share/direct"
+        };
+
+    }
+
     rpc shareEntityWithUsers (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
         option (google.api.http) = {
            post: "/sharing-management/v1.0.0/users/share"
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingService.proto
index fca0096..b61b738 100644
--- a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingService.proto
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingService.proto
@@ -164,6 +164,17 @@ message SharedOwners {
     repeated string owner_ids = 1;
 }
 
+message GetAllDirectSharingsResponse {
+    repeated SharingMetadata  shared_data = 1;
+}
+
+message SharingMetadata {
+    Entity entity = 1;
+    string owner_id = 2;
+    string owner_type = 3;
+    PermissionType permission = 4;
+}
+
 service SharingService {
 
 
@@ -187,10 +198,12 @@ service SharingService {
     rpc searchEntities (SearchRequest) returns (Entities);
 
 
+
     rpc getListOfSharedUsers (SharingRequest) returns (SharedOwners);
     rpc getListOfDirectlySharedUsers (SharingRequest) returns (SharedOwners);
     rpc getListOfSharedGroups (SharingRequest) returns (SharedOwners);
     rpc getListOfDirectlySharedGroups (SharingRequest) returns (SharedOwners);
+    rpc getAllDirectSharings (SharingRequest) returns (GetAllDirectSharingsResponse);
 
     rpc shareEntityWithUsers (SharingRequest) returns (Status);
     rpc shareEntityWithGroups (SharingRequest) returns (Status);
@@ -199,6 +212,4 @@ service SharingService {
     rpc userHasAccess (SharingRequest) returns (Status);
 
 
-
-
 }
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserProfileService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserProfileService.proto
index 66197e6..feef80d 100644
--- a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserProfileService.proto
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserProfileService.proto
@@ -65,7 +65,7 @@ message UserProfile {
     repeated string realm_roles = 9;
     int64 last_modified_at = 10;
     UserTypes type = 11;
-    DefaultGroupMembershipTypes membership_type = 12;
+    string membership_type = 12;
 }
 
 message UserProfileRequest {
@@ -115,7 +115,7 @@ message GroupRequest {
     Group group = 2;
     string performed_by = 3;
     string client_id = 4;
-    DefaultGroupMembershipTypes membership_type = 5;
+    string membership_type = 5;
     string id = 6;
     string client_sec =7;
 
diff --git a/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb b/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb
index da1d054..1208f85 100644
Binary files a/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb and b/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb differ
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java
index 4ae83c8..d576b03 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java
@@ -83,6 +83,7 @@ public class ClientAuthInterceptorImpl extends MultiTenantAuthInterceptor {
                 long tenantId = cl.getTenantId();
                 return (ReqT) ((GroupRequest) reqT).toBuilder()
                         .setClientId(oauthId)
+                        .setClientSec(oauthSec)
                         .setTenantId(tenantId)
                         .setPerformedBy(cl.getPerformedBy() != null ? cl.getPerformedBy() : Constants.SYSTEM)
                         .build();
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb b/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb
index 227eb2a..7274dd7 100644
Binary files a/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb and b/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb differ
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java
index 5a9f498..b6216f8 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java
@@ -28,7 +28,6 @@ import org.apache.custos.iam.service.UserSearchRequest;
 import org.apache.custos.identity.client.IdentityClient;
 import org.apache.custos.identity.service.AuthToken;
 import org.apache.custos.identity.service.GetUserManagementSATokenRequest;
-import org.apache.custos.identity.service.User;
 import org.apache.custos.integration.services.commons.utils.InterServiceModelMapper;
 import org.apache.custos.sharing.client.SharingClient;
 import org.apache.custos.sharing.management.exceptions.SharingException;
@@ -365,14 +364,14 @@ public class SharingManagementService extends SharingManagementServiceImplBase {
             UserProfileRequest profileRequest = UserProfileRequest.newBuilder()
                     .setProfile(profile).setTenantId(request.getTenantId()).build();
 
-           GetAllGroupsResponse response =  userProfileClient.getAllGroupsOfUser(profileRequest);
+            GetAllGroupsResponse response = userProfileClient.getAllGroupsOfUser(profileRequest);
 
-           List<String> associatingIds = new ArrayList<>();
-           associatingIds.add(userId);
+            List<String> associatingIds = new ArrayList<>();
+            associatingIds.add(userId);
 
-           for (Group gr: response.getGroupsList()) {
-               associatingIds.add(gr.getId());
-           }
+            for (Group gr : response.getGroupsList()) {
+                associatingIds.add(gr.getId());
+            }
 
             request = request.toBuilder().addAllAssociatingIds(associatingIds).build();
 
@@ -457,255 +456,271 @@ public class SharingManagementService extends SharingManagementServiceImplBase {
     }
 
     @Override
-    public void shareEntityWithUsers(SharingRequest request, StreamObserver<Status> responseObserver) {
+    public void getAllDirectSharings(SharingRequest request, StreamObserver<GetAllDirectSharingsResponse> responseObserver) {
         try {
-            LOGGER.debug("Request received to shareEntityWithUsers in tenant " + request.getTenantId() +
-                    "  for entity  " + request.getEntity().getId());
-
-            long tenantId = request.getTenantId();
-
-            String clientId = request.getClientId();
-
-            String clientSec = request.getClientSec();
+            LOGGER.debug("Request received to getAllDirectSharings in tenant " + request.getTenantId());
 
-            for (String username : request.getOwnerIdList()) {
-
-                validateAndGetUserProfile(username, clientId, clientSec, tenantId);
-            }
-
-            Status status = sharingClient.shareEntityWithUsers(request);
-
-            responseObserver.onNext(status);
+            GetAllDirectSharingsResponse response = sharingClient.getAllDirectSharings(request);
+            responseObserver.onNext(response);
             responseObserver.onCompleted();
 
-
         } catch (Exception ex) {
-            String msg = "Error occurred at shareEntityWithUsers " + ex.getMessage();
+            String msg = "Error occurred at getAllDirectSharings " + ex.getMessage();
             LOGGER.error(msg);
             responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
 
-    @Override
-    public void shareEntityWithGroups(SharingRequest request, StreamObserver<Status> responseObserver) {
-        try {
-            LOGGER.debug("Request received to shareEntityWithGroups in tenant " + request.getTenantId() +
-                    "  with  entity Id  " + request.getEntity().getId());
+        @Override
+        public void shareEntityWithUsers (SharingRequest request, StreamObserver < Status > responseObserver){
+            try {
+                LOGGER.debug("Request received to shareEntityWithUsers in tenant " + request.getTenantId() +
+                        "  for entity  " + request.getEntity().getId());
 
-            long tenantId = request.getTenantId();
+                long tenantId = request.getTenantId();
 
-            for (String groupId : request.getOwnerIdList()) {
+                String clientId = request.getClientId();
 
-                validateAndGetGroupId(groupId, tenantId);
-            }
+                String clientSec = request.getClientSec();
 
-            Status status = sharingClient.shareEntityWithGroups(request);
+                for (String username : request.getOwnerIdList()) {
 
-            responseObserver.onNext(status);
-            responseObserver.onCompleted();
+                    validateAndGetUserProfile(username, clientId, clientSec, tenantId);
+                }
 
-        } catch (Exception ex) {
-            String msg = "Error occurred at shareEntityWithGroups " + ex.getMessage();
-            LOGGER.error(msg);
-            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
-        }
-    }
+                Status status = sharingClient.shareEntityWithUsers(request);
 
-    @Override
-    public void revokeEntitySharingFromUsers(SharingRequest request, StreamObserver<Status> responseObserver) {
-        try {
-            LOGGER.debug("Request received to revokeEntitySharingFromUsers in tenant " + request.getTenantId() +
-                    "  for entity  " + request.getEntity().getId());
+                responseObserver.onNext(status);
+                responseObserver.onCompleted();
 
-            long tenantId = request.getTenantId();
 
-            String clientId = request.getClientId();
+            } catch (Exception ex) {
+                String msg = "Error occurred at shareEntityWithUsers " + ex.getMessage();
+                LOGGER.error(msg);
+                responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+            }
+        }
 
-            String clientSec = request.getClientSec();
+        @Override
+        public void shareEntityWithGroups (SharingRequest request, StreamObserver < Status > responseObserver){
+            try {
+                LOGGER.debug("Request received to shareEntityWithGroups in tenant " + request.getTenantId() +
+                        "  with  entity Id  " + request.getEntity().getId());
 
-            for (String username : request.getOwnerIdList()) {
+                long tenantId = request.getTenantId();
 
-                validateAndGetUserProfile(username, clientId, clientSec, tenantId);
-            }
+                for (String groupId : request.getOwnerIdList()) {
 
-            Status status = sharingClient.revokeEntitySharingFromUsers(request);
+                    validateAndGetGroupId(groupId, tenantId);
+                }
 
-            responseObserver.onNext(status);
-            responseObserver.onCompleted();
+                Status status = sharingClient.shareEntityWithGroups(request);
 
+                responseObserver.onNext(status);
+                responseObserver.onCompleted();
 
-        } catch (Exception ex) {
-            String msg = "Error occurred at revokeEntitySharingFromUsers " + ex.getMessage();
-            LOGGER.error(msg);
-            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+            } catch (Exception ex) {
+                String msg = "Error occurred at shareEntityWithGroups " + ex.getMessage();
+                LOGGER.error(msg);
+                responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+            }
         }
-    }
 
-    @Override
-    public void revokeEntitySharingFromGroups(SharingRequest request, StreamObserver<Status> responseObserver) {
-        try {
-            LOGGER.debug("Request received to revokeEntitySharingFromGroups in tenant " + request.getTenantId() +
-                    "  for entity  " + request.getEntity().getId());
+        @Override
+        public void revokeEntitySharingFromUsers (SharingRequest request, StreamObserver < Status > responseObserver){
+            try {
+                LOGGER.debug("Request received to revokeEntitySharingFromUsers in tenant " + request.getTenantId() +
+                        "  for entity  " + request.getEntity().getId());
 
-            long tenantId = request.getTenantId();
+                long tenantId = request.getTenantId();
 
+                String clientId = request.getClientId();
 
-            for (String username : request.getOwnerIdList()) {
+                String clientSec = request.getClientSec();
 
-                validateAndGetGroupId(username,  tenantId);
-            }
+                for (String username : request.getOwnerIdList()) {
 
-            Status status = sharingClient.revokeEntitySharingFromGroups(request);
+                    validateAndGetUserProfile(username, clientId, clientSec, tenantId);
+                }
 
-            responseObserver.onNext(status);
-            responseObserver.onCompleted();
+                Status status = sharingClient.revokeEntitySharingFromUsers(request);
 
+                responseObserver.onNext(status);
+                responseObserver.onCompleted();
 
-        } catch (Exception ex) {
-            String msg = "Error occurred at revokeEntitySharingFromGroups " + ex.getMessage();
-            LOGGER.error(msg);
-            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
-        }
-    }
 
-    @Override
-    public void userHasAccess(SharingRequest request, StreamObserver<Status> responseObserver) {
-        try {
-            LOGGER.debug("Request received to userHasAccess in tenant " + request.getTenantId() +
-                    "  for entity  " + request.getEntity().getId());
+            } catch (Exception ex) {
+                String msg = "Error occurred at revokeEntitySharingFromUsers " + ex.getMessage();
+                LOGGER.error(msg);
+                responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+            }
+        }
 
-            String clientId = request.getClientId();
+        @Override
+        public void revokeEntitySharingFromGroups (SharingRequest request, StreamObserver < Status > responseObserver){
+            try {
+                LOGGER.debug("Request received to revokeEntitySharingFromGroups in tenant " + request.getTenantId() +
+                        "  for entity  " + request.getEntity().getId());
 
-            String clientSec = request.getClientSec();
+                long tenantId = request.getTenantId();
 
-            long tenantId = request.getTenantId();
 
+                for (String username : request.getOwnerIdList()) {
 
-            UserProfile profile = UserProfile.newBuilder().setUsername(request.getOwnerId(0)).build();
+                    validateAndGetGroupId(username, tenantId);
+                }
 
-            UserProfileRequest userProfileRequest = UserProfileRequest.newBuilder()
-                    .setTenantId(tenantId)
-                    .setProfile(profile)
-                    .build();
-            GetAllGroupsResponse response = userProfileClient.getAllGroupsOfUser(userProfileRequest);
+                Status status = sharingClient.revokeEntitySharingFromGroups(request);
 
-            List<Group> groups = response.getGroupsList();
+                responseObserver.onNext(status);
+                responseObserver.onCompleted();
 
-            if (groups != null && !groups.isEmpty()) {
 
-                for (Group group : groups) {
-                    request = request.toBuilder().addOwnerId(group.getId()).build();
-                }
+            } catch (Exception ex) {
+                String msg = "Error occurred at revokeEntitySharingFromGroups " + ex.getMessage();
+                LOGGER.error(msg);
+                responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
             }
+        }
 
-            Status status = sharingClient.userHasAccess(request);
+        @Override
+        public void userHasAccess (SharingRequest request, StreamObserver < Status > responseObserver){
+            try {
+                LOGGER.debug("Request received to userHasAccess in tenant " + request.getTenantId() +
+                        "  for entity  " + request.getEntity().getId());
 
-            responseObserver.onNext(status);
-            responseObserver.onCompleted();
+                String clientId = request.getClientId();
 
-            for (String username : request.getOwnerIdList()) {
+                String clientSec = request.getClientSec();
 
-                validateAndGetUserProfile(username, clientId, clientSec, tenantId);
-            }
+                long tenantId = request.getTenantId();
 
-        } catch (Exception ex) {
-            String msg = "Error occurred at userHasAccess " + ex.getMessage();
-            LOGGER.error(msg);
-            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
-        }
-    }
 
+                UserProfile profile = UserProfile.newBuilder().setUsername(request.getOwnerId(0)).build();
 
-    private String validateAndGetUserProfile(String username, String clientId, String clientSec, long tenantId) {
+                UserProfileRequest userProfileRequest = UserProfileRequest.newBuilder()
+                        .setTenantId(tenantId)
+                        .setProfile(profile)
+                        .build();
+                GetAllGroupsResponse response = userProfileClient.getAllGroupsOfUser(userProfileRequest);
 
-        GetUserManagementSATokenRequest userManagementSATokenRequest = GetUserManagementSATokenRequest
-                .newBuilder()
-                .setClientId(clientId)
-                .setClientSecret(clientSec)
-                .setTenantId(tenantId)
-                .build();
-        AuthToken token = identityClient.getUserManagementSATokenRequest(userManagementSATokenRequest);
+                List<Group> groups = response.getGroupsList();
 
-        if (token != null && token.getAccessToken() != null) {
+                if (groups != null && !groups.isEmpty()) {
 
-            UserSearchMetadata searchMetadata = UserSearchMetadata
-                    .newBuilder()
-                    .setUsername(username)
-                    .build();
+                    for (Group group : groups) {
+                        request = request.toBuilder().addOwnerId(group.getId()).build();
+                    }
+                }
 
-            UserSearchRequest searchRequest = UserSearchRequest
-                    .newBuilder()
-                    .setTenantId(tenantId)
-                    .setAccessToken(token.getAccessToken())
-                    .setUser(searchMetadata)
-                    .build();
+                Status status = sharingClient.userHasAccess(request);
+
+                responseObserver.onNext(status);
+                responseObserver.onCompleted();
+
+                for (String username : request.getOwnerIdList()) {
 
-            CheckingResponse response = iamAdminServiceClient.isUserExist(searchRequest);
-            if (!response.getIsExist()) {
-                throw new SharingException("User " + username + " not found", null);
+                    validateAndGetUserProfile(username, clientId, clientSec, tenantId);
+                }
+
+            } catch (Exception ex) {
+                String msg = "Error occurred at userHasAccess " + ex.getMessage();
+                LOGGER.error(msg);
+                responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
             }
+        }
 
-            UserProfile userProfile = UserProfile
-                    .newBuilder()
-                    .setUsername(username)
-                    .build();
 
-            UserProfileRequest request = UserProfileRequest
+        private String validateAndGetUserProfile (String username, String clientId, String clientSec,long tenantId){
+
+            GetUserManagementSATokenRequest userManagementSATokenRequest = GetUserManagementSATokenRequest
                     .newBuilder()
-                    .setProfile(userProfile)
+                    .setClientId(clientId)
+                    .setClientSecret(clientSec)
                     .setTenantId(tenantId)
                     .build();
+            AuthToken token = identityClient.getUserManagementSATokenRequest(userManagementSATokenRequest);
 
-            UserProfile profile = userProfileClient.getUser(request);
+            if (token != null && token.getAccessToken() != null) {
 
-            if (profile == null || profile.getUsername() == null || profile.getUsername().equals("")) {
+                UserSearchMetadata searchMetadata = UserSearchMetadata
+                        .newBuilder()
+                        .setUsername(username)
+                        .build();
 
-                UserRepresentation representation = iamAdminServiceClient.getUser(searchRequest);
+                UserSearchRequest searchRequest = UserSearchRequest
+                        .newBuilder()
+                        .setTenantId(tenantId)
+                        .setAccessToken(token.getAccessToken())
+                        .setUser(searchMetadata)
+                        .build();
 
-                UserProfile exProfile = InterServiceModelMapper.convert(representation);
+                CheckingResponse response = iamAdminServiceClient.isUserExist(searchRequest);
+                if (!response.getIsExist()) {
+                    throw new SharingException("User " + username + " not found", null);
+                }
+
+                UserProfile userProfile = UserProfile
+                        .newBuilder()
+                        .setUsername(username)
+                        .build();
 
-                UserProfileRequest req = UserProfileRequest
+                UserProfileRequest request = UserProfileRequest
                         .newBuilder()
-                        .setProfile(exProfile)
+                        .setProfile(userProfile)
                         .setTenantId(tenantId)
                         .build();
 
-                userProfileClient.createUserProfile(req);
-                return exProfile.getUsername();
+                UserProfile profile = userProfileClient.getUser(request);
 
-            }
+                if (profile == null || profile.getUsername() == null || profile.getUsername().equals("")) {
 
-            return profile.getUsername();
+                    UserRepresentation representation = iamAdminServiceClient.getUser(searchRequest);
 
-        } else {
+                    UserProfile exProfile = InterServiceModelMapper.convert(representation);
 
-            throw new SharingException("User management token not found ", null);
-        }
+                    UserProfileRequest req = UserProfileRequest
+                            .newBuilder()
+                            .setProfile(exProfile)
+                            .setTenantId(tenantId)
+                            .build();
 
+                    userProfileClient.createUserProfile(req);
+                    return exProfile.getUsername();
 
-    }
+                }
 
-    private String validateAndGetGroupId(String groupId, long tenantId) {
+                return profile.getUsername();
 
+            } else {
 
-        Group group = Group.newBuilder().setId(groupId).build();
+                throw new SharingException("User management token not found ", null);
+            }
 
-        GroupRequest groupRequest = GroupRequest
-                .newBuilder()
-                .setTenantId(tenantId)
-                .setGroup(group).build();
 
-        Group exGroup = userProfileClient.getGroup(groupRequest);
+        }
 
-        if (exGroup == null || exGroup.getId() == null || exGroup.getId().equals("")) {
+        private String validateAndGetGroupId (String groupId,long tenantId){
 
-            throw new SharingException("Group with Id  " + groupId + " not found", null);
-        }
 
-        return exGroup.getId();
+            Group group = Group.newBuilder().setId(groupId).build();
 
+            GroupRequest groupRequest = GroupRequest
+                    .newBuilder()
+                    .setTenantId(tenantId)
+                    .setGroup(group).build();
 
-    }
+            Group exGroup = userProfileClient.getGroup(groupRequest);
 
+            if (exGroup == null || exGroup.getId() == null || exGroup.getId().equals("")) {
 
-}
+                throw new SharingException("Group with Id  " + groupId + " not found", null);
+            }
+
+            return exGroup.getId();
+
+
+        }
+
+
+    }
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto
index 594912f..978e69b 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto
@@ -156,6 +156,13 @@ service SharingManagementService {
 
     }
 
+    rpc getAllDirectSharings (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.GetAllDirectSharingsResponse) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/share/direct"
+        };
+
+    }
+
     rpc shareEntityWithUsers (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
         option (google.api.http) = {
            post: "/sharing-management/v1.0.0/users/share"
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java
index 74887d3..e339edb 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java
@@ -536,6 +536,36 @@ public class TenantManagementService extends TenantManagementServiceImplBase {
     public void getChildTenants(GetTenantsRequest request, StreamObserver<GetAllTenantsResponse> responseObserver) {
         try {
             GetAllTenantsResponse response = profileClient.getAllTenants(request);
+            if (response != null && !response.getTenantList().isEmpty()) {
+                List<Tenant> tenantList = new ArrayList<>();
+
+                for (Tenant tenant : response.getTenantList()) {
+
+                    GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder()
+                            .setOwnerId(tenant.getTenantId())
+                            .setType(Type.CUSTOS).build();
+
+                    CredentialMetadata metadata = credentialStoreServiceClient.
+                            getCredential(credentialRequest);
+
+
+                    if (tenant.getParentTenantId() > 0) {
+                        GetCredentialRequest cR = GetCredentialRequest.newBuilder()
+                                .setOwnerId(tenant.getParentTenantId())
+                                .setType(Type.CUSTOS).build();
+
+                        CredentialMetadata parentMetadata = credentialStoreServiceClient.
+                                getCredential(cR);
+                        tenant = tenant.toBuilder().setParentClientId(parentMetadata.getId()).build();
+                    }
+
+                    tenant = tenant.toBuilder().setClientId(metadata.getId()).build();
+                    tenantList.add(tenant);
+
+                }
+
+                response = response.toBuilder().clearTenant().addAllTenant(tenantList).build();
+            }
             responseObserver.onNext(response);
             responseObserver.onCompleted();
         } catch (Exception ex) {
diff --git a/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb b/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb
index baccaa2..b4aa501 100644
Binary files a/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb and b/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb differ