Browse Source

[security] Preparing adding a new HDFS ACL form

Romain Rigaux 11 years ago
parent
commit
7431ac0f33
2 changed files with 47 additions and 18 deletions
  1. 14 13
      apps/security/src/security/templates/hdfs.mako
  2. 33 5
      apps/security/static/js/hdfs.ko.js

+ 14 - 13
apps/security/src/security/templates/hdfs.mako

@@ -42,31 +42,32 @@ ${ layout.menubar(section='hdfs') }
         <h1 class="card-heading simple">${ _('Edit ACLs') }</h1>        
         <div class="card-body">          
           <div>
-            <input type="text" class="input-xxlarge" value="/tmp"/>
-            <button type="submit" class="btn btn-inverse" style="margin-left:10px">
-              ## open in FB
+            <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: '/filebrowser/view' + $root.assist.path() }" target="_blank" title="${ _('Open in File Browser') }">
               <i class="fa fa-external-link"></i>                
-            </button>
+            </a>
           </div>
           <div>
             <div class="span8">
-              <div data-bind="foreach: viewModel.assist.files">
+              <div data-bind="foreach: $root.assist.files">
                 <div data-bind="text: $data"></div>
               </div>
             </div>
             <div class="span4">
-              <span data-bind="text: viewModel.assist.owner"></span>
-              <span data-bind="text: viewModel.assist.group"></span>
-              <div data-bind="foreach: viewModel.assist.acls">
+              <span data-bind="text: $root.assist.owner"></span>
+              <span data-bind="text: $root.assist.group"></span>
+              <div data-bind="foreach: $root.assist.acls">
                 ## xeditable for edition
-                <div data-bind="text: $data"></div><i class="fa fa-minus"></i>
+                <div data-bind="text: ko.mapping.toJSON($data)"></div><i class="fa fa-minus"></i>
               </div>
-              <i class="fa fa-plus"></i>
-              <div data-bind="visible: viewModel.assist.changed">
-                <button type="button" rel="tooltip" data-placement="bottom" data-bind="click: save, css: {'btn': true}" data-original-title="${ _('Cancel') }" class="btn">
+              <a href="javascript: void(0)" data-bind='click: $root.assist.addAcl'>
+                <i class="fa fa-plus"></i>
+              </a>
+              <div data-bind="visible: $root.assist.changed">
+                <button type="button" rel="tooltip" data-placement="bottom" data-original-title="${ _('Cancel') }" class="btn">
                   <i class="fa fa-undo"></i>
                 </button>
-                <button type="button" rel="tooltip" data-placement="bottom" data-loading-text="${ _('Saving...') }" data-bind="click: save, css: {'btn': true}" data-original-title="${ _('Save') }" class="btn">
+                <button type="button" rel="tooltip" data-placement="bottom" data-loading-text="${ _('Saving...') }" data-original-title="${ _('Save') }" class="btn">
                   <i class="fa fa-save"></i>
                 </button>
               <div>              

+ 33 - 5
apps/security/static/js/hdfs.ko.js

@@ -14,11 +14,28 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+function parseAcl(acl) {
+  m = acl.match(/(.*?):(.*?):(.)(.)(.)/);
+  return {
+    'type': m[1],
+    'name': m[2],
+     'r': m[3],
+     'w': m[4],
+     'x': m[5],
+  }
+}
+
+function printAcl(acl) {
+  return acl['type'] + ':' + acl['name'] + ':' + acl['r'] + acl['w'] + acl['x'];
+}
 
 var Assist = function (vm, assist) {
   var self = this;
 
-  self.path = ko.observable('/tmp');
+  self.path = ko.observable('');
+  self.path.subscribe(function () {
+	self.fetchPath()
+  });
   self.files = ko.observableArray();
 
   self.acls = ko.observableArray();
@@ -27,6 +44,11 @@ var Assist = function (vm, assist) {
   
   self.changed = ko.observable(true); // mocking to true
   
+  self.addAcl = function() {
+	// should have a good template, also understable for non user, user/group icons button
+	self.acls.push(parseAcl('::---'));
+  };
+    
   self.fetchPath = function () {
     $.getJSON('/filebrowser/view' + self.path() + "?pagesize=15&format=json", function (data) { // Will create a cleaner API by calling directly directly webhdfs#LISTDIR?
       self.files.removeAll();
@@ -47,16 +69,22 @@ var Assist = function (vm, assist) {
         $.each(data.entries, function(index, item) {
     	  self.acls.push(item); 
         });
-        self.acls.push("group::r-x"); // mocking
-        self.acls.push("group:execs:r--"); // mocking
+        self.acls.push(parseAcl("user:joe:r-x")); // mocking
+        self.acls.push(parseAcl("group::r--")); // mocking
+        self.acls.push(parseAcl("group:execs:rw-")); // mocking
         self.owner(data.owner);
         self.group(data.group);
     }).fail(function (xhr, textStatus, errorThrown) {
       $(document).trigger("error", xhr.responseText);
     });
-  };   
+  };
+  
+  self.save = function () {
+	// update acls, add new ones, remove ones?
+  }
 }
 
+// not sure if we should merge Assist here yet
 
 var HdfsViewModel = function (context_json) {
   var self = this;
@@ -64,7 +92,7 @@ var HdfsViewModel = function (context_json) {
   // Models
   self.assist = new Assist(self, context_json.assist);
 
-  self.assist.fetchPath();
+  self.assist.path('/tmp');
 
 
   function logGA(page) {