Browse Source

[security] Mock list_sentry_privileges_by_authorizable in Sentry

Romain Rigaux 11 years ago
parent
commit
54e6ca7

+ 15 - 7
apps/security/src/security/api/hive.py

@@ -141,14 +141,14 @@ def create_sentry_role(request):
   return HttpResponse(json.dumps(result), mimetype="application/json")
 
 
-def create_sentry_role(request):
+def drop_sentry_role(request):
   result = {'status': -1, 'message': 'Error'}
 
   try:
     roleName = request.POST['roleName']
 
-    get_api(request.user).create_sentry_role(roleName)
-    result['message'] = ''
+    get_api(request.user).drop_sentry_role(roleName)
+    result['message'] = _('Role and privileges deleted.')
     result['status'] = 0
   except Exception, e:
     result['message'] = unicode(str(e), "utf8")
@@ -156,14 +156,22 @@ def create_sentry_role(request):
   return HttpResponse(json.dumps(result), mimetype="application/json")
 
 
-def drop_sentry_role(request):
+# Mocked!
+def list_sentry_privileges_by_authorizable(request):
   result = {'status': -1, 'message': 'Error'}
 
   try:
-    roleName = request.POST['roleName']
+    groups = json.loads(request.POST['groups'])
+    roleSet = json.loads(request.POST['roleSet'])
+    authorizableHierarchy = json.loads(request.POST['authorizableHierarchy'])
 
-    get_api(request.user).drop_sentry_role(roleName)
-    result['message'] = _('Role and privileges deleted.')
+    from collections import defaultdict
+    d = defaultdict(int)
+    d.update(authorizableHierarchy)
+
+    result['privileges'] = json.loads('{"status": 0, "sentry_privileges": [{"name": "serverA+databaseA+tableA+INSERT", "timestamp": 1404171968718, "database": "databaseA", "action": "INSERT", "scope": "TABLE", "table": "tableA", "URI": "", "grantor": null, "server": "serverA"},{"name": "%(server)s+%(database)s+%(table)s+INSERT", "timestamp": 1404171968718, "database": "%(database)s", "action": "INSERT", "scope": "TABLE", "table": "%(table)s", "URI": "", "grantor": null, "server": "%(server)s"}], "message": ""}' % d)
+
+    result['message'] = ''
     result['status'] = 0
   except Exception, e:
     result['message'] = unicode(str(e), "utf8")

+ 7 - 2
apps/security/src/security/templates/hive.mako

@@ -56,6 +56,9 @@ ${ layout.menubar(section='hive') }
             </br>
             <select data-bind="options: $root.availableHadoopGroups" size="10" multiple="true"></select>
           </li>
+          <li class="nav-header"><i class="fa fa-group"></i> ${ _('Server') }
+            <input type="text" data-bind="value: $root.assist.server">
+          </li>
         </ul>
       </div>
     </div>
@@ -76,7 +79,7 @@ ${ layout.menubar(section='hive') }
         <div>
           <div class="span6">
             <div data-bind="foreach: $root.assist.files">
-              <div data-bind="text: $data, click: $root.list_sentry_privileges_for_provider"></div>
+              <div data-bind="text: $data, click: $root.list_sentry_privileges_by_authorizable"></div>
             </div>
           </div>
           <div class="span6">
@@ -154,7 +157,9 @@ ${ layout.menubar(section='hive') }
                 <input type="checkbox" data-bind="click: $root.role.remove"></input>
               </td>
               <td>
-                <a href="javascript:void(0);"><i class="fa fa-2x" data-bind="click: $root.list_sentry_privileges_by_role, css: {'fa-caret-right' : ! showPrivileges(), 'fa-caret-down': showPrivileges() }""></i></a>
+                <a href="javascript:void(0);">
+                  <i class="fa fa-2x" data-bind="click: $root.list_sentry_privileges_by_role, css: {'fa-caret-right' : ! showPrivileges(), 'fa-caret-down': showPrivileges() }""></i>
+                </a>
               </td>
               <td data-bind="text: name"></td>
               <td>

