浏览代码

[security] Bulk delete HDFS ACLs

Romain Rigaux 11 年之前
父节点
当前提交
5a666e2cbe

+ 16 - 3
apps/security/src/security/api/hdfs.py

@@ -72,10 +72,10 @@ def list_hdfs(request, path):
 
 
 def get_acls(request):
-  path = request.GET.get('path')
-  try:
-    acls = request.fs.get_acl_status(path)
+  try:      
+    acls = request.fs.get_acl_status(request.GET.get('path'))
   except Exception, e:
+    print e
     acls = None
 
   return HttpResponse(json.dumps(acls is not None and acls['AclStatus'] or None), mimetype="application/json")
@@ -97,6 +97,19 @@ def update_acls(request):
   return HttpResponse(json.dumps({'status': 0}), mimetype="application/json")
 
 
+def bulk_delete_acls(request):
+  path = request.POST.get('path')
+  checked_paths = json.loads(request.POST.get('checkedPaths'))  
+  
+  try:
+    checked_paths = [path['path'] for path in checked_paths if '+' in path['rwx']]
+    for path in checked_paths:
+      request.fs.remove_acl(path)
+  except Exception, e:
+    raise PopupException(unicode(str(e.message), "utf8"))
+
+  return HttpResponse(json.dumps({'status': 0}), mimetype="application/json")
+
 
 def _modify_acl_entries(fs, path, acls):
   aclspec = ','.join([_get_acl(acl) for acl in acls])

+ 16 - 7
apps/security/src/security/templates/hdfs.mako

@@ -99,6 +99,12 @@ ${ layout.menubar(section='hdfs') }
                 <div class="clearfix"></div>
                 <div class="tree-toolbar">
                   <div class="pull-right">
+                    <a href="javascript: void(0)" data-bind="click: $root.assist.collapseOthers">
+                      <i class="fa fa-compress"></i> ${_('Close others')}
+                    </a>
+                    <a href="javascript: void(0)" data-bind="click: $root.assist.refreshTree">
+                      <i class="fa fa-refresh"></i>  ${_('Refresh')}
+                    </a>                  
                     <div class="dropdown inline-block" style="margin-right: 6px">
                       <a class="dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-eye-slash" data-bind="visible: $root.assist.isDiffMode"></i><i class="fa fa-eye" data-bind="visible: ! $root.assist.isDiffMode()"></i> <span data-bind="visible: $root.assist.isDiffMode">${ _('Show non accessible files for') }</span><span data-bind="visible: ! $root.assist.isDiffMode()">${ _('Impersonate the user') }</span></a>
                       <ul class="dropdown-menu">
@@ -108,13 +114,15 @@ ${ layout.menubar(section='hdfs') }
                     </div>
                     <select class="user-list" data-bind="options: $root.selectableHadoopUsers, select2: { placeholder: '${ _("Select a user") }', update: $root.doAs, type: 'user'}" style="width: 120px"></select>
                     <i class="fa fa-group" title="List of groups in popover for this user?"></i>
+                  </div>                  
+                  <div>
+                    <i class="fa fa-save"></i>
+                    <i class="fa fa-copy"></i>
+                    <a href="javascript: void(0)" data-bind="click: $root.assist.bulkDeleteAcls" title="${ _('Remove ACLs from selected items') }">
+                      <i class="fa fa-times"></i>
+                    </a>
+                    <input type="checkbox"></input> ${ _('Recursive') }
                   </div>
-                  <a href="javascript: void(0)" data-bind="click: $root.assist.collapseOthers">
-                    <i class="fa fa-compress"></i> ${_('Close others')}
-                  </a>
-                  <a href="javascript: void(0)" data-bind="click: $root.assist.refreshTree">
-                    <i class="fa fa-refresh"></i>  ${_('Refresh')}
-                  </a>
                   <i class="fa fa-spinner fa-spin" data-bind="visible: $root.assist.isLoadingTree()"></i>
                 </div>
               </div>
@@ -126,8 +134,9 @@ ${ layout.menubar(section='hdfs') }
 
                   <ul class="nav nav-tabs">
                     <li data-bind="css: {'active': ! $root.assist.showAclsAsText()}"><a href="javascript: void(0)" data-bind="click: function() { $root.assist.showAclsAsText(false); }"><i class="fa fa-pencil"></i> ${ _('Edit') }</a></li>
-                    <li data-bind="css: {'active': $root.assist.showAclsAsText()}"><a href="javascript: void(0)" data-bind="click: function() { $root.assist.showAclsAsText(true); }"><i class="fa fa-header"></i> ${ _('View as text') }</a></li>
+                    <li data-bind="css: {'active': $root.assist.showAclsAsText()}"><a href="javascript: void(0)" data-bind="click: function() { $root.assist.showAclsAsText(true); }"><i class="fa fa-header"></i> ${ _('View as text') }</a></li>                                       
                   </ul>
+                  
 
                   <div class="acl-panel-content">
                     <span class="fake-pre" data-bind="visible: $root.assist.showAclsAsText">

