You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2019/05/09 16:19:55 UTC

[airavata-django-portal] branch master updated (6e2b258 -> cddab50)

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

machristie pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git.


    from 6e2b258  Fix order of imports
     new a303753  AIRAVATA-3030 Display inherited parent permissions, parent entity owner
     new 5ff4acf  AIRAVATA-3030 Add inherited parent permissions to tooltip, count
     new a09919c  AIRAVATA-3030: fix changing user permission
     new 8e7ad61  AIRAVATA-3030 Loading directly granted sharings for editing
     new e6a9107  AIRAVATA-3030 simplified code for displaying inherited sharings
     new cddab50  Merge branch 'airavata-3030'

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 airavata/api/Airavata-remote                       |   14 +
 airavata/api/Airavata.py                           | 1122 +++++++++++++++-----
 airavata/api/sharing/SharingRegistryService-remote |   14 +
 airavata/api/sharing/SharingRegistryService.py     |  562 +++++++++-
 django_airavata/apps/api/views.py                  |   66 +-
 .../js/components/experiment/ExperimentEditor.vue  |    3 +
 .../static/common/js/components/ShareButton.vue    |  128 ++-
 .../common/js/components/SharedEntityEditor.vue    |   40 +-
 8 files changed, 1615 insertions(+), 334 deletions(-)


[airavata-django-portal] 06/06: Merge branch 'airavata-3030'

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit cddab50884c091ee0764bdd56b1590e716508a9f
Merge: 6e2b258 e6a9107
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu May 9 12:18:40 2019 -0400

    Merge branch 'airavata-3030'

 airavata/api/Airavata-remote                       |   14 +
 airavata/api/Airavata.py                           | 1122 +++++++++++++++-----
 airavata/api/sharing/SharingRegistryService-remote |   14 +
 airavata/api/sharing/SharingRegistryService.py     |  562 +++++++++-
 django_airavata/apps/api/views.py                  |   66 +-
 .../js/components/experiment/ExperimentEditor.vue  |    3 +
 .../static/common/js/components/ShareButton.vue    |  128 ++-
 .../common/js/components/SharedEntityEditor.vue    |   40 +-
 8 files changed, 1615 insertions(+), 334 deletions(-)



[airavata-django-portal] 03/06: AIRAVATA-3030: fix changing user permission

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit a09919ce9e37b9d38e3b6c7a1495dd252b18ffb7
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Tue May 7 13:10:40 2019 -0400

    AIRAVATA-3030: fix changing user permission
---
 django_airavata/static/common/js/components/SharedEntityEditor.vue | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/django_airavata/static/common/js/components/SharedEntityEditor.vue b/django_airavata/static/common/js/components/SharedEntityEditor.vue
index fb0ba9c..a03e5e2 100644
--- a/django_airavata/static/common/js/components/SharedEntityEditor.vue
+++ b/django_airavata/static/common/js/components/SharedEntityEditor.vue
@@ -53,8 +53,9 @@
       >
         <b-form-select
           v-if="!data.item.readonly"
-          v-model="data.item.permissionType"
+          :value="data.item.permissionType"
           :options="permissionOptions"
+          @input="changeUserPermission(data.item.user, $event)"
         />
         <span
           v-else
