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

madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/RANGER-3923 by this push:
     new 789d69629 RANGER-4446: updated Python client with 
get_dataset_summary() API - #2
789d69629 is described below

commit 789d6962955e7ada420873c1e26deb1e76a1de20
Author: Madhan Neethiraj <mad...@apache.org>
AuthorDate: Sun Oct 8 11:04:34 2023 -0700

    RANGER-4446: updated Python client with get_dataset_summary() API - #2
---
 .../apache_ranger/client/ranger_gds_client.py      |  9 +++-
 .../main/python/apache_ranger/model/ranger_gds.py  | 61 +++++++++++++++++++---
 intg/src/main/python/apache_ranger/utils.py        | 10 ++++
 3 files changed, 71 insertions(+), 9 deletions(-)

diff --git a/intg/src/main/python/apache_ranger/client/ranger_gds_client.py 
b/intg/src/main/python/apache_ranger/client/ranger_gds_client.py
index 3751252c2..0dbb61a68 100644
--- a/intg/src/main/python/apache_ranger/client/ranger_gds_client.py
+++ b/intg/src/main/python/apache_ranger/client/ranger_gds_client.py
@@ -72,6 +72,11 @@ class RangerGdsClient:
 
         return PList(resp).type_coerce_list(str)
 
+    def get_dataset_summary(self, filter=None):
+        resp = self.client_http.call_api(RangerGdsClient.GET_DATASET_SUMMARY, 
filter)
+
+        return PList(resp).type_coerce_list(DatasetSummary)
+
     def add_dataset_policy(self, datasetId, policy):
         resp = 
self.client_http.call_api(RangerGdsClient.ADD_DATASET_POLICY.format_path({ 
'id': datasetId }), request_data=policy)
 
@@ -248,6 +253,7 @@ class RangerGdsClient:
     URI_DATASET                   = URI_GDS + "/dataset"
     URI_DATASET_BY_ID             = URI_DATASET + "/{id}"
     URI_DATASET_NAMES             = URI_DATASET + "/names"
+    URI_DATASET_SUMMARY           = URI_DATASET + "/summary"
     URI_DATASET_POLICY            = URI_DATASET_BY_ID + "/policy"
     URI_DATASET_POLICY_ID         = URI_DATASET_POLICY + "/{policyId}"
     URI_PROJECT                   = URI_GDS + "/project"
@@ -275,6 +281,7 @@ class RangerGdsClient:
     GET_DATASET_BY_ID         = API(URI_DATASET_BY_ID, HttpMethod.GET, 
HTTPStatus.OK)
     FIND_DATASETS             = API(URI_DATASET, HttpMethod.GET, HTTPStatus.OK)
     GET_DATASET_NAMES         = API(URI_DATASET_NAMES, HttpMethod.GET, 
HTTPStatus.OK)
+    GET_DATASET_SUMMARY       = API(URI_DATASET_SUMMARY, HttpMethod.GET, 
HTTPStatus.OK)
     ADD_DATASET_POLICY        = API(URI_DATASET_POLICY, HttpMethod.POST, 
HTTPStatus.OK)
     UPDATE_DATASET_POLICY     = API(URI_DATASET_POLICY_ID, HttpMethod.PUT, 
HTTPStatus.OK)
     DELETE_DATASET_POLICY     = API(URI_DATASET_POLICY_ID, HttpMethod.DELETE, 
HTTPStatus.NO_CONTENT)
@@ -315,4 +322,4 @@ class RangerGdsClient:
     UPDATE_DATASET_IN_PROJECT_BY_ID    = API(URI_DATASET_PROJECT_BY_ID, 
HttpMethod.PUT, HTTPStatus.OK)
     REMOVE_DATASET_IN_PROJECT_BY_ID    = API(URI_DATASET_PROJECT_BY_ID, 
HttpMethod.DELETE, HTTPStatus.NO_CONTENT)
     GET_DATASET_IN_PROJECT_BY_ID       = API(URI_DATASET_PROJECT_BY_ID, 
HttpMethod.GET, HTTPStatus.OK)
-    FIND_DATASET_IN_PROJECTS           = API(URI_DATASET_PROJECT, 
HttpMethod.GET, HTTPStatus.OK)
\ No newline at end of file
+    FIND_DATASET_IN_PROJECTS           = API(URI_DATASET_PROJECT, 
HttpMethod.GET, HTTPStatus.OK)
diff --git a/intg/src/main/python/apache_ranger/model/ranger_gds.py 
b/intg/src/main/python/apache_ranger/model/ranger_gds.py
index 9f4ebaf84..f93d5eef0 100644
--- a/intg/src/main/python/apache_ranger/model/ranger_gds.py
+++ b/intg/src/main/python/apache_ranger/model/ranger_gds.py
@@ -18,15 +18,16 @@
 
 from apache_ranger.model.ranger_base      import RangerBase, 