+ 1 - 0
apps/security/src/security/urls.py

@@ -36,6 +36,7 @@ urlpatterns += patterns('security.api.hive',
   url(r'^api/hive/list_sentry_roles_by_group', 'list_sentry_roles_by_group', name='list_sentry_roles_by_group'),
   url(r'^api/hive/list_sentry_privileges_by_role', 'list_sentry_privileges_by_role', name='list_sentry_privileges_by_role'),
   url(r'^api/hive/list_sentry_privileges_for_provider$', 'list_sentry_privileges_for_provider', name='list_sentry_privileges_for_provider'),
+  url(r'^api/hive/list_sentry_privileges_by_authorizable', 'list_sentry_privileges_by_authorizable', name='list_sentry_privileges_by_authorizable'),
   url(r'^api/hive/create_sentry_role', 'create_sentry_role', name='create_sentry_role'),
   url(r'^api/hive/drop_sentry_role', 'drop_sentry_role', name='drop_sentry_role'),
   url(r'^api/hive/create_role$', 'hive_create_role', name='hive_create_role'),

+ 0 - 4
apps/security/src/security/views.py

@@ -28,10 +28,6 @@ def _get_hadoop_groups(): # Mock for now, maybe pull from LDAP
 def hive(request):
   assist = autocomplete(request, database=None, table=None)
 
-  #  url(r'^api/autocomplete/$', 'autocomplete', name='api_autocomplete_databases'),
-  #  url(r'^api/autocomplete/(?P<database>\w+)/$', 'autocomplete', name='api_autocomplete_tables'),
-  #  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)$', 'autocomplete', name='api_autocomplete_columns'),
-
   return render("hive.mako", request, {
       'assist': assist,
       'initial': json.dumps({'hadoop_groups': _get_hadoop_groups()}),

+ 19 - 6
apps/security/static/js/hive.ko.js

@@ -122,10 +122,17 @@ var Role = function(vm, privilege) {
 var Assist = function (vm) {
   var self = this;
 
-  self.path = ko.observable('');
+  self.path = ko.observable('');  
   self.path.subscribe(function() {
 	self.fetchDatabases();
   });
+  self.server = ko.observable('server1');
+  self.db = ko.computed(function() {
+    return self.path().split(/[.]/)[0];
+  });
+  self.table = ko.computed(function() {
+    return self.path().split(/[.]/)[1];
+  });
   self.files = ko.observableArray();
   self.privilege = ko.observable();
 
@@ -140,7 +147,8 @@ var Assist = function (vm) {
     	if (data.databases) {
           self.files(data.databases);
     	} else if (data.tables && data.tables.length > 0) {
-    	  self.files(data.tables);
+    	  var tables = $.map(data.tables, function(table, index) {return self.db() + '.' + table;});
+    	  self.files(tables);
     	}
       },
       cache: false
@@ -221,14 +229,19 @@ var HiveViewModel = function (initial) {
     });
   };
 
-  self.list_sentry_privileges_for_provider = function(role) {
+  self.list_sentry_privileges_by_authorizable = function(path) {
+	self.assist.path(path);
     $.ajax({
       type: "POST",
-      url: "/security/api/hive/list_sentry_privileges_for_provider",
+      url: "/security/api/hive/list_sentry_privileges_by_authorizable",
       data: {    	
-    	groups: ko.mapping.toJSON(['sambashare']),
+    	groups: ko.mapping.toJSON(['sambashare', 'hadoop']),
     	roleSet: ko.mapping.toJSON({all: true, roles: []}),
-        authorizableHierarchy: ko.mapping.toJSON({'server': 'aa', 'db': 'default'}),
+        authorizableHierarchy: ko.mapping.toJSON({
+            'server': self.assist.server(),
+            'db': self.assist.db(),
+            'table': self.assist.table(),
+        }),
       },
       success: function (data) {
     	self.assist.privilege(ko.mapping.fromJS(data));