+ 1 - 1
apps/security/src/security/templates/hive.mako

@@ -69,7 +69,7 @@ ${ layout.menubar(section='hive') }
     </div>
 
     <em class="muted" data-bind="text: moment(timestamp()).fromNow()"></em><br/>
-    ${_('Database')}: <a data-bind="attr: { href: '/metastore/' + dbName() }" target="_blank"><span data-bind="text: dbName"></span></a><br/>
+    ${_('Database')}: <a data-bind="attr: { href: '/metastore/table/' + dbName() }" target="_blank"><span data-bind="text: dbName"></span></a><br/>
     ${_('Action')}: <span data-bind="text: action"></span>
     <span data-bind="text: privilegeScope"></span>
     <span data-bind="text: tableName"></span>

+ 0 - 2
apps/security/src/security/templates/layout.mako

@@ -68,8 +68,6 @@ def is_selected(section, matcher):
               </li>
               <li class="${is_selected(section, 'hive')}"><a href="${ url('security:hive') }">${_('Hive')}</a></li>
               <li class="${is_selected(section, 'hdfs')}"><a href="${ url('security:hdfs') }">${_('HDFS')}</a></li>
-              <li class="${is_selected(section, 'solr')}"><a href="${ url('security:hive') }s">${_('Solr')}</a></li>
-              <li class="${is_selected(section, 'hbase')}"><a href="${ url('security:hive') }">${_('HBase')}</a></li>
             </ul>
           </div>
         </div>

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

@@ -29,6 +29,7 @@ urlpatterns += patterns('security.api.hdfs',
   url(r'^api/hdfs/list(?P<path>/.*)$', 'list_hdfs', name='list_hdfs'),
   url(r'^api/hdfs/get_acls$', 'get_acls', name='get_acls'),
   url(r'^api/hdfs/update_acls', 'update_acls', name='update_acls'),
+  url(r'^api/hdfs/bulk_delete_acls', 'bulk_delete_acls', name='bulk_delete_acls'),
 )
 
 

+ 29 - 8
apps/security/static/js/hdfs.ko.js

@@ -220,7 +220,7 @@ var Assist = function (vm, assist) {
   }
 
   self.getTreeAdditionalDataForPath = function (path) {
-    if (typeof self.treeAdditionalData[path] == "undefined"){
+    if (typeof self.treeAdditionalData[path] == "undefined") {
       var _add = {
         loaded: false
       }
@@ -384,7 +384,7 @@ var Assist = function (vm, assist) {
         'pagenum': self.pagenum(),
         'format': 'json',
         'doas': vm.doAs(),
-        'isDiffMode': self.isDiffMode()
+        'isDiffMode': self.isDiffMode(),
       },
       function (data) {
         if (data.error != null){
@@ -433,9 +433,8 @@ var Assist = function (vm, assist) {
         self.isLoadingAcls(true);
       }, 1000);
         logGA('get_acls');
-
         $.getJSON('/security/api/hdfs/get_acls', {
-        'path': self.path()
+        'path': self.path(),
       }, function (data) {
       window.clearTimeout(_isLoading);
       if (data != null) {
@@ -478,11 +477,33 @@ var Assist = function (vm, assist) {
         $.each(toDelete, function (index, item) {
           self.acls.remove(item);
         });
+        self.refreshTree();
         $(document).trigger("info", 'Done!');
       }
     ).fail(function (xhr, textStatus, errorThrown) {
-        $(document).trigger("error", JSON.parse(xhr.responseText).message);
-      });
+      $(document).trigger("error", JSON.parse(xhr.responseText).message);
+    });
+  }
+  
+  self.bulkDeleteAcls = function() {
+	$(".jHueNotify").hide();
+	logGA('bulkDeleteAcls');
+
+	var checkedPaths = self.getCheckedItems();
+	
+	$.post("/security/api/hdfs/bulk_delete_acls", {
+        'path': self.path(),
+        'checkedPaths': ko.mapping.toJSON(checkedPaths),
+      }, function (data) {
+        if (checkedPaths.indexOf(self.path()) != -1) {
+          self.acls.removeAll();
+        }
+        self.refreshTree();
+        $(document).trigger("info", 'Done!');
+      }
+    ).fail(function (xhr, textStatus, errorThrown) {
+      $(document).trigger("error", JSON.parse(xhr.responseText).message);
+    });
   }
 }
 
@@ -494,14 +515,14 @@ var HdfsViewModel = function (initial) {
 
   self.doAs = ko.observable(initial.user);
   self.doAs.subscribe(function () {
-	  self.assist.refreshTree();
+    self.assist.refreshTree();
   });
   self.availableHadoopUsers = ko.observableArray();
   self.availableHadoopGroups = ko.observableArray();
 
   self.selectableHadoopUsers = ko.computed(function() {
     var _users = ko.utils.arrayMap(self.availableHadoopUsers(), function(user) {
-        return user.username;
+      return user.username;
     });
     return _users.sort();
   }, self);