Sfoglia il codice sorgente

[sentry] Convert to valid format the URI

Romain Rigaux 11 anni fa
parent
commit
835a9bed6e

+ 12 - 1
apps/security/src/security/api/hive.py

@@ -23,6 +23,7 @@ from django.utils.translation import ugettext as _
 
 from libsentry.api import get_api
 from libsentry.sentry_site import get_sentry_server_admin_groups
+from hadoop.cluster import get_defaultfs
 
 
 def list_sentry_roles_by_group(request):
@@ -65,7 +66,7 @@ def _to_sentry_privilege(privilege):
       'serverName': privilege['serverName'],
       'dbName': privilege['dbName'],
       'tableName': privilege['tableName'],
-      'URI': privilege['URI'],
+      'URI': _massage_uri(privilege['URI']),
       'action': privilege['action'],
       'createTime': privilege['timestamp'],
       'grantOption': 1 if privilege['grantOption'] else 0,
@@ -95,6 +96,16 @@ def _hive_add_privileges(user, role, privileges):
     return _privileges
 
 
+def _massage_uri(uri):
+  if uri:
+    if uri.startswith('hdfs:///'):
+      uri = uri.replace('hdfs://', get_defaultfs())
+    elif uri.startswith('/'):
+      uri = get_defaultfs() + uri
+
+  return uri
+
+
 def _drop_sentry_privilege(user, role, authorizable):
   return get_api(user).alter_sentry_role_revoke_privilege(role['name'], _to_sentry_privilege(authorizable))
 

+ 50 - 5
apps/security/src/security/api/test_hive.py

@@ -18,16 +18,19 @@
 
 import json
 
+from django.core.urlresolvers import reverse
 from nose.plugins.skip import SkipTest
 from nose.tools import assert_true, assert_equal, assert_false
 
-from desktop.lib.django_test_util import make_logged_in_client
-from desktop.lib.test_utils import grant_access, add_to_group
+from hadoop import cluster
 
-from django.core.urlresolvers import reverse
+from hadoop.conf import HDFS_CLUSTERS
 
+from desktop.lib.django_test_util import make_logged_in_client
+from desktop.lib.test_utils import grant_access, add_to_group
 
 from libsentry import api
+from security.api.hive import _massage_uri
 
 
 def mocked_get_api(user):
@@ -56,7 +59,7 @@ class TestMockedApi(object):
     grant_access("sentry_hue", "hue", "security")
     add_to_group("sentry_test")
     add_to_group("sentry_hue")
-    
+
     raise SkipTest
 
   def tearDown(self):
@@ -75,4 +78,46 @@ class TestMockedApi(object):
     assert_equal(None, json.loads(response.content).get('roles', [{'name': ''}])[0]['name'], response.content)
 
     response = self.client_admin.post(reverse("security:list_sentry_roles_by_group"), {'groupName': 'test'})
-    assert_equal('test', json.loads(response.content).get('roles', [{'name': ''}])[0]['name'], response.content)
+    assert_equal('test', json.loads(response.content).get('roles', [{'name': ''}])[0]['name'], response.content)
+
+
+class TestUtils(object):
+
+  def test_massage_uri(self):
+
+    finish = HDFS_CLUSTERS['default'].LOGICAL_NAME.set_for_testing('namenode')
+    cluster.clear_caches()
+
+    try:
+      assert_equal('', _massage_uri(''))
+
+      assert_equal('namenode/data', _massage_uri('hdfs:///data'))
+
+      assert_equal('hdfs://nn:11/data', _massage_uri('hdfs://nn:11/data'))
+
+      assert_equal('hdfs://logical/data', _massage_uri('hdfs://logical/data'))
+
+      assert_equal('namenode/data', _massage_uri('/data'))
+
+      assert_equal('file:///data', _massage_uri('file:///data'))
+    finally:
+      finish()
+
+
+    finish = HDFS_CLUSTERS['default'].FS_DEFAULTFS.set_for_testing('hdfs://fs_defaultfs:8021')
+    cluster.clear_caches()
+
+    try:
+      assert_equal('', _massage_uri(''))
+
+      assert_equal('hdfs://fs_defaultfs:8021/data', _massage_uri('hdfs:///data'))
+
+      assert_equal('hdfs://nn:11/data', _massage_uri('hdfs://nn:11/data'))
+
+      assert_equal('hdfs://logical/data', _massage_uri('hdfs://logical/data'))
+
+      assert_equal('hdfs://fs_defaultfs:8021/data', _massage_uri('/data'))
+
+      assert_equal('file:///data', _massage_uri('file:///data'))
+    finally:
+      finish()

+ 8 - 3
apps/security/src/security/templates/hive.mako

@@ -53,12 +53,16 @@ ${ layout.menubar(section='hive') }
     </div>
 
     <div class="inline-block" style="vertical-align: middle">
-      <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('db'); }"><i class="fa fa-fw fa-1halfx muted" data-bind="css: {'fa-circle-o': privilegeType() != 'db' , 'fa-check-circle-o': privilegeType() == 'db'}"></i></a>
+      <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('db'); }">
+        <i class="fa fa-fw fa-1halfx muted" data-bind="css: {'fa-circle-o': privilegeType() != 'db' , 'fa-check-circle-o': privilegeType() == 'db'}"></i>
+      </a>
     </div>
     <input type="text" data-bind="hivechooser: $data.path, enable: privilegeType() == 'db'" placeholder="dbName.tableName <CTRL+SPACE>">
 
     <div class="inline-block" style="vertical-align: middle">
-      <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('uri'); }"><i class="fa fa-fw fa-1halfx muted" data-bind="css: {'fa-circle-o': privilegeType() != 'uri' , 'fa-check-circle-o': privilegeType() == 'uri'}"></i></a>
+      <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('uri'); }">
+        <i class="fa fa-fw fa-1halfx muted" data-bind="css: {'fa-circle-o': privilegeType() != 'uri' , 'fa-check-circle-o': privilegeType() == 'uri'}"></i>
+      </a>
     </div>
     <input type="text" data-bind="filechooser: $data.URI, enable: privilegeType() == 'uri'" placeholder="URI">
 
@@ -68,7 +72,8 @@ ${ layout.menubar(section='hive') }
       <label>&nbsp;&nbsp;<input type="checkbox" data-bind="checked: grantOption"> ${ _('With grant') }</label>
     </div>
 
-    <span class="showAdvancedSpace">&nbsp;&nbsp;</span><a class="pointer showAdvanced" data-bind="click: function(){ showAdvanced(true); }, visible: ! showAdvanced()"><i class="fa fa-cog"></i> ${ _('Show advanced') }</a>
+    <span class="showAdvancedSpace">&nbsp;&nbsp;</span>
+    <a class="pointer showAdvanced" data-bind="click: function(){ showAdvanced(true); }, visible: ! showAdvanced()"><i class="fa fa-cog"></i> ${ _('Advanced') }</a>
 
     <div class="acl-block-section" data-bind="visible: showAdvanced">
       <input type="text" data-bind="value: serverName" placeholder="serverName" style="margin-left: 29px">

+ 7 - 0
desktop/libs/hadoop/src/hadoop/cluster.py

@@ -56,6 +56,13 @@ def get_hdfs(identifier="default"):
   get_all_hdfs()
   return FS_CACHE[identifier]
 
+def get_defaultfs():
+  fs = get_hdfs()
+
+  if fs.logical_name:
+    return fs.logical_name
+  else:
+    return fs.fs_defaultfs
 
 def get_all_hdfs():
   global FS_CACHE