Selaa lähdekoodia

[security] Improving Hive autocomplete

Romain Rigaux 11 vuotta sitten
vanhempi
commit
04238dad59

+ 1 - 2
apps/security/src/security/templates/hdfs.mako

@@ -102,8 +102,7 @@ ${ layout.menubar(section='hdfs') }
         <div class="card-body">
           <div class="row-fluid">
             <div class="span8">
-              <input type="text" class="input-xxlarge" data-bind="value: $root.assist.path"/>
-
+              <input type="text" class="input-xxlarge" data-bind="value: $root.assist.path, valueUpdate: 'afterkeydown'"/>
               <div id="nav-bar" data-bind="template: { name: 'tree-template', data: $root.assist.treeData }"></div>
             </div>
             <div class="span4">

+ 17 - 5
apps/security/src/security/templates/hive.mako

@@ -41,9 +41,15 @@ ${ layout.menubar(section='hive') }
     <div class="span2">
       <div class="sidebar-nav">
         <ul class="nav nav-list">
-          <li class="nav-header">${ _('Properties') }</li>
-          <li class="active"><a href="#edit"><i class="fa fa-eye"></i> ${ _('View') }</a></li>
+          <li class="nav-header">${ _('Privileges') }</li>
+          <li class="active"><a href="#edit"><i class="fa fa-pencil"></i> ${ _('Edit') }</a></li>
           <li><a href="#roles"><i class="fa fa-cubes"></i> ${ _('Roles') }</a></li>
+          <li class="nav-header"><i class="fa fa-group"></i> ${ _('Users') }
+            </br>
+            <input type="checkbox" checked="checked"> ${_('Me')}
+            </br>          
+            <select data-bind="options: availableHadoopUsers" size="10"></select>
+          </li>
           <li class="nav-header"><i class="fa fa-group"></i> ${ _('Groups') }
             </br>
             <input type="checkbox" checked></input> All
@@ -55,11 +61,10 @@ ${ layout.menubar(section='hive') }
     </div>
 
     <div class="span10">
-
       <div id="edit" class="mainSection card card-small">
         <h1 class="card-heading simple">${ _('Edit') }</h1>
         <div class="card-body">
-          <input type="text" class="input-xxlarge" data-bind="value: $root.assist.path, valueUpdate:'afterkeydown'"/>
+          <input type="text" class="input-xxlarge" data-bind="value: $root.assist.path, valueUpdate: 'afterkeydown'"/>
           <a class="btn btn-inverse" style="margin-left:10px", data-bind="attr: { href: '/metastore/' + $root.assist.path() }" target="_blank" title="${ _('Open in Metastore Browser') }">
             <i class="fa fa-external-link"></i>
           </a>
@@ -69,11 +74,18 @@ ${ layout.menubar(section='hive') }
           <i class="fa fa-eye-slash"></i>
         </div>
         <div>
-          <div class="span8">
+          <div class="span6">
             <div data-bind="foreach: $root.assist.files">
               <div data-bind="text: $data, click: $root.list_sentry_privileges_for_provider"></div>
             </div>
           </div>
+          <div class="span6">
+            <span data-bind="text: ko.mapping.toJSON($root.assist.privilege)"></span>
+            <!-- ko if: $root.assist.privilege() -->              
+              sentry_privileges: <span data-bind="text: $root.assist.privilege.sentry_privileges"></span>
+              message: <span data-bind="text: $root.assist.privilege.message"></span>
+            <!-- /ko -->
+          </div>
         </div>
       </div>
 

+ 1 - 1
apps/security/static/js/hdfs.ko.js

@@ -248,7 +248,7 @@ var NodeModel = function(data) {
   self.nodes = ko.observableArray([]);
 
   self.toggleVisibility = function() {
-    self.isExpanded(!self.isExpanded());
+    self.isExpanded(! self.isExpanded());
   };
 
   ko.mapping.fromJS(data, self.mapOptions, self);

+ 26 - 4
apps/security/static/js/hive.ko.js

@@ -123,18 +123,25 @@ var Assist = function (vm) {
   var self = this;
 
   self.path = ko.observable('');
-  self.path.subscribe(function () {
+  self.path.subscribe(function() {
 	self.fetchDatabases();
   });
   self.files = ko.observableArray();
+  self.privilege = ko.observable();
 
   self.fetchDatabases = function() {
+	var path = self.path().replace('.', '/');
+
     var request = {
-      url: '/beeswax/api/autocomplete', // impala too
+      url: '/beeswax/api/autocomplete/' + path,
       dataType: 'json',
       type: 'GET',
       success: function(data) {
-        self.files(data.databases);
+    	if (data.databases) {
+          self.files(data.databases);
+    	} else if (data.tables && data.tables.length > 0) {
+    	  self.files(data.tables);
+    	}
       },
       cache: false
     };
@@ -159,8 +166,11 @@ var HiveViewModel = function (initial) {
   self.role = new Role(self);
   self.privilege = new Privilege(self, {});
 
+  self.availableHadoopUsers = ko.observableArray();
+  self.availableHadoopGroups = ko.observableArray();
 
   self.init = function() {
+	self.fetchUsers();
     self.list_sentry_roles_by_group();
     self.assist.fetchDatabases();
   };
@@ -217,12 +227,24 @@ var HiveViewModel = function (initial) {
         authorizableHierarchy: ko.mapping.toJSON({'server': 'aa', 'db': 'default'}),
       },
       success: function (data) {
-    	alert(ko.mapping.toJSON(data));
+    	self.assist.privilege(ko.mapping.fromJS(data));
       }
     }).fail(function (xhr, textStatus, errorThrown) {
       $(document).trigger("error", xhr.responseText);
     });
   };
+  
+  self.fetchUsers = function () {
+    $.getJSON('/desktop/api/users/autocomplete', function (data) {
+      $.each(data.users, function (i, user) {
+        self.availableHadoopUsers.push(user.username);
+      });
+
+      $.each(data.groups, function (i, group) {
+        self.availableHadoopGroups.push(group.name);
+      });      
+    });
+  }
 };
 
 function logGA(page) {