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 <[email protected]>
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