@@ -294,6 +295,10 @@ export default {
     removeUser: function(user) {
       this.data.removeUser(user);
     },
+    changeUserPermission(user, permissionType) {
+      const up = this.data.userPermissions.find(up => up.user.airavataInternalUserId === user.airavataInternalUserId);
+      up.permissionType = permissionType;
+    },
     removeGroup: function(group) {
       this.data.removeGroup(group);
     },


[airavata-django-portal] 05/06: AIRAVATA-3030 simplified code for displaying inherited sharings

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit e6a91075065138edd6e3a7b847b193c79e477fda
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu May 9 12:15:16 2019 -0400

    AIRAVATA-3030 simplified code for displaying inherited sharings
---
 .../static/common/js/components/ShareButton.vue    | 38 +++---------
 .../common/js/components/SharedEntityEditor.vue    | 68 +++++++++-------------
 2 files changed, 36 insertions(+), 70 deletions(-)

diff --git a/django_airavata/static/common/js/components/ShareButton.vue b/django_airavata/static/common/js/components/ShareButton.vue
index 6380955..3f9fe42 100644
--- a/django_airavata/static/common/js/components/ShareButton.vue
+++ b/django_airavata/static/common/js/components/ShareButton.vue
@@ -26,26 +26,22 @@
         v-model="localSharedEntity"
         :users="users"
         :groups="groups"
-        :parent-entity-owner="parentEntityOwner"
-        :parent-entity-label="parentEntityLabel"
         :disallow-editing-admin-groups="disallowEditingAdminGroups"
       />
       <!-- Only show parent entity permissions for new entities -->
-      <template v-if="!entityId && hasParentSharedEntityPermissions">
+      <template v-if="hasParentSharedEntityPermissions">
         <shared-entity-editor
           v-if="parentSharedEntity && users && groups"
           v-model="parentSharedEntity"
           :users="users"
           :groups="groups"
           :readonly="true"
-          class="mt-5"
+          class="mt-4"
         >
-          <span slot="permissions-header">Inherited {{ parentEntityLabel }} Permissions</span>
+          <span slot="permissions-header">Inherited {{ parentEntityLabel }} Permissions
+            <!-- <small class="text-muted" v-if="parentEntityOwner">Owned by {{parentEntityOwner.firstName}} {{parentEntityOwner.lastName}} ({{parentEntityOwner.email}})</small> -->
+          </span>
         </shared-entity-editor>
-        <small class="text-muted">These permissions are inherited when your <span class="text-lowercase">{{ entityLabel
-            }}</span> is initially
-          created but can be updated
-          afterwards.</small>
       </template>
     </b-modal>
   </div>
@@ -64,10 +60,6 @@ export default {
       type: String,
       default: "Parent"
     },
-    entityLabel: {
-      type: String,
-      default: "Entity"
-    },
     sharedEntity: models.SharedEntity,
     autoAddDefaultGatewayUsersGroup: {
       type: Boolean,
@@ -117,18 +109,10 @@ export default {
           ...this.localSharedEntity.userPermissions.map(up => up.user)
         );
       }
-      if (this.parentSharedEntity) {
-        // Only add in inherited permissions if we haven't saved yet because
-        // once saved the inherited permissions are already copied in
-        if (
-          this.localSharedEntity &&
-          !this.localSharedEntity.entityId &&
-          this.parentSharedEntity.userPermissions
-        ) {
-          users.push(
-            ...this.parentSharedEntity.userPermissions.map(up => up.user)
-          );
-        }
+      if (this.parentSharedEntity && this.parentSharedEntity.userPermissions) {
+        users.push(
+          ...this.parentSharedEntity.userPermissions.map(up => up.user)
+        );
         if (this.parentEntityOwner) {
           users.push(this.parentEntityOwner);
         }
@@ -147,11 +131,7 @@ export default {
     combinedGroups() {
       const groups = [];
       groups.push(...this.filteredGroupPermissions.map(gp => gp.group));
-      // Only add in inherited permissions if we haven't saved yet because
-      // once saved the inherited permissions are already copied in
       if (
-        this.localSharedEntity &&
-        !this.localSharedEntity.entityId &&
         this.parentSharedEntity &&
         this.parentSharedEntity.groupPermissions
       ) {
diff --git a/django_airavata/static/common/js/components/SharedEntityEditor.vue b/django_airavata/static/common/js/components/SharedEntityEditor.vue
index a03e5e2..609d01d 100644
--- a/django_airavata/static/common/js/components/SharedEntityEditor.vue
+++ b/django_airavata/static/common/js/components/SharedEntityEditor.vue
@@ -32,42 +32,41 @@
       v-if="usersCount > 0"
       id="modal-user-table"
       hover
-      :items="sortedUserPermissionsData"
+      :items="sortedUserPermissions"
       :fields="userFields"
     >
       <template
         slot="name"
         slot-scope="data"
       >
-        <span :title="data.item.user.userId" :class="data.item.classes">{{data.item.user.firstName}} {{data.item.user.lastName}}</span>
+        <span :title="data.item.user.userId" :class="userDataClasses">{{data.item.user.firstName}} {{data.item.user.lastName}}</span>
       </template>
       <template
         slot="email"
         slot-scope="data"
       >
-        <span :class="data.item.classes">{{data.item.user.email}}</span>
+        <span :class="userDataClasses">{{data.item.user.email}}</span>
       </template>
       <template
         slot="permission"
         slot-scope="data"
       >
         <b-form-select
-          v-if="!data.item.readonly"
-          :value="data.item.permissionType"
+          v-if="!readonly"
+          v-model="data.item.permissionType"
           :options="permissionOptions"
-          @input="changeUserPermission(data.item.user, $event)"
         />
         <span
           v-else
           class="text-uppercase"
-          :class="data.item.classes"
-        >{{ data.item.permissionTypeLabel }}</span>
+          :class="userDataClasses"
+        >{{ data.item.permissionType.name }}</span>
       </template>
       <template
         slot="remove"
         slot-scope="data"
       >
-        <b-link v-if="!data.item.readonly" @click="removeUser(data.item.user)">
+        <b-link v-if="!readonly" @click="removeUser(data.item.user)">
           <span class="fa fa-trash"></span>
         </b-link>
       </template>
@@ -145,13 +144,6 @@ export default {
     readonly: {
       type: Boolean,
       default: false
-    },
-    parentEntityOwner: {
-      type: models.UserProfile,
-    },
-    parentEntityLabel: {
-      type: String,
-      default: "Parent"
     }
   },
   components: {
@@ -174,35 +166,33 @@ export default {
       ];
     },
     usersCount: function() {
-      return this.sortedUserPermissionsData.length;
+      return this.data && this.data.userPermissions
+        ? this.data.userPermissions.length
+        : 0;
     },
-    sortedUserPermissionsData: function() {
+    sortedUserPermissions: function() {
       const userPermsCopy = this.data.userPermissions
         ? this.data.userPermissions.slice()
         : [];
-      const sorted = utils.StringUtils.sortIgnoreCase(
+      const sortedUserPerms = utils.StringUtils.sortIgnoreCase(
         userPermsCopy,
         userPerm => userPerm.user.lastName + ", " + userPerm.user.firstName
       );
-      const sortedData = sorted.map(up => {
-        return {
-          user: up.user,
-          permissionType: up.permissionType,
-          permissionTypeLabel: up.permissionType.name,
-          readonly: this.readonly,
-          classes: this.readonly ? ['text-muted', 'font-italic'] : null
-        }
-      });
-      if (this.parentEntityOwner) {
-        sortedData.push({
-          user: this.parentEntityOwner,
-          permissionType: models.ResourcePermissionType.OWNER,
-          permissionTypeLabel: this.parentEntityLabel + " OWNER",
-          readonly: true,
-          classes: ['text-muted', 'font-italic']
-        });
+      // When in readonly mode, if the current owner isn't the owner, display
+      // the user with the OWNER permission
+      if (this.readonly && !this.data.isOwner) {
+        sortedUserPerms.push(new models.UserPermission({
+          user: this.data.owner,
+          permissionType: models.ResourcePermissionType.OWNER
+        }));
+      }
+      return sortedUserPerms;
+    },
+    userDataClasses() {
+      return {
+        'text-muted': this.readonly,
+        'font-italic': this.readonly
       }
-      return sortedData;
     },
     filteredGroupPermissions: function() {
       return this.data && this.data.groupPermissions
@@ -295,10 +285,6 @@ export default {
     removeUser: function(user) {
       this.data.removeUser(user);
     },
-    changeUserPermission(user, permissionType) {
-      const up = this.data.userPermissions.find(up => up.user.airavataInternalUserId === user.airavataInternalUserId);
-      up.permissionType = permissionType;
-    },
     removeGroup: function(group) {
       this.data.removeGroup(group);
     },


[airavata-django-portal] 02/06: AIRAVATA-3030 Add inherited parent permissions to tooltip, count

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 5ff4acf771b15b49f2e0a81eac08bfe94466b680
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Tue May 7 12:55:13 2019 -0400

    AIRAVATA-3030 Add inherited parent permissions to tooltip, count
---
 .../static/common/js/components/ShareButton.vue    | 65 +++++++++++++++++-----
 .../common/js/components/SharedEntityEditor.vue    |  4 +-
 2 files changed, 53 insertions(+), 16 deletions(-)

diff --git a/django_airavata/static/common/js/components/ShareButton.vue b/django_airavata/static/common/js/components/ShareButton.vue
index f9eb6f9..6380955 100644
--- a/django_airavata/static/common/js/components/ShareButton.vue
+++ b/django_airavata/static/common/js/components/ShareButton.vue
@@ -105,16 +105,35 @@ export default {
       );
     },
     usersCount: function() {
-      return this.localSharedEntity && this.localSharedEntity.userPermissions
-        ? this.localSharedEntity.userPermissions.length
-        : 0;
+      return this.combinedUsers.length;
     },
     userNames: function() {
-      return this.localSharedEntity && this.localSharedEntity.userPermissions
-        ? this.localSharedEntity.userPermissions.map(
-            userPerm => userPerm.user.firstName + " " + userPerm.user.lastName
-          )
-        : null;
+      return this.combinedUsers.map(u => u.firstName + " " + u.lastName);
+    },
+    combinedUsers() {
+      const users = [];
+      if (this.localSharedEntity && this.localSharedEntity.userPermissions) {
+        users.push(
+          ...this.localSharedEntity.userPermissions.map(up => up.user)
+        );
+      }
+      if (this.parentSharedEntity) {
+        // Only add in inherited permissions if we haven't saved yet because
+        // once saved the inherited permissions are already copied in
+        if (
+          this.localSharedEntity &&
+          !this.localSharedEntity.entityId &&
+          this.parentSharedEntity.userPermissions
+        ) {
+          users.push(
+            ...this.parentSharedEntity.userPermissions.map(up => up.user)
+          );
+        }
+        if (this.parentEntityOwner) {
+          users.push(this.parentEntityOwner);
+        }
+      }
+      return users;
     },
     filteredGroupPermissions: function() {
       if (this.localSharedEntity && this.localSharedEntity.groupPermissions) {
@@ -125,13 +144,28 @@ export default {
         return [];
       }
     },
+    combinedGroups() {
+      const groups = [];
+      groups.push(...this.filteredGroupPermissions.map(gp => gp.group));
+      // Only add in inherited permissions if we haven't saved yet because
+      // once saved the inherited permissions are already copied in
+      if (
+        this.localSharedEntity &&
+        !this.localSharedEntity.entityId &&
+        this.parentSharedEntity &&
+        this.parentSharedEntity.groupPermissions
+      ) {
+        groups.push(
+          ...this.parentSharedEntity.groupPermissions.map(gp => gp.group)
+        );
+      }
+      return groups;
+    },
     groupNames: function() {
-      return this.filteredGroupPermissions.map(
-        groupPerm => groupPerm.group.name
-      );
+      return this.combinedGroups.map(g => g.name);
     },
     groupsCount: function() {
-      return this.filteredGroupPermissions.length;
+      return this.combinedGroups.length;
     },
     totalCount: function() {
       return this.usersCount + this.groupsCount;
@@ -151,7 +185,12 @@ export default {
       );
     },
     parentEntityOwner() {
-      return this.parentSharedEntity && this.parentSharedEntity.owner;
+      // Only show the parent entity owner when not the same as current user
+      if (this.parentSharedEntity && !this.parentSharedEntity.isOwner) {
+        return this.parentSharedEntity.owner;
+      } else {
+        return null;
+      }
     }
   },
   methods: {
diff --git a/django_airavata/static/common/js/components/SharedEntityEditor.vue b/django_airavata/static/common/js/components/SharedEntityEditor.vue
index be778ff..fb0ba9c 100644
--- a/django_airavata/static/common/js/components/SharedEntityEditor.vue
+++ b/django_airavata/static/common/js/components/SharedEntityEditor.vue
@@ -173,9 +173,7 @@ export default {
       ];
     },
     usersCount: function() {
-      return this.data && this.data.userPermissions
-        ? this.data.userPermissions.length
-        : 0;
+      return this.sortedUserPermissionsData.length;
     },
     sortedUserPermissionsData: function() {
       const userPermsCopy = this.data.userPermissions


[airavata-django-portal] 01/06: AIRAVATA-3030 Display inherited parent permissions, parent entity owner

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit a3037536fbec1611c56daa8404e53a0b689176d3
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Fri May 3 15:27:54 2019 -0400

    AIRAVATA-3030 Display inherited parent permissions, parent entity owner
---
 .../js/components/experiment/ExperimentEditor.vue  |  3 +
 .../static/common/js/components/ShareButton.vue    | 85 ++++++++++++++++++++--
 .../common/js/components/SharedEntityEditor.vue    | 55 ++++++++++++--
 3 files changed, 129 insertions(+), 14 deletions(-)

diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
index 773b9c8..16193c1 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
@@ -18,6 +18,9 @@
         <share-button
           ref="shareButton"
           :entity-id="localExperiment.experimentId"
+          :entity-label="'Experiment'"
+          :parent-entity-id="localExperiment.projectId"
+          :parent-entity-label="'Project'"
           :auto-add-default-gateway-users-group="false"
         />
       </div>
diff --git a/django_airavata/static/common/js/components/ShareButton.vue b/django_airavata/static/common/js/components/ShareButton.vue
index 4e947b0..f9eb6f9 100644
--- a/django_airavata/static/common/js/components/ShareButton.vue
+++ b/django_airavata/static/common/js/components/ShareButton.vue
@@ -1,13 +1,52 @@
 <template>
   <div class="share-button btn-container">
-    <b-button :variant="'outline-primary'" :title="title" :disabled="!shareButtonEnabled" @click="openSharingSettingsModal">
+    <b-button
+      :variant="'outline-primary'"
+      :title="title"
+      :disabled="!shareButtonEnabled"
+      @click="openSharingSettingsModal"
+    >
       Share
       <b-badge>{{ totalCount }}</b-badge>
     </b-button>
-    <b-modal class="modal-share-settings" title="Sharing Settings" ref="sharingSettingsModal" ok-title="Save" @ok="saveSharedEntity"
-      @cancel="cancelEditSharedEntity" no-close-on-esc no-close-on-backdrop hide-header-close @show="showSharingSettingsModal">
-      <shared-entity-editor v-if="localSharedEntity && users && groups" v-model="localSharedEntity" :users="users"
-        :groups="groups" :disallow-editing-admin-groups="disallowEditingAdminGroups" />
+    <b-modal
+      class="modal-share-settings"
+      title="Sharing Settings"
+      ref="sharingSettingsModal"
+      ok-title="Save"
+      @ok="saveSharedEntity"
+      @cancel="cancelEditSharedEntity"
+      no-close-on-esc
+      no-close-on-backdrop
+      hide-header-close
+      @show="showSharingSettingsModal"
+    >
+      <shared-entity-editor
+        v-if="localSharedEntity && users && groups"
+        v-model="localSharedEntity"
+        :users="users"
+        :groups="groups"
+        :parent-entity-owner="parentEntityOwner"
+        :parent-entity-label="parentEntityLabel"
+        :disallow-editing-admin-groups="disallowEditingAdminGroups"
+      />
+      <!-- Only show parent entity permissions for new entities -->
+      <template v-if="!entityId && hasParentSharedEntityPermissions">
+        <shared-entity-editor
+          v-if="parentSharedEntity && users && groups"
+          v-model="parentSharedEntity"
+          :users="users"
+          :groups="groups"
+          :readonly="true"
+          class="mt-5"
+        >
+          <span slot="permissions-header">Inherited {{ parentEntityLabel }} Permissions</span>
+        </shared-entity-editor>
+        <small class="text-muted">These permissions are inherited when your <span class="text-lowercase">{{ entityLabel
+            }}</span> is initially
+          created but can be updated
+          afterwards.</small>
+      </template>
     </b-modal>
   </div>
 </template>
@@ -20,6 +59,15 @@ export default {
   name: "share-button",
   props: {
     entityId: String,
+    parentEntityId: String,
+    parentEntityLabel: {
+      type: String,
+      default: "Parent"
+    },
+    entityLabel: {
+      type: String,
+      default: "Entity"
+    },
     sharedEntity: models.SharedEntity,
     autoAddDefaultGatewayUsersGroup: {
       type: Boolean,
@@ -36,6 +84,7 @@ export default {
   data: function() {
     return {
       localSharedEntity: null,
+      parentSharedEntity: null,
       sharedEntityCopy: null,
       defaultGatewayUsersGroup: null,
       users: null,
@@ -69,7 +118,9 @@ export default {
     },
     filteredGroupPermissions: function() {
       if (this.localSharedEntity && this.localSharedEntity.groupPermissions) {
-        return this.disallowEditingAdminGroups ? this.localSharedEntity.nonAdminGroupPermissions : this.localSharedEntity.groupPermissions;
+        return this.disallowEditingAdminGroups
+          ? this.localSharedEntity.nonAdminGroupPermissions
+          : this.localSharedEntity.groupPermissions;
       } else {
         return [];
       }
@@ -91,6 +142,16 @@ export default {
         this.localSharedEntity &&
         (!this.localSharedEntity.entityId || this.localSharedEntity.isOwner)
       );
+    },
+    hasParentSharedEntityPermissions() {
+      return (
+        this.parentSharedEntity &&
+        (this.parentSharedEntity.userPermissions.length > 0 ||
+          this.parentSharedEntity.groupPermissions.length > 0)
+      );
+    },
+    parentEntityOwner() {
+      return this.parentSharedEntity && this.parentSharedEntity.owner;
     }
   },
   methods: {
@@ -123,6 +184,13 @@ export default {
           })
         );
       }
+      if (this.parentEntityId) {
+        promises.push(
+          this.loadSharedEntity(this.parentEntityId).then(
+            sharedEntity => (this.parentSharedEntity = sharedEntity)
+          )
+        );
+      }
       Promise.all(promises).then(() => {
         if (this.sharedEntity) {
           this.localSharedEntity = this.sharedEntity.clone();
@@ -216,6 +284,11 @@ export default {
           sharedEntity => (this.localSharedEntity = sharedEntity)
         );
       }
+    },
+    parentEntityId(newParentEntityId) {
+      this.loadSharedEntity(newParentEntityId).then(sharedEntity => {
+        this.parentSharedEntity = sharedEntity;
+      });
     }
   }
 };
diff --git a/django_airavata/static/common/js/components/SharedEntityEditor.vue b/django_airavata/static/common/js/components/SharedEntityEditor.vue
index dcba2c7..be778ff 100644
--- a/django_airavata/static/common/js/components/SharedEntityEditor.vue
+++ b/django_airavata/static/common/js/components/SharedEntityEditor.vue
@@ -1,6 +1,7 @@
 <template>
   <div>
     <b-form-group
+      v-if="!readonly"
       label="Search for users/groups"
       labelFor="user-groups-autocomplete"
     >
@@ -24,40 +25,48 @@
         </template>
       </autocomplete-text-input>
     </b-form-group>
-    <h5 v-if="totalCount > 0">Currently Shared With</h5>
+    <h5 v-if="totalCount > 0">
+      <slot name="permissions-header">Currently Shared With</slot>
+    </h5>
     <b-table
       v-if="usersCount > 0"
       id="modal-user-table"
       hover
-      :items="sortedUserPermissions"
+      :items="sortedUserPermissionsData"
       :fields="userFields"
     >
       <template
         slot="name"
         slot-scope="data"
       >
-        <span :title="data.item.user.userId">{{data.item.user.firstName}} {{data.item.user.lastName}}</span>
+        <span :title="data.item.user.userId" :class="data.item.classes">{{data.item.user.firstName}} {{data.item.user.lastName}}</span>
       </template>
       <template
         slot="email"
         slot-scope="data"
       >
-        {{data.item.user.email}}
+        <span :class="data.item.classes">{{data.item.user.email}}</span>
       </template>
       <template
         slot="permission"
         slot-scope="data"
       >
         <b-form-select
+          v-if="!data.item.readonly"
           v-model="data.item.permissionType"
           :options="permissionOptions"
         />
+        <span
+          v-else
+          class="text-uppercase"
+          :class="data.item.classes"
+        >{{ data.item.permissionTypeLabel }}</span>
       </template>
       <template
         slot="remove"
         slot-scope="data"
       >
-        <b-link @click="removeUser(data.item.user)">
+        <b-link v-if="!data.item.readonly" @click="removeUser(data.item.user)">
           <span class="fa fa-trash"></span>
         </b-link>
       </template>
@@ -131,6 +140,17 @@ export default {
     disallowEditingAdminGroups: {
       type: Boolean,
       default: true
+    },
+    readonly: {
+      type: Boolean,
+      default: false
+    },
+    parentEntityOwner: {
+      type: models.UserProfile,
+    },
+    parentEntityLabel: {
+      type: String,
+      default: "Parent"
     }
   },
   components: {
@@ -157,14 +177,33 @@ export default {
         ? this.data.userPermissions.length
         : 0;
     },
-    sortedUserPermissions: function() {
+    sortedUserPermissionsData: function() {
       const userPermsCopy = this.data.userPermissions
         ? this.data.userPermissions.slice()
         : [];
-      return utils.StringUtils.sortIgnoreCase(
+      const sorted = utils.StringUtils.sortIgnoreCase(
         userPermsCopy,
         userPerm => userPerm.user.lastName + ", " + userPerm.user.firstName
       );
+      const sortedData = sorted.map(up => {
+        return {
+          user: up.user,
+          permissionType: up.permissionType,
+          permissionTypeLabel: up.permissionType.name,
+          readonly: this.readonly,
+          classes: this.readonly ? ['text-muted', 'font-italic'] : null
+        }
+      });
+      if (this.parentEntityOwner) {
+        sortedData.push({
+          user: this.parentEntityOwner,
+          permissionType: models.ResourcePermissionType.OWNER,
+          permissionTypeLabel: this.parentEntityLabel + " OWNER",
+          readonly: true,
+          classes: ['text-muted', 'font-italic']
+        });
+      }
+      return sortedData;
     },
     filteredGroupPermissions: function() {
       return this.data && this.data.groupPermissions
@@ -279,7 +318,7 @@ export default {
      * should not be allowed.
      */
     editingAllowed(group) {
-      return !this.disallowEditingAdminGroups || !group.isAdminGroup;
+      return !this.readonly && (!this.disallowEditingAdminGroups || !group.isAdminGroup);
     }
   }
 };


[airavata-django-portal] 04/06: AIRAVATA-3030 Loading directly granted sharings for editing

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 8e7ad61cf2881ade620bf46d0e0d260050f7cb3f
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Thu May 9 12:13:55 2019 -0400

    AIRAVATA-3030 Loading directly granted sharings for editing
---
 airavata/api/Airavata-remote                       |   14 +
 airavata/api/Airavata.py                           | 1122 +++++++++++++++-----
 airavata/api/sharing/SharingRegistryService-remote |   14 +
 airavata/api/sharing/SharingRegistryService.py     |  562 +++++++++-
 django_airavata/apps/api/views.py                  |   66 +-
 5 files changed, 1468 insertions(+), 310 deletions(-)

diff --git a/airavata/api/Airavata-remote b/airavata/api/Airavata-remote
index 9ff7ab4..6957696 100755
--- a/airavata/api/Airavata-remote
+++ b/airavata/api/Airavata-remote
@@ -189,6 +189,8 @@ if len(sys.argv) <= 1 or sys.argv[1] == '--help':
     print('  bool revokeSharingOfResourceFromGroups(AuthzToken authzToken, string resourceId,  groupPermissionList)')
     print('   getAllAccessibleUsers(AuthzToken authzToken, string resourceId, ResourcePermissionType permissionType)')
     print('   getAllAccessibleGroups(AuthzToken authzToken, string resourceId, ResourcePermissionType permissionType)')
+    print('   getAllDirectlyAccessibleUsers(AuthzToken authzToken, string resourceId, ResourcePermissionType permissionType)')
+    print('   getAllDirectlyAccessibleGroups(AuthzToken authzToken, string resourceId, ResourcePermissionType permissionType)')
     print('  bool userHasAccess(AuthzToken authzToken, string resourceId, ResourcePermissionType permissionType)')
     print('  string createGroupResourceProfile(AuthzToken authzToken, GroupResourceProfile groupResourceProfile)')
     print('  void updateGroupResourceProfile(AuthzToken authzToken, GroupResourceProfile groupResourceProfile)')
@@ -1283,6 +1285,18 @@ elif cmd == 'getAllAccessibleGroups':
         sys.exit(1)
     pp.pprint(client.getAllAccessibleGroups(eval(args[0]), args[1], eval(args[2]),))
 
+elif cmd == 'getAllDirectlyAccessibleUsers':
+    if len(args) != 3:
+        print('getAllDirectlyAccessibleUsers requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getAllDirectlyAccessibleUsers(eval(args[0]), args[1], eval(args[2]),))
+
+elif cmd == 'getAllDirectlyAccessibleGroups':
+    if len(args) != 3:
+        print('getAllDirectlyAccessibleGroups requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getAllDirectlyAccessibleGroups(eval(args[0]), args[1], eval(args[2]),))
+
 elif cmd == 'userHasAccess':
     if len(args) != 3:
         print('userHasAccess requires 3 args')
diff --git a/airavata/api/Airavata.py b/airavata/api/Airavata.py
index be91e70..b6e7762 100644
--- a/airavata/api/Airavata.py
+++ b/airavata/api/Airavata.py
@@ -3371,6 +3371,24 @@ class Iface(object):
         """
         pass
 
+    def getAllDirectlyAccessibleUsers(self, authzToken, resourceId, permissionType):
+        """
+        Parameters:
+         - authzToken
+         - resourceId
+         - permissionType
+        """
+        pass
+
+    def getAllDirectlyAccessibleGroups(self, authzToken, resourceId, permissionType):
+        """
+        Parameters:
+         - authzToken
+         - resourceId
+         - permissionType
+        """
+        pass
+
     def userHasAccess(self, authzToken, resourceId, permissionType):
         """
         Parameters:
@@ -12525,6 +12543,92 @@ class Client(Iface):
             raise result.ae
         raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllAccessibleGroups failed: unknown result")
 
+    def getAllDirectlyAccessibleUsers(self, authzToken, resourceId, permissionType):
+        """
+        Parameters:
+         - authzToken
+         - resourceId
+         - permissionType
+        """
+        self.send_getAllDirectlyAccessibleUsers(authzToken, resourceId, permissionType)
+        return self.recv_getAllDirectlyAccessibleUsers()
+
+    def send_getAllDirectlyAccessibleUsers(self, authzToken, resourceId, permissionType):
+        self._oprot.writeMessageBegin('getAllDirectlyAccessibleUsers', TMessageType.CALL, self._seqid)
+        args = getAllDirectlyAccessibleUsers_args()
+        args.authzToken = authzToken
+        args.resourceId = resourceId
+        args.permissionType = permissionType
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllDirectlyAccessibleUsers(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllDirectlyAccessibleUsers_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        if result.ae is not None:
+            raise result.ae
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllDirectlyAccessibleUsers failed: unknown result")
+
+    def getAllDirectlyAccessibleGroups(self, authzToken, resourceId, permissionType):
+        """
+        Parameters:
+         - authzToken
+         - resourceId
+         - permissionType
+        """
+        self.send_getAllDirectlyAccessibleGroups(authzToken, resourceId, permissionType)
+        return self.recv_getAllDirectlyAccessibleGroups()
+
+    def send_getAllDirectlyAccessibleGroups(self, authzToken, resourceId, permissionType):
+        self._oprot.writeMessageBegin('getAllDirectlyAccessibleGroups', TMessageType.CALL, self._seqid)
+        args = getAllDirectlyAccessibleGroups_args()
+        args.authzToken = authzToken
+        args.resourceId = resourceId
+        args.permissionType = permissionType
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getAllDirectlyAccessibleGroups(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getAllDirectlyAccessibleGroups_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ire is not None:
+            raise result.ire
+        if result.ace is not None:
+            raise result.ace
+        if result.ase is not None:
+            raise result.ase
+        if result.ae is not None:
+            raise result.ae
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getAllDirectlyAccessibleGroups failed: unknown result")
+
     def userHasAccess(self, authzToken, resourceId, permissionType):
         """
         Parameters:
@@ -13734,6 +13838,8 @@ class Processor(Iface, TProcessor):
         self._processMap["revokeSharingOfResourceFromGroups"] = Processor.process_revokeSharingOfResourceFromGroups
         self._processMap["getAllAccessibleUsers"] = Processor.process_getAllAccessibleUsers
         self._processMap["getAllAccessibleGroups"] = Processor.process_getAllAccessibleGroups
+        self._processMap["getAllDirectlyAccessibleUsers"] = Processor.process_getAllDirectlyAccessibleUsers
+        self._processMap["getAllDirectlyAccessibleGroups"] = Processor.process_getAllDirectlyAccessibleGroups
         self._processMap["userHasAccess"] = Processor.process_userHasAccess
         self._processMap["createGroupResourceProfile"] = Processor.process_createGroupResourceProfile
         self._processMap["updateGroupResourceProfile"] = Processor.process_updateGroupResourceProfile
@@ -18920,6 +19026,68 @@ class Processor(Iface, TProcessor):
         oprot.writeMessageEnd()
         oprot.trans.flush()
 
+    def process_getAllDirectlyAccessibleUsers(self, seqid, iprot, oprot):
+        args = getAllDirectlyAccessibleUsers_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllDirectlyAccessibleUsers_result()
+        try:
+            result.success = self._handler.getAllDirectlyAccessibleUsers(args.authzToken, args.resourceId, args.permissionType)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except airavata.api.error.ttypes.AuthorizationException as ae:
+            msg_type = TMessageType.REPLY
+            result.ae = ae
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllDirectlyAccessibleUsers", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_getAllDirectlyAccessibleGroups(self, seqid, iprot, oprot):
+        args = getAllDirectlyAccessibleGroups_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getAllDirectlyAccessibleGroups_result()
+        try:
+            result.success = self._handler.getAllDirectlyAccessibleGroups(args.authzToken, args.resourceId, args.permissionType)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.api.error.ttypes.InvalidRequestException as ire:
+            msg_type = TMessageType.REPLY
+            result.ire = ire
+        except airavata.api.error.ttypes.AiravataClientException as ace:
+            msg_type = TMessageType.REPLY
+            result.ace = ace
+        except airavata.api.error.ttypes.AiravataSystemException as ase:
+            msg_type = TMessageType.REPLY
+            result.ase = ase
+        except airavata.api.error.ttypes.AuthorizationException as ae:
+            msg_type = TMessageType.REPLY
+            result.ae = ae
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getAllDirectlyAccessibleGroups", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
     def process_userHasAccess(self, seqid, iprot, oprot):
         args = userHasAccess_args()
         args.read(iprot)
@@ -50647,19 +50815,394 @@ class deleteUserStoragePreference_result(object):
         return not (self == other)
 
 
-class getLatestQueueStatuses_args(object):
+class getLatestQueueStatuses_args(object):
+    """
+    Attributes:
+     - authzToken
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, authzToken=None,):
+        self.authzToken = authzToken
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.authzToken = airavata.model.security.ttypes.AuthzToken()
+                    self.authzToken.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getLatestQueueStatuses_args')
+        if self.authzToken is not None:
+            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
+            self.authzToken.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.authzToken is None:
+            raise TProtocolException(message='Required field authzToken is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getLatestQueueStatuses_result(object):
+    """
+    Attributes:
+     - success
+     - ire
+     - ace
+     - ase
+     - ae
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.status.ttypes.QueueStatusModel, airavata.model.status.ttypes.QueueStatusModel.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
+        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
+        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
+        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
+    )
+
+    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
+        self.success = success
+        self.ire = ire
+        self.ace = ace
+        self.ase = ase
+        self.ae = ae
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype280, _size277) = iprot.readListBegin()
+                    for _i281 in range(_size277):
+                        _elem282 = airavata.model.status.ttypes.QueueStatusModel()
+                        _elem282.read(iprot)
+                        self.success.append(_elem282)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
+                    self.ire.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException()
+                    self.ace.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
+                    self.ase.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRUCT:
+                    self.ae = airavata.api.error.ttypes.AuthorizationException()
+                    self.ae.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getLatestQueueStatuses_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter283 in self.success:
+                iter283.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ae is not None:
+            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
+            self.ae.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class registerDataProduct_args(object):
+    """
+    Attributes:
+     - authzToken
+     - dataProductModel
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
+        (2, TType.STRUCT, 'dataProductModel', (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 2
+    )
+
+    def __init__(self, authzToken=None, dataProductModel=None,):
+        self.authzToken = authzToken
+        self.dataProductModel = dataProductModel
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRUCT:
+                    self.authzToken = airavata.model.security.ttypes.AuthzToken()
+                    self.authzToken.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.dataProductModel = airavata.model.data.replica.ttypes.DataProductModel()
+                    self.dataProductModel.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('registerDataProduct_args')
+        if self.authzToken is not None:
+            oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
+            self.authzToken.write(oprot)
+            oprot.writeFieldEnd()
+        if self.dataProductModel is not None:
+            oprot.writeFieldBegin('dataProductModel', TType.STRUCT, 2)
+            self.dataProductModel.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.authzToken is None:
+            raise TProtocolException(message='Required field authzToken is unset!')
+        if self.dataProductModel is None:
+            raise TProtocolException(message='Required field dataProductModel is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class registerDataProduct_result(object):
+    """
+    Attributes:
+     - success
+     - ire
+     - ace
+     - ase
+     - ae
+    """
+
+    thrift_spec = (
+        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
+        (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
+        (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
+        (4, TType.STRUCT, 'ae', (airavata.api.error.ttypes.AuthorizationException, airavata.api.error.ttypes.AuthorizationException.thrift_spec), None, ),  # 4
+    )
+
+    def __init__(self, success=None, ire=None, ace=None, ase=None, ae=None,):
+        self.success = success
+        self.ire = ire
+        self.ace = ace
+        self.ase = ase
+        self.ae = ae
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.STRING:
+                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ire = airavata.api.error.ttypes.InvalidRequestException()
+                    self.ire.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRUCT:
+                    self.ace = airavata.api.error.ttypes.AiravataClientException()
+                    self.ace.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRUCT:
+                    self.ase = airavata.api.error.ttypes.AiravataSystemException()
+                    self.ase.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.STRUCT:
+                    self.ae = airavata.api.error.ttypes.AuthorizationException()
+                    self.ae.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('registerDataProduct_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.STRING, 0)
+            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldEnd()
+        if self.ire is not None:
+            oprot.writeFieldBegin('ire', TType.STRUCT, 1)
+            self.ire.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ace is not None:
+            oprot.writeFieldBegin('ace', TType.STRUCT, 2)
+            self.ace.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ase is not None:
+            oprot.writeFieldBegin('ase', TType.STRUCT, 3)
+            self.ase.write(oprot)
+            oprot.writeFieldEnd()
+        if self.ae is not None:
+            oprot.writeFieldBegin('ae', TType.STRUCT, 4)
+            self.ae.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getDataProduct_args(object):
     """
     Attributes:
      - authzToken
+     - dataProductUri
     """
 
     thrift_spec = (
         None,  # 0
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
+        (2, TType.STRING, 'dataProductUri', 'UTF8', None, ),  # 2
     )
 
-    def __init__(self, authzToken=None,):
+    def __init__(self, authzToken=None, dataProductUri=None,):
         self.authzToken = authzToken
+        self.dataProductUri = dataProductUri
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -50676,6 +51219,11 @@ class getLatestQueueStatuses_args(object):
                     self.authzToken.read(iprot)
                 else:
                     iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.dataProductUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
             else:
                 iprot.skip(ftype)
             iprot.readFieldEnd()
@@ -50685,17 +51233,23 @@ class getLatestQueueStatuses_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getLatestQueueStatuses_args')
+        oprot.writeStructBegin('getDataProduct_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
             oprot.writeFieldEnd()
+        if self.dataProductUri is not None:
+            oprot.writeFieldBegin('dataProductUri', TType.STRING, 2)
+            oprot.writeString(self.dataProductUri.encode('utf-8') if sys.version_info[0] == 2 else self.dataProductUri)
+            oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
 
     def validate(self):
         if self.authzToken is None:
             raise TProtocolException(message='Required field authzToken is unset!')
+        if self.dataProductUri is None:
+            raise TProtocolException(message='Required field dataProductUri is unset!')
         return
 
     def __repr__(self):
@@ -50710,7 +51264,7 @@ class getLatestQueueStatuses_args(object):
         return not (self == other)
 
 
-class getLatestQueueStatuses_result(object):
+class getDataProduct_result(object):
     """
     Attributes:
      - success
@@ -50721,7 +51275,7 @@ class getLatestQueueStatuses_result(object):
     """
 
     thrift_spec = (
-        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.status.ttypes.QueueStatusModel, airavata.model.status.ttypes.QueueStatusModel.thrift_spec), False), None, ),  # 0
+        (0, TType.STRUCT, 'success', (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 0
         (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
         (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
         (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
@@ -50745,14 +51299,9 @@ class getLatestQueueStatuses_result(object):
             if ftype == TType.STOP:
                 break
             if fid == 0:
-                if ftype == TType.LIST:
-                    self.success = []
-                    (_etype280, _size277) = iprot.readListBegin()
-                    for _i281 in range(_size277):
-                        _elem282 = airavata.model.status.ttypes.QueueStatusModel()
-                        _elem282.read(iprot)
-                        self.success.append(_elem282)
-                    iprot.readListEnd()
+                if ftype == TType.STRUCT:
+                    self.success = airavata.model.data.replica.ttypes.DataProductModel()
+                    self.success.read(iprot)
                 else:
                     iprot.skip(ftype)
             elif fid == 1:
@@ -50788,13 +51337,10 @@ class getLatestQueueStatuses_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getLatestQueueStatuses_result')
+        oprot.writeStructBegin('getDataProduct_result')
         if self.success is not None:
-            oprot.writeFieldBegin('success', TType.LIST, 0)
-            oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter283 in self.success:
-                iter283.write(oprot)
-            oprot.writeListEnd()
+            oprot.writeFieldBegin('success', TType.STRUCT, 0)
+            self.success.write(oprot)
             oprot.writeFieldEnd()
         if self.ire is not None:
             oprot.writeFieldBegin('ire', TType.STRUCT, 1)
@@ -50830,22 +51376,22 @@ class getLatestQueueStatuses_result(object):
         return not (self == other)
 
 
-class registerDataProduct_args(object):
+class registerReplicaLocation_args(object):
     """
     Attributes:
      - authzToken
-     - dataProductModel
+     - replicaLocationModel
     """
 
     thrift_spec = (
         None,  # 0
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
-        (2, TType.STRUCT, 'dataProductModel', (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 2
+        (2, TType.STRUCT, 'replicaLocationModel', (airavata.model.data.replica.ttypes.DataReplicaLocationModel, airavata.model.data.replica.ttypes.DataReplicaLocationModel.thrift_spec), None, ),  # 2
     )
 
-    def __init__(self, authzToken=None, dataProductModel=None,):
+    def __init__(self, authzToken=None, replicaLocationModel=None,):
         self.authzToken = authzToken
-        self.dataProductModel = dataProductModel
+        self.replicaLocationModel = replicaLocationModel
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -50864,8 +51410,8 @@ class registerDataProduct_args(object):
                     iprot.skip(ftype)
             elif fid == 2:
                 if ftype == TType.STRUCT:
-                    self.dataProductModel = airavata.model.data.replica.ttypes.DataProductModel()
-                    self.dataProductModel.read(iprot)
+                    self.replicaLocationModel = airavata.model.data.replica.ttypes.DataReplicaLocationModel()
+                    self.replicaLocationModel.read(iprot)
                 else:
                     iprot.skip(ftype)
             else:
@@ -50877,14 +51423,14 @@ class registerDataProduct_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('registerDataProduct_args')
+        oprot.writeStructBegin('registerReplicaLocation_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
             oprot.writeFieldEnd()
-        if self.dataProductModel is not None:
-            oprot.writeFieldBegin('dataProductModel', TType.STRUCT, 2)
-            self.dataProductModel.write(oprot)
+        if self.replicaLocationModel is not None:
+            oprot.writeFieldBegin('replicaLocationModel', TType.STRUCT, 2)
+            self.replicaLocationModel.write(oprot)
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -50892,8 +51438,8 @@ class registerDataProduct_args(object):
     def validate(self):
         if self.authzToken is None:
             raise TProtocolException(message='Required field authzToken is unset!')
-        if self.dataProductModel is None:
-            raise TProtocolException(message='Required field dataProductModel is unset!')
+        if self.replicaLocationModel is None:
+            raise TProtocolException(message='Required field replicaLocationModel is unset!')
         return
 
     def __repr__(self):
@@ -50908,7 +51454,7 @@ class registerDataProduct_args(object):
         return not (self == other)
 
 
-class registerDataProduct_result(object):
+class registerReplicaLocation_result(object):
     """
     Attributes:
      - success
@@ -50980,7 +51526,7 @@ class registerDataProduct_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('registerDataProduct_result')
+        oprot.writeStructBegin('registerReplicaLocation_result')
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.STRING, 0)
             oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
@@ -51019,22 +51565,22 @@ class registerDataProduct_result(object):
         return not (self == other)
 
 
-class getDataProduct_args(object):
+class getParentDataProduct_args(object):
     """
     Attributes:
      - authzToken
-     - dataProductUri
+     - productUri
     """
 
     thrift_spec = (
         None,  # 0
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
-        (2, TType.STRING, 'dataProductUri', 'UTF8', None, ),  # 2
+        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
     )
 
-    def __init__(self, authzToken=None, dataProductUri=None,):
+    def __init__(self, authzToken=None, productUri=None,):
         self.authzToken = authzToken
-        self.dataProductUri = dataProductUri
+        self.productUri = productUri
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -51053,7 +51599,7 @@ class getDataProduct_args(object):
                     iprot.skip(ftype)
             elif fid == 2:
                 if ftype == TType.STRING:
-                    self.dataProductUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
             else:
@@ -51065,14 +51611,14 @@ class getDataProduct_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getDataProduct_args')
+        oprot.writeStructBegin('getParentDataProduct_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
             oprot.writeFieldEnd()
-        if self.dataProductUri is not None:
-            oprot.writeFieldBegin('dataProductUri', TType.STRING, 2)
-            oprot.writeString(self.dataProductUri.encode('utf-8') if sys.version_info[0] == 2 else self.dataProductUri)
+        if self.productUri is not None:
+            oprot.writeFieldBegin('productUri', TType.STRING, 2)
+            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -51080,8 +51626,8 @@ class getDataProduct_args(object):
     def validate(self):
         if self.authzToken is None:
             raise TProtocolException(message='Required field authzToken is unset!')
-        if self.dataProductUri is None:
-            raise TProtocolException(message='Required field dataProductUri is unset!')
+        if self.productUri is None:
+            raise TProtocolException(message='Required field productUri is unset!')
         return
 
     def __repr__(self):
@@ -51096,7 +51642,7 @@ class getDataProduct_args(object):
         return not (self == other)
 
 
-class getDataProduct_result(object):
+class getParentDataProduct_result(object):
     """
     Attributes:
      - success
@@ -51169,7 +51715,7 @@ class getDataProduct_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getDataProduct_result')
+        oprot.writeStructBegin('getParentDataProduct_result')
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.STRUCT, 0)
             self.success.write(oprot)
@@ -51208,22 +51754,22 @@ class getDataProduct_result(object):
         return not (self == other)
 
 
-class registerReplicaLocation_args(object):
+class getChildDataProducts_args(object):
     """
     Attributes:
      - authzToken
-     - replicaLocationModel
+     - productUri
     """
 
     thrift_spec = (
         None,  # 0
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
-        (2, TType.STRUCT, 'replicaLocationModel', (airavata.model.data.replica.ttypes.DataReplicaLocationModel, airavata.model.data.replica.ttypes.DataReplicaLocationModel.thrift_spec), None, ),  # 2
+        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
     )
 
-    def __init__(self, authzToken=None, replicaLocationModel=None,):
+    def __init__(self, authzToken=None, productUri=None,):
         self.authzToken = authzToken
-        self.replicaLocationModel = replicaLocationModel
+        self.productUri = productUri
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -51241,9 +51787,8 @@ class registerReplicaLocation_args(object):
                 else:
                     iprot.skip(ftype)
             elif fid == 2:
-                if ftype == TType.STRUCT:
-                    self.replicaLocationModel = airavata.model.data.replica.ttypes.DataReplicaLocationModel()
-                    self.replicaLocationModel.read(iprot)
+                if ftype == TType.STRING:
+                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
             else:
@@ -51255,14 +51800,14 @@ class registerReplicaLocation_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('registerReplicaLocation_args')
+        oprot.writeStructBegin('getChildDataProducts_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
             oprot.writeFieldEnd()
-        if self.replicaLocationModel is not None:
-            oprot.writeFieldBegin('replicaLocationModel', TType.STRUCT, 2)
-            self.replicaLocationModel.write(oprot)
+        if self.productUri is not None:
+            oprot.writeFieldBegin('productUri', TType.STRING, 2)
+            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -51270,8 +51815,8 @@ class registerReplicaLocation_args(object):
     def validate(self):
         if self.authzToken is None:
             raise TProtocolException(message='Required field authzToken is unset!')
-        if self.replicaLocationModel is None:
-            raise TProtocolException(message='Required field replicaLocationModel is unset!')
+        if self.productUri is None:
+            raise TProtocolException(message='Required field productUri is unset!')
         return
 
     def __repr__(self):
@@ -51286,7 +51831,7 @@ class registerReplicaLocation_args(object):
         return not (self == other)
 
 
-class registerReplicaLocation_result(object):
+class getChildDataProducts_result(object):
     """
     Attributes:
      - success
@@ -51297,7 +51842,7 @@ class registerReplicaLocation_result(object):
     """
 
     thrift_spec = (
-        (0, TType.STRING, 'success', 'UTF8', None, ),  # 0
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), False), None, ),  # 0
         (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
         (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
         (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
@@ -51321,8 +51866,14 @@ class registerReplicaLocation_result(object):
             if ftype == TType.STOP:
                 break
             if fid == 0:
-                if ftype == TType.STRING:
-                    self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype287, _size284) = iprot.readListBegin()
+                    for _i288 in range(_size284):
+                        _elem289 = airavata.model.data.replica.ttypes.DataProductModel()
+                        _elem289.read(iprot)
+                        self.success.append(_elem289)
+                    iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
             elif fid == 1:
@@ -51358,10 +51909,13 @@ class registerReplicaLocation_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('registerReplicaLocation_result')
+        oprot.writeStructBegin('getChildDataProducts_result')
         if self.success is not None:
-            oprot.writeFieldBegin('success', TType.STRING, 0)
-            oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success)
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter290 in self.success:
+                iter290.write(oprot)
+            oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
             oprot.writeFieldBegin('ire', TType.STRUCT, 1)
@@ -51397,22 +51951,26 @@ class registerReplicaLocation_result(object):
         return not (self == other)
 
 
-class getParentDataProduct_args(object):
+class shareResourceWithUsers_args(object):
     """
     Attributes:
      - authzToken
-     - productUri
+     - resourceId
+     - userPermissionList
     """
 
     thrift_spec = (
         None,  # 0
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
-        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
+        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
+        None,  # 3
+        (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
     )
 
-    def __init__(self, authzToken=None, productUri=None,):
+    def __init__(self, authzToken=None, resourceId=None, userPermissionList=None,):
         self.authzToken = authzToken
-        self.productUri = productUri
+        self.resourceId = resourceId
+        self.userPermissionList = userPermissionList
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -51431,7 +51989,18 @@ class getParentDataProduct_args(object):
                     iprot.skip(ftype)
             elif fid == 2:
                 if ftype == TType.STRING:
-                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                    self.resourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.MAP:
+                    self.userPermissionList = {}
+                    (_ktype292, _vtype293, _size291) = iprot.readMapBegin()
+                    for _i295 in range(_size291):
+                        _key296 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        _val297 = iprot.readI32()
+                        self.userPermissionList[_key296] = _val297
+                    iprot.readMapEnd()
                 else:
                     iprot.skip(ftype)
             else:
@@ -51443,14 +52012,22 @@ class getParentDataProduct_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getParentDataProduct_args')
+        oprot.writeStructBegin('shareResourceWithUsers_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
             oprot.writeFieldEnd()
-        if self.productUri is not None:
-            oprot.writeFieldBegin('productUri', TType.STRING, 2)
-            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
+        if self.resourceId is not None:
+            oprot.writeFieldBegin('resourceId', TType.STRING, 2)
+            oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
+            oprot.writeFieldEnd()
+        if self.userPermissionList is not None:
+            oprot.writeFieldBegin('userPermissionList', TType.MAP, 4)
+            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.userPermissionList))
+            for kiter298, viter299 in self.userPermissionList.items():
+                oprot.writeString(kiter298.encode('utf-8') if sys.version_info[0] == 2 else kiter298)
+                oprot.writeI32(viter299)
+            oprot.writeMapEnd()
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -51458,8 +52035,8 @@ class getParentDataProduct_args(object):
     def validate(self):
         if self.authzToken is None:
             raise TProtocolException(message='Required field authzToken is unset!')
-        if self.productUri is None:
-            raise TProtocolException(message='Required field productUri is unset!')
+        if self.resourceId is None:
+            raise TProtocolException(message='Required field resourceId is unset!')
         return
 
     def __repr__(self):
@@ -51474,7 +52051,7 @@ class getParentDataProduct_args(object):
         return not (self == other)
 
 
-class getParentDataProduct_result(object):
+class shareResourceWithUsers_result(object):
     """
     Attributes:
      - success
@@ -51485,7 +52062,7 @@ class getParentDataProduct_result(object):
     """
 
     thrift_spec = (
-        (0, TType.STRUCT, 'success', (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), None, ),  # 0
+        (0, TType.BOOL, 'success', None, None, ),  # 0
         (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
         (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
         (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
@@ -51509,9 +52086,8 @@ class getParentDataProduct_result(object):
             if ftype == TType.STOP:
                 break
             if fid == 0:
-                if ftype == TType.STRUCT:
-                    self.success = airavata.model.data.replica.ttypes.DataProductModel()
-                    self.success.read(iprot)
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
                 else:
                     iprot.skip(ftype)
             elif fid == 1:
@@ -51547,10 +52123,10 @@ class getParentDataProduct_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getParentDataProduct_result')
+        oprot.writeStructBegin('shareResourceWithUsers_result')
         if self.success is not None:
-            oprot.writeFieldBegin('success', TType.STRUCT, 0)
-            self.success.write(oprot)
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
             oprot.writeFieldEnd()
         if self.ire is not None:
             oprot.writeFieldBegin('ire', TType.STRUCT, 1)
@@ -51586,22 +52162,26 @@ class getParentDataProduct_result(object):
         return not (self == other)
 
 
-class getChildDataProducts_args(object):
+class shareResourceWithGroups_args(object):
     """
     Attributes:
      - authzToken
-     - productUri
+     - resourceId
+     - groupPermissionList
     """
 
     thrift_spec = (
         None,  # 0
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
-        (2, TType.STRING, 'productUri', 'UTF8', None, ),  # 2
+        (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
+        None,  # 3
+        (4, TType.MAP, 'groupPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
     )
 
-    def __init__(self, authzToken=None, productUri=None,):
+    def __init__(self, authzToken=None, resourceId=None, groupPermissionList=None,):
         self.authzToken = authzToken
-        self.productUri = productUri
+        self.resourceId = resourceId
+        self.groupPermissionList = groupPermissionList
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -51620,7 +52200,18 @@ class getChildDataProducts_args(object):
                     iprot.skip(ftype)
             elif fid == 2:
                 if ftype == TType.STRING:
-                    self.productUri = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                    self.resourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.MAP:
+                    self.groupPermissionList = {}
+                    (_ktype301, _vtype302, _size300) = iprot.readMapBegin()
+                    for _i304 in range(_size300):
+                        _key305 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        _val306 = iprot.readI32()
+                        self.groupPermissionList[_key305] = _val306
+                    iprot.readMapEnd()
                 else:
                     iprot.skip(ftype)
             else:
@@ -51632,14 +52223,22 @@ class getChildDataProducts_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getChildDataProducts_args')
+        oprot.writeStructBegin('shareResourceWithGroups_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
             oprot.writeFieldEnd()
-        if self.productUri is not None:
-            oprot.writeFieldBegin('productUri', TType.STRING, 2)
-            oprot.writeString(self.productUri.encode('utf-8') if sys.version_info[0] == 2 else self.productUri)
+        if self.resourceId is not None:
+            oprot.writeFieldBegin('resourceId', TType.STRING, 2)
+            oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
+            oprot.writeFieldEnd()
+        if self.groupPermissionList is not None:
+            oprot.writeFieldBegin('groupPermissionList', TType.MAP, 4)
+            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.groupPermissionList))
+            for kiter307, viter308 in self.groupPermissionList.items():
+                oprot.writeString(kiter307.encode('utf-8') if sys.version_info[0] == 2 else kiter307)
+                oprot.writeI32(viter308)
+            oprot.writeMapEnd()
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -51647,8 +52246,8 @@ class getChildDataProducts_args(object):
     def validate(self):
         if self.authzToken is None:
             raise TProtocolException(message='Required field authzToken is unset!')
-        if self.productUri is None:
-            raise TProtocolException(message='Required field productUri is unset!')
+        if self.resourceId is None:
+            raise TProtocolException(message='Required field resourceId is unset!')
         return
 
     def __repr__(self):
@@ -51663,7 +52262,7 @@ class getChildDataProducts_args(object):
         return not (self == other)
 
 
-class getChildDataProducts_result(object):
+class shareResourceWithGroups_result(object):
     """
     Attributes:
      - success
@@ -51674,7 +52273,7 @@ class getChildDataProducts_result(object):
     """
 
     thrift_spec = (
-        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.data.replica.ttypes.DataProductModel, airavata.model.data.replica.ttypes.DataProductModel.thrift_spec), False), None, ),  # 0
+        (0, TType.BOOL, 'success', None, None, ),  # 0
         (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
         (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
         (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
@@ -51698,14 +52297,8 @@ class getChildDataProducts_result(object):
             if ftype == TType.STOP:
                 break
             if fid == 0:
-                if ftype == TType.LIST:
-                    self.success = []
-                    (_etype287, _size284) = iprot.readListBegin()
-                    for _i288 in range(_size284):
-                        _elem289 = airavata.model.data.replica.ttypes.DataProductModel()
-                        _elem289.read(iprot)
-                        self.success.append(_elem289)
-                    iprot.readListEnd()
+                if ftype == TType.BOOL:
+                    self.success = iprot.readBool()
                 else:
                     iprot.skip(ftype)
             elif fid == 1:
@@ -51741,13 +52334,10 @@ class getChildDataProducts_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getChildDataProducts_result')
+        oprot.writeStructBegin('shareResourceWithGroups_result')
         if self.success is not None:
-            oprot.writeFieldBegin('success', TType.LIST, 0)
-            oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter290 in self.success:
-                iter290.write(oprot)
-            oprot.writeListEnd()
+            oprot.writeFieldBegin('success', TType.BOOL, 0)
+            oprot.writeBool(self.success)
             oprot.writeFieldEnd()
         if self.ire is not None:
             oprot.writeFieldBegin('ire', TType.STRUCT, 1)
@@ -51783,7 +52373,7 @@ class getChildDataProducts_result(object):
         return not (self == other)
 
 
-class shareResourceWithUsers_args(object):
+class revokeSharingOfResourceFromUsers_args(object):
     """
     Attributes:
      - authzToken
@@ -51827,11 +52417,11 @@ class shareResourceWithUsers_args(object):
             elif fid == 4:
                 if ftype == TType.MAP:
                     self.userPermissionList = {}
-                    (_ktype292, _vtype293, _size291) = iprot.readMapBegin()
-                    for _i295 in range(_size291):
-                        _key296 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        _val297 = iprot.readI32()
-                        self.userPermissionList[_key296] = _val297
+                    (_ktype310, _vtype311, _size309) = iprot.readMapBegin()
+                    for _i313 in range(_size309):
+                        _key314 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        _val315 = iprot.readI32()
+                        self.userPermissionList[_key314] = _val315
                     iprot.readMapEnd()
                 else:
                     iprot.skip(ftype)
@@ -51844,7 +52434,7 @@ class shareResourceWithUsers_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('shareResourceWithUsers_args')
+        oprot.writeStructBegin('revokeSharingOfResourceFromUsers_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
@@ -51856,9 +52446,9 @@ class shareResourceWithUsers_args(object):
         if self.userPermissionList is not None:
             oprot.writeFieldBegin('userPermissionList', TType.MAP, 4)
             oprot.writeMapBegin(TType.STRING, TType.I32, len(self.userPermissionList))
-            for kiter298, viter299 in self.userPermissionList.items():
-                oprot.writeString(kiter298.encode('utf-8') if sys.version_info[0] == 2 else kiter298)
-                oprot.writeI32(viter299)
+            for kiter316, viter317 in self.userPermissionList.items():
+                oprot.writeString(kiter316.encode('utf-8') if sys.version_info[0] == 2 else kiter316)
+                oprot.writeI32(viter317)
             oprot.writeMapEnd()
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
@@ -51883,7 +52473,7 @@ class shareResourceWithUsers_args(object):
         return not (self == other)
 
 
-class shareResourceWithUsers_result(object):
+class revokeSharingOfResourceFromUsers_result(object):
     """
     Attributes:
      - success
@@ -51955,7 +52545,7 @@ class shareResourceWithUsers_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('shareResourceWithUsers_result')
+        oprot.writeStructBegin('revokeSharingOfResourceFromUsers_result')
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.BOOL, 0)
             oprot.writeBool(self.success)
@@ -51994,7 +52584,7 @@ class shareResourceWithUsers_result(object):
         return not (self == other)
 
 
-class shareResourceWithGroups_args(object):
+class revokeSharingOfResourceFromGroups_args(object):
     """
     Attributes:
      - authzToken
@@ -52038,11 +52628,11 @@ class shareResourceWithGroups_args(object):
             elif fid == 4:
                 if ftype == TType.MAP:
                     self.groupPermissionList = {}
-                    (_ktype301, _vtype302, _size300) = iprot.readMapBegin()
-                    for _i304 in range(_size300):
-                        _key305 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        _val306 = iprot.readI32()
-                        self.groupPermissionList[_key305] = _val306
+                    (_ktype319, _vtype320, _size318) = iprot.readMapBegin()
+                    for _i322 in range(_size318):
+                        _key323 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        _val324 = iprot.readI32()
+                        self.groupPermissionList[_key323] = _val324
                     iprot.readMapEnd()
                 else:
                     iprot.skip(ftype)
@@ -52055,7 +52645,7 @@ class shareResourceWithGroups_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('shareResourceWithGroups_args')
+        oprot.writeStructBegin('revokeSharingOfResourceFromGroups_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
@@ -52067,9 +52657,9 @@ class shareResourceWithGroups_args(object):
         if self.groupPermissionList is not None:
             oprot.writeFieldBegin('groupPermissionList', TType.MAP, 4)
             oprot.writeMapBegin(TType.STRING, TType.I32, len(self.groupPermissionList))
-            for kiter307, viter308 in self.groupPermissionList.items():
-                oprot.writeString(kiter307.encode('utf-8') if sys.version_info[0] == 2 else kiter307)
-                oprot.writeI32(viter308)
+            for kiter325, viter326 in self.groupPermissionList.items():
+                oprot.writeString(kiter325.encode('utf-8') if sys.version_info[0] == 2 else kiter325)
+                oprot.writeI32(viter326)
             oprot.writeMapEnd()
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
@@ -52094,7 +52684,7 @@ class shareResourceWithGroups_args(object):
         return not (self == other)
 
 
-class shareResourceWithGroups_result(object):
+class revokeSharingOfResourceFromGroups_result(object):
     """
     Attributes:
      - success
@@ -52166,7 +52756,7 @@ class shareResourceWithGroups_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('shareResourceWithGroups_result')
+        oprot.writeStructBegin('revokeSharingOfResourceFromGroups_result')
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.BOOL, 0)
             oprot.writeBool(self.success)
@@ -52205,12 +52795,12 @@ class shareResourceWithGroups_result(object):
         return not (self == other)
 
 
-class revokeSharingOfResourceFromUsers_args(object):
+class getAllAccessibleUsers_args(object):
     """
     Attributes:
      - authzToken
      - resourceId
-     - userPermissionList
+     - permissionType
     """
 
     thrift_spec = (
@@ -52218,13 +52808,13 @@ class revokeSharingOfResourceFromUsers_args(object):
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
         (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
         None,  # 3
-        (4, TType.MAP, 'userPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
+        (4, TType.I32, 'permissionType', None, None, ),  # 4
     )
 
-    def __init__(self, authzToken=None, resourceId=None, userPermissionList=None,):
+    def __init__(self, authzToken=None, resourceId=None, permissionType=None,):
         self.authzToken = authzToken
         self.resourceId = resourceId
-        self.userPermissionList = userPermissionList
+        self.permissionType = permissionType
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -52247,14 +52837,8 @@ class revokeSharingOfResourceFromUsers_args(object):
                 else:
                     iprot.skip(ftype)
             elif fid == 4:
-                if ftype == TType.MAP:
-                    self.userPermissionList = {}
-                    (_ktype310, _vtype311, _size309) = iprot.readMapBegin()
-                    for _i313 in range(_size309):
-                        _key314 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        _val315 = iprot.readI32()
-                        self.userPermissionList[_key314] = _val315
-                    iprot.readMapEnd()
+                if ftype == TType.I32:
+                    self.permissionType = iprot.readI32()
                 else:
                     iprot.skip(ftype)
             else:
@@ -52266,7 +52850,7 @@ class revokeSharingOfResourceFromUsers_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('revokeSharingOfResourceFromUsers_args')
+        oprot.writeStructBegin('getAllAccessibleUsers_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
@@ -52275,13 +52859,9 @@ class revokeSharingOfResourceFromUsers_args(object):
             oprot.writeFieldBegin('resourceId', TType.STRING, 2)
             oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
             oprot.writeFieldEnd()
-        if self.userPermissionList is not None:
-            oprot.writeFieldBegin('userPermissionList', TType.MAP, 4)
-            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.userPermissionList))
-            for kiter316, viter317 in self.userPermissionList.items():
-                oprot.writeString(kiter316.encode('utf-8') if sys.version_info[0] == 2 else kiter316)
-                oprot.writeI32(viter317)
-            oprot.writeMapEnd()
+        if self.permissionType is not None:
+            oprot.writeFieldBegin('permissionType', TType.I32, 4)
+            oprot.writeI32(self.permissionType)
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -52291,6 +52871,8 @@ class revokeSharingOfResourceFromUsers_args(object):
             raise TProtocolException(message='Required field authzToken is unset!')
         if self.resourceId is None:
             raise TProtocolException(message='Required field resourceId is unset!')
+        if self.permissionType is None:
+            raise TProtocolException(message='Required field permissionType is unset!')
         return
 
     def __repr__(self):
@@ -52305,7 +52887,7 @@ class revokeSharingOfResourceFromUsers_args(object):
         return not (self == other)
 
 
-class revokeSharingOfResourceFromUsers_result(object):
+class getAllAccessibleUsers_result(object):
     """
     Attributes:
      - success
@@ -52316,7 +52898,7 @@ class revokeSharingOfResourceFromUsers_result(object):
     """
 
     thrift_spec = (
-        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
         (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
         (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
         (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
@@ -52340,8 +52922,13 @@ class revokeSharingOfResourceFromUsers_result(object):
             if ftype == TType.STOP:
                 break
             if fid == 0:
-                if ftype == TType.BOOL:
-                    self.success = iprot.readBool()
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype330, _size327) = iprot.readListBegin()
+                    for _i331 in range(_size327):
+                        _elem332 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success.append(_elem332)
+                    iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
             elif fid == 1:
@@ -52377,10 +52964,13 @@ class revokeSharingOfResourceFromUsers_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('revokeSharingOfResourceFromUsers_result')
+        oprot.writeStructBegin('getAllAccessibleUsers_result')
         if self.success is not None:
-            oprot.writeFieldBegin('success', TType.BOOL, 0)
-            oprot.writeBool(self.success)
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRING, len(self.success))
+            for iter333 in self.success:
+                oprot.writeString(iter333.encode('utf-8') if sys.version_info[0] == 2 else iter333)
+            oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
             oprot.writeFieldBegin('ire', TType.STRUCT, 1)
@@ -52416,12 +53006,12 @@ class revokeSharingOfResourceFromUsers_result(object):
         return not (self == other)
 
 
-class revokeSharingOfResourceFromGroups_args(object):
+class getAllAccessibleGroups_args(object):
     """
     Attributes:
      - authzToken
      - resourceId
-     - groupPermissionList
+     - permissionType
     """
 
     thrift_spec = (
@@ -52429,13 +53019,13 @@ class revokeSharingOfResourceFromGroups_args(object):
         (1, TType.STRUCT, 'authzToken', (airavata.model.security.ttypes.AuthzToken, airavata.model.security.ttypes.AuthzToken.thrift_spec), None, ),  # 1
         (2, TType.STRING, 'resourceId', 'UTF8', None, ),  # 2
         None,  # 3
-        (4, TType.MAP, 'groupPermissionList', (TType.STRING, 'UTF8', TType.I32, None, False), None, ),  # 4
+        (4, TType.I32, 'permissionType', None, None, ),  # 4
     )
 
-    def __init__(self, authzToken=None, resourceId=None, groupPermissionList=None,):
+    def __init__(self, authzToken=None, resourceId=None, permissionType=None,):
         self.authzToken = authzToken
         self.resourceId = resourceId
-        self.groupPermissionList = groupPermissionList
+        self.permissionType = permissionType
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -52458,14 +53048,8 @@ class revokeSharingOfResourceFromGroups_args(object):
                 else:
                     iprot.skip(ftype)
             elif fid == 4:
-                if ftype == TType.MAP:
-                    self.groupPermissionList = {}
-                    (_ktype319, _vtype320, _size318) = iprot.readMapBegin()
-                    for _i322 in range(_size318):
-                        _key323 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        _val324 = iprot.readI32()
-                        self.groupPermissionList[_key323] = _val324
-                    iprot.readMapEnd()
+                if ftype == TType.I32:
+                    self.permissionType = iprot.readI32()
                 else:
                     iprot.skip(ftype)
             else:
@@ -52477,7 +53061,7 @@ class revokeSharingOfResourceFromGroups_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('revokeSharingOfResourceFromGroups_args')
+        oprot.writeStructBegin('getAllAccessibleGroups_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
@@ -52486,13 +53070,9 @@ class revokeSharingOfResourceFromGroups_args(object):
             oprot.writeFieldBegin('resourceId', TType.STRING, 2)
             oprot.writeString(self.resourceId.encode('utf-8') if sys.version_info[0] == 2 else self.resourceId)
             oprot.writeFieldEnd()
-        if self.groupPermissionList is not None:
-            oprot.writeFieldBegin('groupPermissionList', TType.MAP, 4)
-            oprot.writeMapBegin(TType.STRING, TType.I32, len(self.groupPermissionList))
-            for kiter325, viter326 in self.groupPermissionList.items():
-                oprot.writeString(kiter325.encode('utf-8') if sys.version_info[0] == 2 else kiter325)
-                oprot.writeI32(viter326)
-            oprot.writeMapEnd()
+        if self.permissionType is not None:
+            oprot.writeFieldBegin('permissionType', TType.I32, 4)
+            oprot.writeI32(self.permissionType)
             oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
@@ -52502,6 +53082,8 @@ class revokeSharingOfResourceFromGroups_args(object):
             raise TProtocolException(message='Required field authzToken is unset!')
         if self.resourceId is None:
             raise TProtocolException(message='Required field resourceId is unset!')
+        if self.permissionType is None:
+            raise TProtocolException(message='Required field permissionType is unset!')
         return
 
     def __repr__(self):
@@ -52516,7 +53098,7 @@ class revokeSharingOfResourceFromGroups_args(object):
         return not (self == other)
 
 
-class revokeSharingOfResourceFromGroups_result(object):
+class getAllAccessibleGroups_result(object):
     """
     Attributes:
      - success
@@ -52527,7 +53109,7 @@ class revokeSharingOfResourceFromGroups_result(object):
     """
 
     thrift_spec = (
-        (0, TType.BOOL, 'success', None, None, ),  # 0
+        (0, TType.LIST, 'success', (TType.STRING, 'UTF8', False), None, ),  # 0
         (1, TType.STRUCT, 'ire', (airavata.api.error.ttypes.InvalidRequestException, airavata.api.error.ttypes.InvalidRequestException.thrift_spec), None, ),  # 1
         (2, TType.STRUCT, 'ace', (airavata.api.error.ttypes.AiravataClientException, airavata.api.error.ttypes.AiravataClientException.thrift_spec), None, ),  # 2
         (3, TType.STRUCT, 'ase', (airavata.api.error.ttypes.AiravataSystemException, airavata.api.error.ttypes.AiravataSystemException.thrift_spec), None, ),  # 3
@@ -52551,8 +53133,13 @@ class revokeSharingOfResourceFromGroups_result(object):
             if ftype == TType.STOP:
                 break
             if fid == 0:
-                if ftype == TType.BOOL:
-                    self.success = iprot.readBool()
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype337, _size334) = iprot.readListBegin()
+                    for _i338 in range(_size334):
+                        _elem339 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success.append(_elem339)
+                    iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
             elif fid == 1:
@@ -52588,10 +53175,13 @@ class revokeSharingOfResourceFromGroups_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('revokeSharingOfResourceFromGroups_result')
+        oprot.writeStructBegin('getAllAccessibleGroups_result')
         if self.success is not None:
-            oprot.writeFieldBegin('success', TType.BOOL, 0)
-            oprot.writeBool(self.success)
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRING, len(self.success))
+            for iter340 in self.success:
+                oprot.writeString(iter340.encode('utf-8') if sys.version_info[0] == 2 else iter340)
+            oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
             oprot.writeFieldBegin('ire', TType.STRUCT, 1)
@@ -52627,7 +53217,7 @@ class revokeSharingOfResourceFromGroups_result(object):
         return not (self == other)
 
 
-class getAllAccessibleUsers_args(object):
+class getAllDirectlyAccessibleUsers_args(object):
     """
     Attributes:
      - authzToken
@@ -52682,7 +53272,7 @@ class getAllAccessibleUsers_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getAllAccessibleUsers_args')
+        oprot.writeStructBegin('getAllDirectlyAccessibleUsers_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
@@ -52719,7 +53309,7 @@ class getAllAccessibleUsers_args(object):
         return not (self == other)
 
 
-class getAllAccessibleUsers_result(object):
+class getAllDirectlyAccessibleUsers_result(object):
     """
     Attributes:
      - success
@@ -52756,10 +53346,10 @@ class getAllAccessibleUsers_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype330, _size327) = iprot.readListBegin()
-                    for _i331 in range(_size327):
-                        _elem332 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        self.success.append(_elem332)
+                    (_etype344, _size341) = iprot.readListBegin()
+                    for _i345 in range(_size341):
+                        _elem346 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success.append(_elem346)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -52796,12 +53386,12 @@ class getAllAccessibleUsers_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getAllAccessibleUsers_result')
+        oprot.writeStructBegin('getAllDirectlyAccessibleUsers_result')
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRING, len(self.success))
-            for iter333 in self.success:
-                oprot.writeString(iter333.encode('utf-8') if sys.version_info[0] == 2 else iter333)
+            for iter347 in self.success:
+                oprot.writeString(iter347.encode('utf-8') if sys.version_info[0] == 2 else iter347)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -52838,7 +53428,7 @@ class getAllAccessibleUsers_result(object):
         return not (self == other)
 
 
-class getAllAccessibleGroups_args(object):
+class getAllDirectlyAccessibleGroups_args(object):
     """
     Attributes:
      - authzToken
@@ -52893,7 +53483,7 @@ class getAllAccessibleGroups_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getAllAccessibleGroups_args')
+        oprot.writeStructBegin('getAllDirectlyAccessibleGroups_args')
         if self.authzToken is not None:
             oprot.writeFieldBegin('authzToken', TType.STRUCT, 1)
             self.authzToken.write(oprot)
@@ -52930,7 +53520,7 @@ class getAllAccessibleGroups_args(object):
         return not (self == other)
 
 
-class getAllAccessibleGroups_result(object):
+class getAllDirectlyAccessibleGroups_result(object):
     """
     Attributes:
      - success
@@ -52967,10 +53557,10 @@ class getAllAccessibleGroups_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype337, _size334) = iprot.readListBegin()
-                    for _i338 in range(_size334):
-                        _elem339 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        self.success.append(_elem339)
+                    (_etype351, _size348) = iprot.readListBegin()
+                    for _i352 in range(_size348):
+                        _elem353 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.success.append(_elem353)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -53007,12 +53597,12 @@ class getAllAccessibleGroups_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getAllAccessibleGroups_result')
+        oprot.writeStructBegin('getAllDirectlyAccessibleGroups_result')
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRING, len(self.success))
-            for iter340 in self.success:
-                oprot.writeString(iter340.encode('utf-8') if sys.version_info[0] == 2 else iter340)
+            for iter354 in self.success:
+                oprot.writeString(iter354.encode('utf-8') if sys.version_info[0] == 2 else iter354)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -54109,11 +54699,11 @@ class getGroupResourceList_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype344, _size341) = iprot.readListBegin()
-                    for _i345 in range(_size341):
-                        _elem346 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile()
-                        _elem346.read(iprot)
-                        self.success.append(_elem346)
+                    (_etype358, _size355) = iprot.readListBegin()
+                    for _i359 in range(_size355):
+                        _elem360 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupResourceProfile()
+                        _elem360.read(iprot)
+                        self.success.append(_elem360)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -54154,8 +54744,8 @@ class getGroupResourceList_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter347 in self.success:
-                iter347.write(oprot)
+            for iter361 in self.success:
+                iter361.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -55465,11 +56055,11 @@ class getGroupComputeResourcePrefList_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype351, _size348) = iprot.readListBegin()
-                    for _i352 in range(_size348):
-                        _elem353 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference()
-                        _elem353.read(iprot)
-                        self.success.append(_elem353)
+                    (_etype365, _size362) = iprot.readListBegin()
+                    for _i366 in range(_size362):
+                        _elem367 = airavata.model.appcatalog.groupresourceprofile.ttypes.GroupComputeResourcePreference()
+                        _elem367.read(iprot)
+                        self.success.append(_elem367)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -55510,8 +56100,8 @@ class getGroupComputeResourcePrefList_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter354 in self.success:
-                iter354.write(oprot)
+            for iter368 in self.success:
+                iter368.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -55662,11 +56252,11 @@ class getGroupBatchQueueResourcePolicyList_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype358, _size355) = iprot.readListBegin()
-                    for _i359 in range(_size355):
-                        _elem360 = airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy()
-                        _elem360.read(iprot)
-                        self.success.append(_elem360)
+                    (_etype372, _size369) = iprot.readListBegin()
+                    for _i373 in range(_size369):
+                        _elem374 = airavata.model.appcatalog.groupresourceprofile.ttypes.BatchQueueResourcePolicy()
+                        _elem374.read(iprot)
+                        self.success.append(_elem374)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -55707,8 +56297,8 @@ class getGroupBatchQueueResourcePolicyList_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter361 in self.success:
-                iter361.write(oprot)
+            for iter375 in self.success:
+                iter375.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -55859,11 +56449,11 @@ class getGroupComputeResourcePolicyList_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype365, _size362) = iprot.readListBegin()
-                    for _i366 in range(_size362):
-                        _elem367 = airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy()
-                        _elem367.read(iprot)
-                        self.success.append(_elem367)
+                    (_etype379, _size376) = iprot.readListBegin()
+                    for _i380 in range(_size376):
+                        _elem381 = airavata.model.appcatalog.groupresourceprofile.ttypes.ComputeResourcePolicy()
+                        _elem381.read(iprot)
+                        self.success.append(_elem381)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -55904,8 +56494,8 @@ class getGroupComputeResourcePolicyList_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter368 in self.success:
-                iter368.write(oprot)
+            for iter382 in self.success:
+                iter382.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -56623,11 +57213,11 @@ class listAllParsers_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype372, _size369) = iprot.readListBegin()
-                    for _i373 in range(_size369):
-                        _elem374 = airavata.model.appcatalog.parser.ttypes.Parser()
-                        _elem374.read(iprot)
-                        self.success.append(_elem374)
+                    (_etype386, _size383) = iprot.readListBegin()
+                    for _i387 in range(_size383):
+                        _elem388 = airavata.model.appcatalog.parser.ttypes.Parser()
+                        _elem388.read(iprot)
+                        self.success.append(_elem388)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -56668,8 +57258,8 @@ class listAllParsers_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter375 in self.success:
-                iter375.write(oprot)
+            for iter389 in self.success:
+                iter389.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -57239,11 +57829,11 @@ class getParsingTemplatesForExperiment_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype379, _size376) = iprot.readListBegin()
-                    for _i380 in range(_size376):
-                        _elem381 = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
-                        _elem381.read(iprot)
-                        self.success.append(_elem381)
+                    (_etype393, _size390) = iprot.readListBegin()
+                    for _i394 in range(_size390):
+                        _elem395 = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
+                        _elem395.read(iprot)
+                        self.success.append(_elem395)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -57284,8 +57874,8 @@ class getParsingTemplatesForExperiment_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter382 in self.success:
-                iter382.write(oprot)
+            for iter396 in self.success:
+                iter396.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
@@ -57827,11 +58417,11 @@ class listAllParsingTemplates_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype386, _size383) = iprot.readListBegin()
-                    for _i387 in range(_size383):
-                        _elem388 = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
-                        _elem388.read(iprot)
-                        self.success.append(_elem388)
+                    (_etype400, _size397) = iprot.readListBegin()
+                    for _i401 in range(_size397):
+                        _elem402 = airavata.model.appcatalog.parser.ttypes.ParsingTemplate()
+                        _elem402.read(iprot)
+                        self.success.append(_elem402)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -57872,8 +58462,8 @@ class listAllParsingTemplates_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter389 in self.success:
-                iter389.write(oprot)
+            for iter403 in self.success:
+                iter403.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.ire is not None:
diff --git a/airavata/api/sharing/SharingRegistryService-remote b/airavata/api/sharing/SharingRegistryService-remote
index 4e45a36..4a0427e 100755
--- a/airavata/api/sharing/SharingRegistryService-remote
+++ b/airavata/api/sharing/SharingRegistryService-remote
@@ -67,7 +67,9 @@ if len(sys.argv) <= 1 or sys.argv[1] == '--help':
     print('  Entity getEntity(string domainId, string entityId)')
     print('   searchEntities(string domainId, string userId,  filters, i32 offset, i32 limit)')
     print('   getListOfSharedUsers(string domainId, string entityId, string permissionTypeId)')
+    print('   getListOfDirectlySharedUsers(string domainId, string entityId, string permissionTypeId)')
     print('   getListOfSharedGroups(string domainId, string entityId, string permissionTypeId)')
+    print('   getListOfDirectlySharedGroups(string domainId, string entityId, string permissionTypeId)')
     print('  string createPermissionType(PermissionType permissionType)')
     print('  bool updatePermissionType(PermissionType permissionType)')
     print('  bool isPermissionExists(string dimainId, string permissionId)')
@@ -416,12 +418,24 @@ elif cmd == 'getListOfSharedUsers':
         sys.exit(1)
     pp.pprint(client.getListOfSharedUsers(args[0], args[1], args[2],))
 
+elif cmd == 'getListOfDirectlySharedUsers':
+    if len(args) != 3:
+        print('getListOfDirectlySharedUsers requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getListOfDirectlySharedUsers(args[0], args[1], args[2],))
+
 elif cmd == 'getListOfSharedGroups':
     if len(args) != 3:
         print('getListOfSharedGroups requires 3 args')
         sys.exit(1)
     pp.pprint(client.getListOfSharedGroups(args[0], args[1], args[2],))
 
+elif cmd == 'getListOfDirectlySharedGroups':
+    if len(args) != 3:
+        print('getListOfDirectlySharedGroups requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.getListOfDirectlySharedGroups(args[0], args[1], args[2],))
+
 elif cmd == 'createPermissionType':
     if len(args) != 1:
         print('createPermissionType requires 1 args')
diff --git a/airavata/api/sharing/SharingRegistryService.py b/airavata/api/sharing/SharingRegistryService.py
index dd3c22f..1c4f702 100644
--- a/airavata/api/sharing/SharingRegistryService.py
+++ b/airavata/api/sharing/SharingRegistryService.py
@@ -454,6 +454,17 @@ class Iface(object):
         """
         pass
 
+    def getListOfDirectlySharedUsers(self, domainId, entityId, permissionTypeId):
+        """
+        <p>API method to get a list of shared users given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        pass
+
     def getListOfSharedGroups(self, domainId, entityId, permissionTypeId):
         """
         <p>API method to get a list of shared groups given the entity id</p>
@@ -465,6 +476,17 @@ class Iface(object):
         """
         pass
 
+    def getListOfDirectlySharedGroups(self, domainId, entityId, permissionTypeId):
+        """
+        <p>API method to get a list of directly shared groups given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        pass
+
     def createPermissionType(self, permissionType):
         """
         <p>API method to create permission type</p>
@@ -2204,6 +2226,45 @@ class Client(Iface):
             raise result.sre
         raise TApplicationException(TApplicationException.MISSING_RESULT, "getListOfSharedUsers failed: unknown result")
 
+    def getListOfDirectlySharedUsers(self, domainId, entityId, permissionTypeId):
+        """
+        <p>API method to get a list of shared users given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        self.send_getListOfDirectlySharedUsers(domainId, entityId, permissionTypeId)
+        return self.recv_getListOfDirectlySharedUsers()
+
+    def send_getListOfDirectlySharedUsers(self, domainId, entityId, permissionTypeId):
+        self._oprot.writeMessageBegin('getListOfDirectlySharedUsers', TMessageType.CALL, self._seqid)
+        args = getListOfDirectlySharedUsers_args()
+        args.domainId = domainId
+        args.entityId = entityId
+        args.permissionTypeId = permissionTypeId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getListOfDirectlySharedUsers(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getListOfDirectlySharedUsers_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.sre is not None:
+            raise result.sre
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getListOfDirectlySharedUsers failed: unknown result")
+
     def getListOfSharedGroups(self, domainId, entityId, permissionTypeId):
         """
         <p>API method to get a list of shared groups given the entity id</p>
@@ -2243,6 +2304,45 @@ class Client(Iface):
             raise result.sre
         raise TApplicationException(TApplicationException.MISSING_RESULT, "getListOfSharedGroups failed: unknown result")
 
+    def getListOfDirectlySharedGroups(self, domainId, entityId, permissionTypeId):
+        """
+        <p>API method to get a list of directly shared groups given the entity id where the sharing type is directly applied</p>
+
+        Parameters:
+         - domainId
+         - entityId
+         - permissionTypeId
+        """
+        self.send_getListOfDirectlySharedGroups(domainId, entityId, permissionTypeId)
+        return self.recv_getListOfDirectlySharedGroups()
+
+    def send_getListOfDirectlySharedGroups(self, domainId, entityId, permissionTypeId):
+        self._oprot.writeMessageBegin('getListOfDirectlySharedGroups', TMessageType.CALL, self._seqid)
+        args = getListOfDirectlySharedGroups_args()
+        args.domainId = domainId
+        args.entityId = entityId
+        args.permissionTypeId = permissionTypeId
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_getListOfDirectlySharedGroups(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = getListOfDirectlySharedGroups_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.sre is not None:
+            raise result.sre
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "getListOfDirectlySharedGroups failed: unknown result")
+
     def createPermissionType(self, permissionType):
         """
         <p>API method to create permission type</p>
@@ -2722,7 +2822,9 @@ class Processor(Iface, TProcessor):
         self._processMap["getEntity"] = Processor.process_getEntity
         self._processMap["searchEntities"] = Processor.process_searchEntities
         self._processMap["getListOfSharedUsers"] = Processor.process_getListOfSharedUsers
+        self._processMap["getListOfDirectlySharedUsers"] = Processor.process_getListOfDirectlySharedUsers
         self._processMap["getListOfSharedGroups"] = Processor.process_getListOfSharedGroups
+        self._processMap["getListOfDirectlySharedGroups"] = Processor.process_getListOfDirectlySharedGroups
         self._processMap["createPermissionType"] = Processor.process_createPermissionType
         self._processMap["updatePermissionType"] = Processor.process_updatePermissionType
         self._processMap["isPermissionExists"] = Processor.process_isPermissionExists
@@ -3702,6 +3804,28 @@ class Processor(Iface, TProcessor):
         oprot.writeMessageEnd()
         oprot.trans.flush()
 
+    def process_getListOfDirectlySharedUsers(self, seqid, iprot, oprot):
+        args = getListOfDirectlySharedUsers_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getListOfDirectlySharedUsers_result()
+        try:
+            result.success = self._handler.getListOfDirectlySharedUsers(args.domainId, args.entityId, args.permissionTypeId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.model.sharing.ttypes.SharingRegistryException as sre:
+            msg_type = TMessageType.REPLY
+            result.sre = sre
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getListOfDirectlySharedUsers", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
     def process_getListOfSharedGroups(self, seqid, iprot, oprot):
         args = getListOfSharedGroups_args()
         args.read(iprot)
@@ -3724,6 +3848,28 @@ class Processor(Iface, TProcessor):
         oprot.writeMessageEnd()
         oprot.trans.flush()
 
+    def process_getListOfDirectlySharedGroups(self, seqid, iprot, oprot):
+        args = getListOfDirectlySharedGroups_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = getListOfDirectlySharedGroups_result()
+        try:
+            result.success = self._handler.getListOfDirectlySharedGroups(args.domainId, args.entityId, args.permissionTypeId)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except airavata.model.sharing.ttypes.SharingRegistryException as sre:
+            msg_type = TMessageType.REPLY
+            result.sre = sre
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("getListOfDirectlySharedGroups", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
     def process_createPermissionType(self, seqid, iprot, oprot):
         args = createPermissionType_args()
         args.read(iprot)
@@ -10603,7 +10749,7 @@ class getListOfSharedUsers_result(object):
         return not (self == other)
 
 
-class getListOfSharedGroups_args(object):
+class getListOfDirectlySharedUsers_args(object):
     """
     Attributes:
      - domainId
@@ -10656,7 +10802,7 @@ class getListOfSharedGroups_args(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getListOfSharedGroups_args')
+        oprot.writeStructBegin('getListOfDirectlySharedUsers_args')
         if self.domainId is not None:
             oprot.writeFieldBegin('domainId', TType.STRING, 1)
             oprot.writeString(self.domainId.encode('utf-8') if sys.version_info[0] == 2 else self.domainId)
@@ -10693,7 +10839,7 @@ class getListOfSharedGroups_args(object):
         return not (self == other)
 
 
-class getListOfSharedGroups_result(object):
+class getListOfDirectlySharedUsers_result(object):
     """
     Attributes:
      - success
@@ -10701,7 +10847,7 @@ class getListOfSharedGroups_result(object):
     """
 
     thrift_spec = (
-        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.sharing.ttypes.UserGroup, airavata.model.sharing.ttypes.UserGroup.thrift_spec), False), None, ),  # 0
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.sharing.ttypes.User, airavata.model.sharing.ttypes.User.thrift_spec), False), None, ),  # 0
         (1, TType.STRUCT, 'sre', (airavata.model.sharing.ttypes.SharingRegistryException, airavata.model.sharing.ttypes.SharingRegistryException.thrift_spec), None, ),  # 1
     )
 
@@ -10723,7 +10869,7 @@ class getListOfSharedGroups_result(object):
                     self.success = []
                     (_etype108, _size105) = iprot.readListBegin()
                     for _i109 in range(_size105):
-                        _elem110 = airavata.model.sharing.ttypes.UserGroup()
+                        _elem110 = airavata.model.sharing.ttypes.User()
                         _elem110.read(iprot)
                         self.success.append(_elem110)
                     iprot.readListEnd()
@@ -10744,7 +10890,7 @@ class getListOfSharedGroups_result(object):
         if oprot._fast_encode is not None and self.thrift_spec is not None:
             oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
             return
-        oprot.writeStructBegin('getListOfSharedGroups_result')
+        oprot.writeStructBegin('getListOfDirectlySharedUsers_result')
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
@@ -10774,6 +10920,348 @@ class getListOfSharedGroups_result(object):
         return not (self == other)
 
 
+class getListOfSharedGroups_args(object):
+    """
+    Attributes:
+     - domainId
+     - entityId
+     - permissionTypeId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'domainId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'entityId', 'UTF8', None, ),  # 2
+        (3, TType.STRING, 'permissionTypeId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, domainId=None, entityId=None, permissionTypeId=None,):
+        self.domainId = domainId
+        self.entityId = entityId
+        self.permissionTypeId = permissionTypeId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.domainId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.entityId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.permissionTypeId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getListOfSharedGroups_args')
+        if self.domainId is not None:
+            oprot.writeFieldBegin('domainId', TType.STRING, 1)
+            oprot.writeString(self.domainId.encode('utf-8') if sys.version_info[0] == 2 else self.domainId)
+            oprot.writeFieldEnd()
+        if self.entityId is not None:
+            oprot.writeFieldBegin('entityId', TType.STRING, 2)
+            oprot.writeString(self.entityId.encode('utf-8') if sys.version_info[0] == 2 else self.entityId)
+            oprot.writeFieldEnd()
+        if self.permissionTypeId is not None:
+            oprot.writeFieldBegin('permissionTypeId', TType.STRING, 3)
+            oprot.writeString(self.permissionTypeId.encode('utf-8') if sys.version_info[0] == 2 else self.permissionTypeId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.domainId is None:
+            raise TProtocolException(message='Required field domainId is unset!')
+        if self.entityId is None:
+            raise TProtocolException(message='Required field entityId is unset!')
+        if self.permissionTypeId is None:
+            raise TProtocolException(message='Required field permissionTypeId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getListOfSharedGroups_result(object):
+    """
+    Attributes:
+     - success
+     - sre
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.sharing.ttypes.UserGroup, airavata.model.sharing.ttypes.UserGroup.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'sre', (airavata.model.sharing.ttypes.SharingRegistryException, airavata.model.sharing.ttypes.SharingRegistryException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, sre=None,):
+        self.success = success
+        self.sre = sre
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype115, _size112) = iprot.readListBegin()
+                    for _i116 in range(_size112):
+                        _elem117 = airavata.model.sharing.ttypes.UserGroup()
+                        _elem117.read(iprot)
+                        self.success.append(_elem117)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.sre = airavata.model.sharing.ttypes.SharingRegistryException()
+                    self.sre.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getListOfSharedGroups_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter118 in self.success:
+                iter118.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.sre is not None:
+            oprot.writeFieldBegin('sre', TType.STRUCT, 1)
+            self.sre.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getListOfDirectlySharedGroups_args(object):
+    """
+    Attributes:
+     - domainId
+     - entityId
+     - permissionTypeId
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.STRING, 'domainId', 'UTF8', None, ),  # 1
+        (2, TType.STRING, 'entityId', 'UTF8', None, ),  # 2
+        (3, TType.STRING, 'permissionTypeId', 'UTF8', None, ),  # 3
+    )
+
+    def __init__(self, domainId=None, entityId=None, permissionTypeId=None,):
+        self.domainId = domainId
+        self.entityId = entityId
+        self.permissionTypeId = permissionTypeId
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.STRING:
+                    self.domainId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.STRING:
+                    self.entityId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.STRING:
+                    self.permissionTypeId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getListOfDirectlySharedGroups_args')
+        if self.domainId is not None:
+            oprot.writeFieldBegin('domainId', TType.STRING, 1)
+            oprot.writeString(self.domainId.encode('utf-8') if sys.version_info[0] == 2 else self.domainId)
+            oprot.writeFieldEnd()
+        if self.entityId is not None:
+            oprot.writeFieldBegin('entityId', TType.STRING, 2)
+            oprot.writeString(self.entityId.encode('utf-8') if sys.version_info[0] == 2 else self.entityId)
+            oprot.writeFieldEnd()
+        if self.permissionTypeId is not None:
+            oprot.writeFieldBegin('permissionTypeId', TType.STRING, 3)
+            oprot.writeString(self.permissionTypeId.encode('utf-8') if sys.version_info[0] == 2 else self.permissionTypeId)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        if self.domainId is None:
+            raise TProtocolException(message='Required field domainId is unset!')
+        if self.entityId is None:
+            raise TProtocolException(message='Required field entityId is unset!')
+        if self.permissionTypeId is None:
+            raise TProtocolException(message='Required field permissionTypeId is unset!')
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class getListOfDirectlySharedGroups_result(object):
+    """
+    Attributes:
+     - success
+     - sre
+    """
+
+    thrift_spec = (
+        (0, TType.LIST, 'success', (TType.STRUCT, (airavata.model.sharing.ttypes.UserGroup, airavata.model.sharing.ttypes.UserGroup.thrift_spec), False), None, ),  # 0
+        (1, TType.STRUCT, 'sre', (airavata.model.sharing.ttypes.SharingRegistryException, airavata.model.sharing.ttypes.SharingRegistryException.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, sre=None,):
+        self.success = success
+        self.sre = sre
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.LIST:
+                    self.success = []
+                    (_etype122, _size119) = iprot.readListBegin()
+                    for _i123 in range(_size119):
+                        _elem124 = airavata.model.sharing.ttypes.UserGroup()
+                        _elem124.read(iprot)
+                        self.success.append(_elem124)
+                    iprot.readListEnd()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.sre = airavata.model.sharing.ttypes.SharingRegistryException()
+                    self.sre.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('getListOfDirectlySharedGroups_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.LIST, 0)
+            oprot.writeListBegin(TType.STRUCT, len(self.success))
+            for iter125 in self.success:
+                iter125.write(oprot)
+            oprot.writeListEnd()
+            oprot.writeFieldEnd()
+        if self.sre is not None:
+            oprot.writeFieldBegin('sre', TType.STRUCT, 1)
+            self.sre.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
 class createPermissionType_args(object):
     """
     Attributes:
@@ -11620,11 +12108,11 @@ class getPermissionTypes_result(object):
             if fid == 0:
                 if ftype == TType.LIST:
                     self.success = []
-                    (_etype115, _size112) = iprot.readListBegin()
-                    for _i116 in range(_size112):
-                        _elem117 = airavata.model.sharing.ttypes.PermissionType()
-                        _elem117.read(iprot)
-                        self.success.append(_elem117)
+                    (_etype129, _size126) = iprot.readListBegin()
+                    for _i130 in range(_size126):
+                        _elem131 = airavata.model.sharing.ttypes.PermissionType()
+                        _elem131.read(iprot)
+                        self.success.append(_elem131)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -11647,8 +12135,8 @@ class getPermissionTypes_result(object):
         if self.success is not None:
             oprot.writeFieldBegin('success', TType.LIST, 0)
             oprot.writeListBegin(TType.STRUCT, len(self.success))
-            for iter118 in self.success:
-                iter118.write(oprot)
+            for iter132 in self.success:
+                iter132.write(oprot)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.sre is not None:
@@ -11721,10 +12209,10 @@ class shareEntityWithUsers_args(object):
             elif fid == 3:
                 if ftype == TType.LIST:
                     self.userList = []
-                    (_etype122, _size119) = iprot.readListBegin()
-                    for _i123 in range(_size119):
-                        _elem124 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        self.userList.append(_elem124)
+                    (_etype136, _size133) = iprot.readListBegin()
+                    for _i137 in range(_size133):
+                        _elem138 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.userList.append(_elem138)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -11759,8 +12247,8 @@ class shareEntityWithUsers_args(object):
         if self.userList is not None:
             oprot.writeFieldBegin('userList', TType.LIST, 3)
             oprot.writeListBegin(TType.STRING, len(self.userList))
-            for iter125 in self.userList:
-                oprot.writeString(iter125.encode('utf-8') if sys.version_info[0] == 2 else iter125)
+            for iter139 in self.userList:
+                oprot.writeString(iter139.encode('utf-8') if sys.version_info[0] == 2 else iter139)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.permissionTypeId is not None:
@@ -11916,10 +12404,10 @@ class revokeEntitySharingFromUsers_args(object):
             elif fid == 3:
                 if ftype == TType.LIST:
                     self.userList = []
-                    (_etype129, _size126) = iprot.readListBegin()
-                    for _i130 in range(_size126):
-                        _elem131 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        self.userList.append(_elem131)
+                    (_etype143, _size140) = iprot.readListBegin()
+                    for _i144 in range(_size140):
+                        _elem145 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.userList.append(_elem145)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -11949,8 +12437,8 @@ class revokeEntitySharingFromUsers_args(object):
         if self.userList is not None:
             oprot.writeFieldBegin('userList', TType.LIST, 3)
             oprot.writeListBegin(TType.STRING, len(self.userList))
-            for iter132 in self.userList:
-                oprot.writeString(iter132.encode('utf-8') if sys.version_info[0] == 2 else iter132)
+            for iter146 in self.userList:
+                oprot.writeString(iter146.encode('utf-8') if sys.version_info[0] == 2 else iter146)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.permissionTypeId is not None:
@@ -12103,10 +12591,10 @@ class shareEntityWithGroups_args(object):
             elif fid == 3:
                 if ftype == TType.LIST:
                     self.groupList = []
-                    (_etype136, _size133) = iprot.readListBegin()
-                    for _i137 in range(_size133):
-                        _elem138 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        self.groupList.append(_elem138)
+                    (_etype150, _size147) = iprot.readListBegin()
+                    for _i151 in range(_size147):
+                        _elem152 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.groupList.append(_elem152)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -12141,8 +12629,8 @@ class shareEntityWithGroups_args(object):
         if self.groupList is not None:
             oprot.writeFieldBegin('groupList', TType.LIST, 3)
             oprot.writeListBegin(TType.STRING, len(self.groupList))
-            for iter139 in self.groupList:
-                oprot.writeString(iter139.encode('utf-8') if sys.version_info[0] == 2 else iter139)
+            for iter153 in self.groupList:
+                oprot.writeString(iter153.encode('utf-8') if sys.version_info[0] == 2 else iter153)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.permissionTypeId is not None:
@@ -12298,10 +12786,10 @@ class revokeEntitySharingFromGroups_args(object):
             elif fid == 3:
                 if ftype == TType.LIST:
                     self.groupList = []
-                    (_etype143, _size140) = iprot.readListBegin()
-                    for _i144 in range(_size140):
-                        _elem145 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
-                        self.groupList.append(_elem145)
+                    (_etype157, _size154) = iprot.readListBegin()
+                    for _i158 in range(_size154):
+                        _elem159 = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                        self.groupList.append(_elem159)
                     iprot.readListEnd()
                 else:
                     iprot.skip(ftype)
@@ -12331,8 +12819,8 @@ class revokeEntitySharingFromGroups_args(object):
         if self.groupList is not None:
             oprot.writeFieldBegin('groupList', TType.LIST, 3)
             oprot.writeListBegin(TType.STRING, len(self.groupList))
-            for iter146 in self.groupList:
-                oprot.writeString(iter146.encode('utf-8') if sys.version_info[0] == 2 else iter146)
+            for iter160 in self.groupList:
+                oprot.writeString(iter160.encode('utf-8') if sys.version_info[0] == 2 else iter160)
             oprot.writeListEnd()
             oprot.writeFieldEnd()
         if self.permissionTypeId is not None:
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 40874fe..85c7869 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -903,17 +903,19 @@ class SharedEntityViewSet(mixins.RetrieveModelMixin,
 
     def get_instance(self, lookup_value):
         users = {}
+        # Only load *directly* granted permissions since these are the only
+        # ones that can be edited
         # Load accessible users in order of permission precedence: users that
         # have WRITE permission should also have READ
-        users.update(self._load_accessible_users(
+        users.update(self._load_directly_accessible_users(
             lookup_value, ResourcePermissionType.READ))
-        users.update(self._load_accessible_users(
+        users.update(self._load_directly_accessible_users(
             lookup_value, ResourcePermissionType.WRITE))
-        owner_ids = self._load_accessible_users(lookup_value,
-                                                ResourcePermissionType.OWNER)
+        owner_ids = self._load_directly_accessible_users(
+            lookup_value, ResourcePermissionType.OWNER)
         # Assume that there is one and only one DIRECT owner (there may be one
         # or more INDIRECT cascading owners, which would the owners of the
-        # ancestor entities, but getAllAccessibleUsers does not return
+        # ancestor entities, but getAllDirectlyAccessibleUsers does not return
         # indirectly cascading owners)
         owner_id = list(owner_ids.keys())[0]
         # Remove owner from the users list
@@ -923,9 +925,9 @@ class SharedEntityViewSet(mixins.RetrieveModelMixin,
             user_list.append({'user': self._load_user_profile(user_id),
                               'permissionType': users[user_id]})
         groups = {}
-        groups.update(self._load_accessible_groups(
+        groups.update(self._load_directly_accessible_groups(
             lookup_value, ResourcePermissionType.READ))
-        groups.update(self._load_accessible_groups(
+        groups.update(self._load_directly_accessible_groups(
             lookup_value, ResourcePermissionType.WRITE))
         group_list = []
         for group_id in groups:
@@ -941,6 +943,11 @@ class SharedEntityViewSet(mixins.RetrieveModelMixin,
             self.authz_token, entity_id, permission_type)
         return {user_id: permission_type for user_id in users}
 
+    def _load_directly_accessible_users(self, entity_id, permission_type):
+        users = self.request.airavata_client.getAllDirectlyAccessibleUsers(
+            self.authz_token, entity_id, permission_type)
+        return {user_id: permission_type for user_id in users}
+
     def _load_user_profile(self, user_id):
         user_profile_client = self.request.profile_service['user_profile']
         username = user_id[0:user_id.rindex('@')]
@@ -953,6 +960,11 @@ class SharedEntityViewSet(mixins.RetrieveModelMixin,
             self.authz_token, entity_id, permission_type)
         return {group_id: permission_type for group_id in groups}
 
+    def _load_directly_accessible_groups(self, entity_id, permission_type):
+        groups = self.request.airavata_client.getAllDirectlyAccessibleGroups(
+            self.authz_token, entity_id, permission_type)
+        return {group_id: permission_type for group_id in groups}
+
     def _load_group(self, group_id):
         group_manager_client = self.request.profile_service['group_manager']
         return group_manager_client.getGroup(self.authz_token, group_id)
@@ -1036,6 +1048,46 @@ class SharedEntityViewSet(mixins.RetrieveModelMixin,
         self.perform_update(merged_serializer)
         return Response(merged_serializer.data)
 
+    @detail_route(methods=['get'])
+    def all(self, request, entity_id=None):
+        """Load direct plus indirectly (inherited) shared permissions."""
+        users = {}
+        # Load accessible users in order of permission precedence: users that
+        # have WRITE permission should also have READ
+        users.update(self._load_accessible_users(
+            entity_id, ResourcePermissionType.READ))
+        users.update(self._load_accessible_users(
+            entity_id, ResourcePermissionType.WRITE))
+        owner_ids = self._load_accessible_users(
+            entity_id, ResourcePermissionType.OWNER)
+        # Assume that there is one and only one DIRECT owner (there may be one
+        # or more INDIRECT cascading owners, which would the owners of the
+        # ancestor entities, but getAllAccessibleUsers does not return
+        # indirectly cascading owners)
+        owner_id = list(owner_ids.keys())[0]
+        # Remove owner from the users list
+        del users[owner_id]
+        user_list = []
+        for user_id in users:
+            user_list.append({'user': self._load_user_profile(user_id),
+                              'permissionType': users[user_id]})
+        groups = {}
+        groups.update(self._load_accessible_groups(
+            entity_id, ResourcePermissionType.READ))
+        groups.update(self._load_accessible_groups(
+            entity_id, ResourcePermissionType.WRITE))
+        group_list = []
+        for group_id in groups:
+            group_list.append({'group': self._load_group(group_id),
+                               'permissionType': groups[group_id]})
+        shared_entity = {'entityId': entity_id,
+                         'userPermissions': user_list,
+                         'groupPermissions': group_list,
+                         'owner': self._load_user_profile(owner_id)}
+        serializer = self.serializer_class(
+            shared_entity, context={'request': request})
+        return Response(serializer.data)
+
 
 class CredentialSummaryViewSet(APIBackedViewSet):
     serializer_class = serializers.CredentialSummarySerializer