This is an automated email from the ASF dual-hosted git repository.
mehul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new 3e381db RANGER-3348: Add user & group delete functionality in Apache
Ranger Python APIs
3e381db is described below
commit 3e381db3fc97b3b8c6e678beac405d608b8b7023
Author: Kishor Gollapalliwar <[email protected]>
AuthorDate: Wed Aug 18 17:17:51 2021 +0530
RANGER-3348: Add user & group delete functionality in Apache Ranger Python
APIs
Signed-off-by: Mehul Parikh <[email protected]>
---
.../python/apache_ranger/client/ranger_client.py | 252 ++++++++++++---------
1 file changed, 140 insertions(+), 112 deletions(-)
diff --git a/intg/src/main/python/apache_ranger/client/ranger_client.py
b/intg/src/main/python/apache_ranger/client/ranger_client.py
index ce6de34..dc69b04 100644
--- a/intg/src/main/python/apache_ranger/client/ranger_client.py
+++ b/intg/src/main/python/apache_ranger/client/ranger_client.py
@@ -36,171 +36,169 @@ LOG = logging.getLogger(__name__)
class RangerClient:
def __init__(self, url, auth):
- self.url = url
- self.session = Session()
- self.session.auth = auth
+ self.client_http = RangerClientHttp(url, auth)
logging.getLogger("requests").setLevel(logging.WARNING)
# Service Definition APIs
def create_service_def(self, serviceDef):
- resp = self.__call_api(RangerClient.CREATE_SERVICEDEF,
request_data=serviceDef)
+ resp = self.client_http.call_api(RangerClient.CREATE_SERVICEDEF,
request_data=serviceDef)
return type_coerce(resp, RangerServiceDef)
def update_service_def_by_id(self, serviceDefId, serviceDef):
- resp =
self.__call_api(RangerClient.UPDATE_SERVICEDEF_BY_ID.format_path({ 'id':
serviceDefId }), request_data=serviceDef)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_SERVICEDEF_BY_ID.format_path({
'id': serviceDefId }), request_data=serviceDef)
return type_coerce(resp, RangerServiceDef)
def update_service_def(self, serviceDefName, serviceDef):
- resp =
self.__call_api(RangerClient.UPDATE_SERVICEDEF_BY_NAME.format_path({ 'name':
serviceDefName }), request_data=serviceDef)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_SERVICEDEF_BY_NAME.format_path({
'name': serviceDefName }), request_data=serviceDef)
return type_coerce(resp, RangerServiceDef)
def delete_service_def_by_id(self, serviceDefId, params=None):
- self.__call_api(RangerClient.DELETE_SERVICEDEF_BY_ID.format_path({
'id': serviceDefId }), params)
+
self.client_http.call_api(RangerClient.DELETE_SERVICEDEF_BY_ID.format_path({
'id': serviceDefId }), params)
def delete_service_def(self, serviceDefName, params=None):
- self.__call_api(RangerClient.DELETE_SERVICEDEF_BY_NAME.format_path({
'name': serviceDefName }), params)
+
self.client_http.call_api(RangerClient.DELETE_SERVICEDEF_BY_NAME.format_path({
'name': serviceDefName }), params)
def get_service_def_by_id(self, serviceDefId):
- resp = self.__call_api(RangerClient.GET_SERVICEDEF_BY_ID.format_path({
'id': serviceDefId }))
+ resp =
self.client_http.call_api(RangerClient.GET_SERVICEDEF_BY_ID.format_path({ 'id':
serviceDefId }))
return type_coerce(resp, RangerServiceDef)
def get_service_def(self, serviceDefName):
- resp =
self.__call_api(RangerClient.GET_SERVICEDEF_BY_NAME.format_path({ 'name':
serviceDefName }))
+ resp =
self.client_http.call_api(RangerClient.GET_SERVICEDEF_BY_NAME.format_path({
'name': serviceDefName }))
return type_coerce(resp, RangerServiceDef)
def find_service_defs(self, filter=None):
- resp = self.__call_api(RangerClient.FIND_SERVICEDEFS, filter)
+ resp = self.client_http.call_api(RangerClient.FIND_SERVICEDEFS, filter)
return type_coerce_list(resp, RangerServiceDef)
# Service APIs
def create_service(self, service):
- resp = self.__call_api(RangerClient.CREATE_SERVICE,
request_data=service)
+ resp = self.client_http.call_api(RangerClient.CREATE_SERVICE,
request_data=service)
return type_coerce(resp, RangerService)
def get_service_by_id(self, serviceId):
- resp = self.__call_api(RangerClient.GET_SERVICE_BY_ID.format_path({
'id': serviceId }))
+ resp =
self.client_http.call_api(RangerClient.GET_SERVICE_BY_ID.format_path({ 'id':
serviceId }))
return type_coerce(resp, RangerService)
def get_service(self, serviceName):
- resp = self.__call_api(RangerClient.GET_SERVICE_BY_NAME.format_path({
'name': serviceName }))
+ resp =
self.client_http.call_api(RangerClient.GET_SERVICE_BY_NAME.format_path({
'name': serviceName }))
return type_coerce(resp, RangerService)
def update_service_by_id(self, serviceId, service, params=None):
- resp = self.__call_api(RangerClient.UPDATE_SERVICE_BY_ID.format_path({
'id': serviceId }), params, service)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_SERVICE_BY_ID.format_path({ 'id':
serviceId }), params, service)
return type_coerce(resp, RangerService)
def update_service(self, serviceName, service, params=None):
- resp =
self.__call_api(RangerClient.UPDATE_SERVICE_BY_NAME.format_path({ 'name':
serviceName }), params, service)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_SERVICE_BY_NAME.format_path({
'name': serviceName }), params, service)
return type_coerce(resp, RangerService)
def delete_service_by_id(self, serviceId):
- self.__call_api(RangerClient.DELETE_SERVICE_BY_ID.format_path({ 'id':
serviceId }))
+
self.client_http.call_api(RangerClient.DELETE_SERVICE_BY_ID.format_path({ 'id':
serviceId }))
def delete_service(self, serviceName):
- self.__call_api(RangerClient.DELETE_SERVICE_BY_NAME.format_path({
'name': serviceName }))
+
self.client_http.call_api(RangerClient.DELETE_SERVICE_BY_NAME.format_path({
'name': serviceName }))
def find_services(self, filter=None):
- resp = self.__call_api(RangerClient.FIND_SERVICES, filter)
+ resp = self.client_http.call_api(RangerClient.FIND_SERVICES, filter)
return type_coerce_list(resp, RangerService)
# Policy APIs
def create_policy(self, policy, params=None):
- resp = self.__call_api(RangerClient.CREATE_POLICY, params, policy)
+ resp = self.client_http.call_api(RangerClient.CREATE_POLICY, params,
policy)
return type_coerce(resp, RangerPolicy)
def get_policy_by_id(self, policyId):
- resp = self.__call_api(RangerClient.GET_POLICY_BY_ID.format_path({
'id': policyId }))
+ resp =
self.client_http.call_api(RangerClient.GET_POLICY_BY_ID.format_path({ 'id':
policyId }))
return type_coerce(resp, RangerPolicy)
def get_policy(self, serviceName, policyName):
- resp = self.__call_api(RangerClient.GET_POLICY_BY_NAME.format_path({
'serviceName': serviceName, 'policyName': policyName}))
+ resp =
self.client_http.call_api(RangerClient.GET_POLICY_BY_NAME.format_path({
'serviceName': serviceName, 'policyName': policyName}))
return type_coerce(resp, RangerPolicy)
def get_policies_in_service(self, serviceName, params=None):
- resp =
self.__call_api(RangerClient.GET_POLICIES_IN_SERVICE.format_path({
'serviceName': serviceName }), params)
+ resp =
self.client_http.call_api(RangerClient.GET_POLICIES_IN_SERVICE.format_path({
'serviceName': serviceName }), params)
return type_coerce_list(resp, RangerPolicy)
def update_policy_by_id(self, policyId, policy):
- resp = self.__call_api(RangerClient.UPDATE_POLICY_BY_ID.format_path({
'id': policyId }), request_data=policy)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_POLICY_BY_ID.format_path({ 'id':
policyId }), request_data=policy)
return type_coerce(resp, RangerPolicy)
def update_policy(self, serviceName, policyName, policy):
- resp =
self.__call_api(RangerClient.UPDATE_POLICY_BY_NAME.format_path({ 'serviceName':
serviceName, 'policyName': policyName}), request_data=policy)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_POLICY_BY_NAME.format_path({
'serviceName': serviceName, 'policyName': policyName}), request_data=policy)
return type_coerce(resp, RangerPolicy)
def apply_policy(self, policy, params=None):
- resp = self.__call_api(RangerClient.APPLY_POLICY, params, policy)
+ resp = self.client_http.call_api(RangerClient.APPLY_POLICY, params,
policy)
return type_coerce(resp, RangerPolicy)
def delete_policy_by_id(self, policyId):
- self.__call_api(RangerClient.DELETE_POLICY_BY_ID.format_path({ 'id':
policyId }))
+
self.client_http.call_api(RangerClient.DELETE_POLICY_BY_ID.format_path({ 'id':
policyId }))
def delete_policy(self, serviceName, policyName):
- self.__call_api(RangerClient.DELETE_POLICY_BY_NAME, { 'servicename':
serviceName, 'policyname': policyName })
+ self.client_http.call_api(RangerClient.DELETE_POLICY_BY_NAME, {
'servicename': serviceName, 'policyname': policyName })
def find_policies(self, filter=None):
- resp = self.__call_api(RangerClient.FIND_POLICIES, filter)
+ resp = self.client_http.call_api(RangerClient.FIND_POLICIES, filter)
return type_coerce_list(resp, RangerPolicy)
# SecurityZone APIs
def create_security_zone(self, securityZone):
- resp = self.__call_api(RangerClient.CREATE_ZONE,
request_data=securityZone)
+ resp = self.client_http.call_api(RangerClient.CREATE_ZONE,
request_data=securityZone)
return type_coerce(resp, RangerSecurityZone)
def update_security_zone_by_id(self, zoneId, securityZone):
- resp = self.__call_api(RangerClient.UPDATE_ZONE_BY_ID.format_path({
'id': zoneId }), request_data=securityZone)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_ZONE_BY_ID.format_path({ 'id':
zoneId }), request_data=securityZone)
return type_coerce(resp, RangerSecurityZone)
def update_security_zone(self, zoneName, securityZone):
- resp = self.__call_api(RangerClient.UPDATE_ZONE_BY_NAME.format_path({
'name': zoneName }), request_data=securityZone)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_ZONE_BY_NAME.format_path({
'name': zoneName }), request_data=securityZone)
return type_coerce(resp, RangerSecurityZone)
def delete_security_zone_by_id(self, zoneId):
- self.__call_api(RangerClient.DELETE_ZONE_BY_ID.format_path({ 'id':
zoneId }))
+ self.client_http.call_api(RangerClient.DELETE_ZONE_BY_ID.format_path({
'id': zoneId }))
def delete_security_zone(self, zoneName):
- self.__call_api(RangerClient.DELETE_ZONE_BY_NAME.format_path({ 'name':
zoneName }))
+
self.client_http.call_api(RangerClient.DELETE_ZONE_BY_NAME.format_path({
'name': zoneName }))
def get_security_zone_by_id(self, zoneId):
- resp = self.__call_api(RangerClient.GET_ZONE_BY_ID.format_path({ 'id':
zoneId }))
+ resp =
self.client_http.call_api(RangerClient.GET_ZONE_BY_ID.format_path({ 'id':
zoneId }))
return type_coerce(resp, RangerSecurityZone)
def get_security_zone(self, zoneName):
- resp = self.__call_api(RangerClient.GET_ZONE_BY_NAME.format_path({
'name': zoneName }))
+ resp =
self.client_http.call_api(RangerClient.GET_ZONE_BY_NAME.format_path({ 'name':
zoneName }))
return type_coerce(resp, RangerSecurityZone)
def find_security_zones(self, filter=None):
- resp = self.__call_api(RangerClient.FIND_ZONES, filter)
+ resp = self.client_http.call_api(RangerClient.FIND_ZONES, filter)
return type_coerce_list(resp, RangerSecurityZone)
@@ -212,126 +210,63 @@ class RangerClient:
params['serviceName'] = serviceName
- resp = self.__call_api(RangerClient.CREATE_ROLE, params, role)
+ resp = self.client_http.call_api(RangerClient.CREATE_ROLE, params,
role)
return type_coerce(resp, RangerRole)
def update_role(self, roleId, role, params=None):
- resp = self.__call_api(RangerClient.UPDATE_ROLE_BY_ID.format_path({
'id': roleId }), params, role)
+ resp =
self.client_http.call_api(RangerClient.UPDATE_ROLE_BY_ID.format_path({ 'id':
roleId }), params, role)
return type_coerce(resp, RangerRole)
def delete_role_by_id(self, roleId):
- self.__call_api(RangerClient.DELETE_ROLE_BY_ID.format_path({ 'id':
roleId }))
+ self.client_http.call_api(RangerClient.DELETE_ROLE_BY_ID.format_path({
'id': roleId }))
def delete_role(self, roleName, execUser, serviceName):
- self.__call_api(RangerClient.DELETE_ROLE_BY_NAME.format_path({ 'name':
roleName }), { 'execUser': execUser, 'serviceName': serviceName })
+
self.client_http.call_api(RangerClient.DELETE_ROLE_BY_NAME.format_path({
'name': roleName }), { 'execUser': execUser, 'serviceName': serviceName })
def get_role_by_id(self, roleId):
- resp = self.__call_api(RangerClient.GET_ROLE_BY_ID.format_path({ 'id':
roleId }))
+ resp =
self.client_http.call_api(RangerClient.GET_ROLE_BY_ID.format_path({ 'id':
roleId }))
return type_coerce(resp, RangerRole)
def get_role(self, roleName, execUser, serviceName):
- resp = self.__call_api(RangerClient.GET_ROLE_BY_NAME.format_path({
'name': roleName }), { 'execUser': execUser, 'serviceName': serviceName })
+ resp =
self.client_http.call_api(RangerClient.GET_ROLE_BY_NAME.format_path({ 'name':
roleName }), { 'execUser': execUser, 'serviceName': serviceName })
return type_coerce(resp, RangerRole)
def get_all_role_names(self, execUser, serviceName):
- resp = self.__call_api(RangerClient.GET_ALL_ROLE_NAMES.format_path({
'name': serviceName }), { 'execUser': execUser, 'serviceName': serviceName })
+ resp =
self.client_http.call_api(RangerClient.GET_ALL_ROLE_NAMES.format_path({ 'name':
serviceName }), { 'execUser': execUser, 'serviceName': serviceName })
return resp
def get_user_roles(self, user, filters=None):
- ret = self.__call_api(RangerClient.GET_USER_ROLES.format_path({
'name': user }), filters)
+ ret =
self.client_http.call_api(RangerClient.GET_USER_ROLES.format_path({ 'name':
user }), filters)
return list(ret) if ret is not None else None
def find_roles(self, filter=None):
- resp = self.__call_api(RangerClient.FIND_ROLES, filter)
+ resp = self.client_http.call_api(RangerClient.FIND_ROLES, filter)
return type_coerce_list(resp, RangerRole)
def grant_role(self, serviceName, request, params=None):
- resp = self.__call_api(RangerClient.GRANT_ROLE.format_path({ 'name':
serviceName }), params, request)
+ resp = self.client_http.call_api(RangerClient.GRANT_ROLE.format_path({
'name': serviceName }), params, request)
return type_coerce(resp, RESTResponse)
def revoke_role(self, serviceName, request, params=None):
- resp = self.__call_api(RangerClient.REVOKE_ROLE.format_path({ 'name':
serviceName }), params, request)
+ resp =
self.client_http.call_api(RangerClient.REVOKE_ROLE.format_path({ 'name':
serviceName }), params, request)
return type_coerce(resp, RESTResponse)
# Admin APIs
def delete_policy_deltas(self, days, reloadServicePoliciesCache):
- self.__call_api(RangerClient.DELETE_POLICY_DELTAS, { 'days': days,
'reloadServicePoliciesCache': reloadServicePoliciesCache})
+ self.client_http.call_api(RangerClient.DELETE_POLICY_DELTAS, { 'days':
days, 'reloadServicePoliciesCache': reloadServicePoliciesCache})
- def __call_api(self, api, query_params=None, request_data=None):
- ret = None
- params = { 'headers': { 'Accept': api.consumes, 'Content-type':
api.produces } }
-
- if query_params:
- params['params'] = query_params
-
- if request_data:
- params['data'] = json.dumps(request_data)
-
- path = os.path.join(self.url, api.path)
-
- if LOG.isEnabledFor(logging.DEBUG):
- LOG.debug("------------------------------------------------------")
- LOG.debug("Call : %s %s", api.method, path)
- LOG.debug("Content-type : %s", api.consumes)
- LOG.debug("Accept : %s", api.produces)
-
- response = None
-
- if api.method == HttpMethod.GET:
- response = self.session.get(path, **params)
- elif api.method == HttpMethod.POST:
- response = self.session.post(path, **params)
- elif api.method == HttpMethod.PUT:
- response = self.session.put(path, **params)
- elif api.method == HttpMethod.DELETE:
- response = self.session.delete(path, **params)
-
- if LOG.isEnabledFor(logging.DEBUG):
- LOG.debug("HTTP Status: %s", response.status_code if response else
"None")
-
- if response is None:
- ret = None
- elif response.status_code == api.expected_status:
- try:
- if response.status_code == HTTPStatus.NO_CONTENT or
response.content is None:
- ret = None
- else:
- if LOG.isEnabledFor(logging.DEBUG):
- LOG.debug("<== __call_api(%s, %s, %s), result=%s",
vars(api), params, request_data, response)
-
- LOG.debug(response.json())
-
- ret = response.json()
- except Exception as e:
- print(e)
-
- LOG.exception("Exception occurred while parsing response with
msg: %s", e)
-
- raise RangerServiceException(api, response)
- elif response.status_code == HTTPStatus.SERVICE_UNAVAILABLE:
- LOG.error("Ranger admin unavailable. HTTP Status: %s",
HTTPStatus.SERVICE_UNAVAILABLE)
-
- ret = None
- elif response.status_code == HTTPStatus.NOT_FOUND:
- LOG.error("Not found. HTTP Status: %s", HTTPStatus.NOT_FOUND)
-
- ret = None
- else:
- raise RangerServiceException(api, response)
-
- return ret
# URIs
@@ -451,3 +386,96 @@ class RESTResponse(RangerBase):
super(RangerPolicy, self).type_coerce_attrs()
self.messageList = type_coerce_dict(self.messageList, Message)
+
+
+class RangerClientHttp:
+ def __init__(self, url, auth):
+ self.url = url
+ self.session = Session()
+ self.session.auth = auth
+
+
+ def call_api(self, api, query_params=None, request_data=None):
+ ret = None
+ params = { 'headers': { 'Accept': api.consumes, 'Content-type':
api.produces } }
+
+ if query_params:
+ params['params'] = query_params
+
+ if request_data:
+ params['data'] = json.dumps(request_data)
+
+ path = os.path.join(self.url, api.path)
+
+ if LOG.isEnabledFor(logging.DEBUG):
+ LOG.debug("------------------------------------------------------")
+ LOG.debug("Call : %s %s", api.method, path)
+ LOG.debug("Content-type : %s", api.consumes)
+ LOG.debug("Accept : %s", api.produces)
+
+ response = None
+
+ if api.method == HttpMethod.GET:
+ response = self.session.get(path, **params)
+ elif api.method == HttpMethod.POST:
+ response = self.session.post(path, **params)
+ elif api.method == HttpMethod.PUT:
+ response = self.session.put(path, **params)
+ elif api.method == HttpMethod.DELETE:
+ response = self.session.delete(path, **params)
+
+ if LOG.isEnabledFor(logging.DEBUG):
+ LOG.debug("HTTP Status: %s", response.status_code if response else
"None")
+
+ if response is None:
+ ret = None
+ elif response.status_code == api.expected_status:
+ try:
+ if response.status_code == HTTPStatus.NO_CONTENT or
response.content is None:
+ ret = None
+ else:
+ if LOG.isEnabledFor(logging.DEBUG):
+ LOG.debug("<== __call_api(%s, %s, %s), result=%s",
vars(api), params, request_data, response)
+
+ LOG.debug(response.json())
+
+ ret = response.json()
+ except Exception as e:
+ print(e)
+
+ LOG.exception("Exception occurred while parsing response with
msg: %s", e)
+
+ raise RangerServiceException(api, response)
+ elif response.status_code == HTTPStatus.SERVICE_UNAVAILABLE:
+ LOG.error("Ranger admin unavailable. HTTP Status: %s",
HTTPStatus.SERVICE_UNAVAILABLE)
+
+ ret = None
+ elif response.status_code == HTTPStatus.NOT_FOUND:
+ LOG.error("Not found. HTTP Status: %s", HTTPStatus.NOT_FOUND)
+
+ ret = None
+ else:
+ raise RangerServiceException(api, response)
+
+ return ret
+
+
+class RangerClientPrivate:
+ def __init__(self, url, auth):
+ self.client_http = RangerClientHttp(url, auth)
+
+ logging.getLogger("requests").setLevel(logging.WARNING)
+
+ # URLs
+ URI_DELETE_USER = "service/xusers/secure/users/{name}"
+ URI_DELETE_GROUP = "service/xusers/secure/groups/{name}"
+
+ # APIs
+ DELETE_USER = API(URI_DELETE_USER, HttpMethod.DELETE,
HTTPStatus.NO_CONTENT)
+ DELETE_GROUP = API(URI_DELETE_GROUP, HttpMethod.DELETE,
HTTPStatus.NO_CONTENT)
+
+ def delete_user(self, userName, execUser):
+
self.client_http.call_api(RangerClientPrivate.DELETE_USER.format_path({ 'name':
userName }), { 'execUser': execUser, 'forceDelete': 'true' })
+
+ def delete_group(self, groupName, execUser):
+
self.client_http.call_api(RangerClientPrivate.DELETE_GROUP.format_path({
'name': groupName }), { 'execUser': execUser, 'forceDelete': 'true' })