ranger_functions.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #!/usr/bin/env python
  2. """
  3. Licensed to the Apache Software Foundation (ASF) under one
  4. or more contributor license agreements. See the NOTICE file
  5. distributed with this work for additional information
  6. regarding copyright ownership. The ASF licenses this file
  7. to you under the Apache License, Version 2.0 (the
  8. "License"); you may not use this file except in compliance
  9. with the License. You may obtain a copy of the License at
  10. http://www.apache.org/licenses/LICENSE-2.0
  11. Unless required by applicable law or agreed to in writing, software
  12. distributed under the License is distributed on an "AS IS" BASIS,
  13. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. See the License for the specific language governing permissions and
  15. limitations under the License.
  16. """
  17. import time
  18. import sys
  19. from StringIO import StringIO as BytesIO
  20. import json
  21. from resource_management.core.logger import Logger
  22. import urllib2, base64, httplib
  23. class Rangeradmin:
  24. sInstance = None
  25. def __init__(self, url= 'http://localhost:6080'):
  26. self.baseUrl = url
  27. self.urlLogin = self.baseUrl + '/login.jsp'
  28. self.urlLoginPost = self.baseUrl + '/j_spring_security_check'
  29. self.urlRepos = self.baseUrl + '/service/assets/assets'
  30. self.urlReposPub = self.baseUrl + '/service/public/api/repository'
  31. self.urlPolicies = self.baseUrl + '/service/public/api/policy'
  32. self.urlGroups = self.baseUrl + '/service/xusers/groups'
  33. self.urlUsers = self.baseUrl + '/service/xusers/users'
  34. self.urlSecUsers = self.baseUrl + '/service/xusers/secure/users'
  35. self.session = None
  36. self.isLoggedIn = False
  37. def get_repository_by_name_urllib2(self, name, component, status, usernamepassword):
  38. try:
  39. searchRepoURL = self.urlReposPub + "?name=" + name + "&type=" + component + "&status=" + status
  40. request = urllib2.Request(searchRepoURL)
  41. base64string = base64.encodestring(usernamepassword).replace('\n', '')
  42. request.add_header("Content-Type", "application/json")
  43. request.add_header("Accept", "application/json")
  44. request.add_header("Authorization", "Basic %s" % base64string)
  45. result = urllib2.urlopen(request)
  46. response_code = result.getcode()
  47. response = json.loads(result.read())
  48. if response_code == 200 and len(response['vXRepositories']) > 0:
  49. for repo in response['vXRepositories']:
  50. repoDump = json.loads(json.JSONEncoder().encode(repo))
  51. if repoDump['name'] == name:
  52. return repoDump
  53. return None
  54. else:
  55. return None
  56. except urllib2.URLError, e:
  57. if isinstance(e, urllib2.HTTPError):
  58. Logger.error("HTTP Code: %s" % e.code)
  59. Logger.error("HTTP Data: %s" % e.read())
  60. else:
  61. Logger.error("Error : %s" % (e.reason))
  62. return None
  63. except httplib.BadStatusLine:
  64. Logger.error("Ranger Admin service is not reachable, please restart the service and then try again")
  65. return None
  66. def create_repository_urllib2(self, data, usernamepassword):
  67. try:
  68. searchRepoURL = self.urlReposPub
  69. base64string = base64.encodestring('%s' % (usernamepassword)).replace('\n', '')
  70. headers = {
  71. 'Accept': 'application/json',
  72. "Content-Type": "application/json"
  73. }
  74. request = urllib2.Request(searchRepoURL, data, headers)
  75. request.add_header("Authorization", "Basic %s" % base64string)
  76. result = urllib2.urlopen(request)
  77. response_code = result.getcode()
  78. response = json.loads(json.JSONEncoder().encode(result.read()))
  79. if response_code == 200 :
  80. Logger.info('Repository created Successfully')
  81. #Get Policies
  82. repoData = json.loads(data)
  83. repoName = repoData['name']
  84. typeOfPolicy = repoData['repositoryType']
  85. ##Get Policies by repo name
  86. policyList = self.get_policy_by_repo_name(name=repoName, component=typeOfPolicy, status="true", usernamepassword=usernamepassword)
  87. if (len(policyList)) > 0 :
  88. policiesUpdateCount = 0
  89. for policy in policyList:
  90. updatedPolicyObj = self.get_policy_params(typeOfPolicy,policy)
  91. policyResCode, policyResponse = self.update_ranger_policy(updatedPolicyObj['id'], json.dumps(updatedPolicyObj), usernamepassword)
  92. if policyResCode == 200:
  93. policiesUpdateCount = policiesUpdateCount+1
  94. else:
  95. Logger.info('Policy Update failed')
  96. ##Check for count of updated policies
  97. if len(policyList) == policiesUpdateCount:
  98. Logger.info("Ranger Repository created successfully and policies updated successfully providing ambari-qa user all permissions")
  99. return response
  100. else:
  101. return None
  102. else:
  103. Logger.info("Policies not found for the newly created Repository")
  104. return None
  105. else:
  106. Logger.info('Repository creation failed')
  107. return None
  108. except urllib2.URLError, e:
  109. if isinstance(e, urllib2.HTTPError):
  110. Logger.error("HTTP Code: %s" % e.code)
  111. Logger.error("HTTP Data: %s" % e.read())
  112. else:
  113. Logger.error("Error: %s" % (e.reason))
  114. return None
  115. except httplib.BadStatusLine:
  116. Logger.error("Ranger Admin service is not reachable, please restart the service and then try again")
  117. return None
  118. def check_ranger_login_urllib2(self, url,usernamepassword ):
  119. try:
  120. request = urllib2.Request(url)
  121. base64string = base64.encodestring(usernamepassword).replace('\n', '')
  122. request.add_header("Content-Type", "application/json")
  123. request.add_header("Accept", "application/json")
  124. request.add_header("Authorization", "Basic %s" % base64string)
  125. result = urllib2.urlopen(request)
  126. response = result.read()
  127. response_code = result.getcode()
  128. return response_code, response
  129. except urllib2.URLError, e:
  130. if isinstance(e, urllib2.HTTPError):
  131. Logger.error("HTTP Code: %s" % e.code)
  132. Logger.error("HTTP Data: %s" % e.read())
  133. else:
  134. Logger.error("Error : %s" % (e.reason))
  135. return None, None
  136. except httplib.BadStatusLine, e:
  137. Logger.error("Ranger Admin service is not reachable, please restart the service and then try again")
  138. return None, None
  139. def get_policy_by_repo_name(self, name, component, status, usernamepassword):
  140. try:
  141. searchPolicyURL = self.urlPolicies + "?repositoryName=" + name + "&repositoryType=" + component + "&isEnabled=" + status
  142. request = urllib2.Request(searchPolicyURL)
  143. base64string = base64.encodestring(usernamepassword).replace('\n', '')
  144. request.add_header("Content-Type", "application/json")
  145. request.add_header("Accept", "application/json")
  146. request.add_header("Authorization", "Basic %s" % base64string)
  147. result = urllib2.urlopen(request)
  148. response_code = result.getcode()
  149. response = json.loads(result.read())
  150. if response_code == 200 and len(response['vXPolicies']) > 0:
  151. return response['vXPolicies']
  152. else:
  153. return None
  154. except urllib2.URLError, e:
  155. if isinstance(e, urllib2.HTTPError):
  156. Logger.error("HTTP Code: %s" % e.code)
  157. Logger.error("HTTP Data: %s" % e.read())
  158. else:
  159. Logger.error("Error: %s" % (e.reason))
  160. return None
  161. except httplib.BadStatusLine:
  162. Logger.error("Ranger Admin service is not reachable, please restart the service and then try again")
  163. return None
  164. def update_ranger_policy(self, policyId, data, usernamepassword):
  165. try:
  166. searchRepoURL = self.urlPolicies +"/"+str(policyId)
  167. base64string = base64.encodestring('%s' % (usernamepassword)).replace('\n', '')
  168. headers = {
  169. 'Accept': 'application/json',
  170. "Content-Type": "application/json"
  171. }
  172. request = urllib2.Request(searchRepoURL, data, headers)
  173. request.add_header("Authorization", "Basic %s" % base64string)
  174. request.get_method = lambda: 'PUT'
  175. result = urllib2.urlopen(request)
  176. response_code = result.getcode()
  177. response = json.loads(json.JSONEncoder().encode(result.read()))
  178. if response_code == 200 :
  179. Logger.info('Policy updated Successfully')
  180. return response_code, response
  181. else:
  182. Logger.error('Update Policy failed')
  183. return None, None
  184. except urllib2.URLError, e:
  185. if isinstance(e, urllib2.HTTPError):
  186. Logger.error("HTTP Code: %s" % e.code)
  187. Logger.error("HTTP Data: %s" % e.read())
  188. else:
  189. Logger.error("Error: %s" % (e.reason))
  190. return None, None
  191. except httplib.BadStatusLine:
  192. Logger.error("Ranger Admin service is not reachable, please restart the service and then try again")
  193. return None, None
  194. def get_policy_params(self, typeOfPolicy,policyObj):
  195. typeOfPolicy = typeOfPolicy.lower()
  196. if typeOfPolicy == "hdfs":
  197. policyObj['permMapList'] = [{'userList':['ambari-qa'],'permList': ['Read','Write', 'Execute', 'Admin']}]
  198. elif typeOfPolicy == "hive":
  199. policyObj['permMapList'] = [{'userList':['ambari-qa'], 'permList':[ 'Select','Update', 'Create', 'Drop', 'Alter', 'Index', 'Lock', 'All', 'Admin' ]}]
  200. elif typeOfPolicy == "hbase":
  201. policyObj['permMapList'] = [{'userList':['ambari-qa'],'permList':[ 'Read', 'Write', 'Create', 'Admin']}]
  202. elif typeOfPolicy == "knox":
  203. policyObj['permMapList'] = [{'userList':['ambari-qa'], 'permList': ['Allow','Admin']}]
  204. elif typeOfPolicy == "storm" :
  205. policyObj['permMapList'] = [{'userList':['ambari-qa'], 'permList':[ 'Submit Topology', 'File Upload', 'Get Nimbus Conf', 'Get Cluster Info', 'File Download', 'Kill Topology', 'Rebalance', 'Activate','Deactivate', 'Get Topology Conf', 'Get Topology', 'Get User Topology', 'Get Topology Info', 'Upload New Credential', 'Admin']}]
  206. return policyObj