RangerBaseModelObject
 from apache_ranger.model.ranger_policy    import *
-from apache_ranger.model.ranger_principal import RangerPrincipal
+from apache_ranger.model.ranger_principal import *
 from apache_ranger.utils                  import *
 
 class GdsPermission(StrEnum):
-    NONE  = 'NONE'
-    LIST  = 'LIST'
-    VIEW  = 'VIEW'
-    AUDIT = 'AUDIT'
-    ADMIN = 'ADMIN'
+    NONE         = 'NONE'
+    LIST         = 'LIST'
+    VIEW         = 'VIEW'
+    AUDIT        = 'AUDIT'
+    POLICY_ADMIN = 'POLICY_ADMIN'
+    ADMIN        = 'ADMIN'
 
     @classmethod
     def value_of(cls, val):
@@ -36,8 +37,7 @@ class GdsPermission(StrEnum):
             for key, member in cls.__members__.items():
                 if val == member.name or val == member.value:
                     return member
-                else:
-                    raise ValueError(f"'{cls.__name__}' enum not found for 
'{val}'")
+            raise ValueError(f"'{cls.__name__}' enum not found for '{val}'")
 
 class GdsShareStatus(StrEnum):
   NONE      = 'NONE'
@@ -211,3 +211,48 @@ class RangerGdsObjectACL(RangerBase):
         self.users  = type_coerce_dict(self.users, GdsPermission)
         self.groups = type_coerce_dict(self.groups, GdsPermission)
         self.roles  = type_coerce_dict(self.roles, GdsPermission)
+
+
+class DataShareInDatasetSummary(RangerBaseModelObject):
+    def __init__(self, attrs=None):
+        if attrs is None:
+            attrs = {}
+
+        RangerBaseModelObject.__init__(self, attrs)
+
+        self.name          = attrs.get('name')
+        self.serviceId     = attrs.get('serviceId')
+        self.serviceName   = attrs.get('serviceName')
+        self.zoneId        = attrs.get('zoneId')
+        self.zoneName      = attrs.get('zoneName')
+        self.resourceCount = attrs.get('resourceCount')
+        self.shareStatus   = attrs.get('shareStatus')
+        self.approver      = attrs.get('approver')
+
+    def type_coerce_attrs(self):
+        super(DataShareInDatasetSummary, self).type_coerce_attrs()
+
+        self.shareStatus = type_coerce(self.shareStatus, GdsShareStatus)
+
+
+class DatasetSummary(RangerBaseModelObject):
+    def __init__(self, attrs=None):
+        if attrs is None:
+            attrs = {}
+
+        RangerBaseModelObject.__init__(self, attrs)
+
+        self.name                = attrs.get('name')
+        self.description         = attrs.get('description')
+        self.permissionForCaller = attrs.get('permissionForCaller')
+        self.principalsCount     = attrs.get('principalsCount')
+        self.projectsCount       = attrs.get('projectsCount')
+        self.totalResourceCount  = attrs.get('totalResourceCount')
+        self.dataShares          = attrs.get('dataShares')
+
+    def type_coerce_attrs(self):
+        super(DatasetSummary, self).type_coerce_attrs()
+
+        self.permissionForCaller = type_coerce(self.permissionForCaller, 
GdsPermission)
+        self.principalsCount     = type_coerce_kv(self.principalsCount, 
PrincipalType, int)
+        self.dataShares          = type_coerce_list(self.dataShares, 
DataShareInDatasetSummary)
diff --git a/intg/src/main/python/apache_ranger/utils.py 
b/intg/src/main/python/apache_ranger/utils.py
index 00c7ec27a..69396041a 100644
--- a/intg/src/main/python/apache_ranger/utils.py
+++ b/intg/src/main/python/apache_ranger/utils.py
@@ -83,6 +83,16 @@ def type_coerce_list_dict(obj, objType):
         return [ type_coerce_dict(entry, objType) for entry in obj ]
     return None
 
+def type_coerce_kv(obj, keyType, valType):
+    if isinstance(obj, dict):
+        ret = {}
+        for k, v in obj.items():
+            ret[type_coerce(k, keyType)] = type_coerce(v, valType)
+    else:
+        ret = None
+
+    return ret
+
 class API:
     def __init__(self, path, method, expected_status, 
consumes=APPLICATION_JSON, produces=APPLICATION_JSON):
         self.path            = path

Reply via email to