You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2014/04/23 01:33:22 UTC

svn commit: r1589305 - in /hbase/trunk/hbase-shell/src/main/ruby: hbase/table.rb shell/commands/grant.rb

Author: apurtell
Date: Tue Apr 22 23:33:22 2014
New Revision: 1589305

URL: http://svn.apache.org/r1589305
Log:
HBASE-11001 Shell support for granting cell permissions for testing

Modified:
    hbase/trunk/hbase-shell/src/main/ruby/hbase/table.rb
    hbase/trunk/hbase-shell/src/main/ruby/shell/commands/grant.rb

Modified: hbase/trunk/hbase-shell/src/main/ruby/hbase/table.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-shell/src/main/ruby/hbase/table.rb?rev=1589305&r1=1589304&r2=1589305&view=diff
==============================================================================
--- hbase/trunk/hbase-shell/src/main/ruby/hbase/table.rb (original)
+++ hbase/trunk/hbase-shell/src/main/ruby/hbase/table.rb Tue Apr 22 23:33:22 2014
@@ -126,6 +126,7 @@ EOF
     # Note the below methods are prefixed with '_' to hide them from the average user, as
     # they will be much less likely to tab complete to the 'dangerous' internal method
     #----------------------------------------------------------------------------------------------
+
     # Put a cell 'value' at specified table/row/column
     def _put_internal(row, column, value, timestamp = nil, args = {})
       p = org.apache.hadoop.hbase.client.Put.new(row.to_s.to_java_bytes)
@@ -368,17 +369,7 @@ EOF
       org.apache.hadoop.hbase.util.Bytes::toLong(cell.getValue)
     end
 
-    #----------------------------------------------------------------------------------------------
-    # Scans whole table or a range of keys and returns rows matching specific criteria
-    def _scan_internal(args = {})
-      unless args.kind_of?(Hash)
-        raise ArgumentError, "Arguments should be a hash. Failed to parse #{args.inspect}, #{args.class}"
-      end
-
-      limit = args.delete("LIMIT") || -1
-      maxlength = args.delete("MAXLENGTH") || -1
-      @converters.clear()
-
+    def _hash_to_scan(args)
       if args.any?
         filter = args["FILTER"]
         startrow = args["STARTROW"] || ''
@@ -433,10 +424,27 @@ EOF
         scan = org.apache.hadoop.hbase.client.Scan.new
       end
 
-      # Start the scanner
-      scanner = @table.getScanner(scan)
+      scan
+    end
+
+    def _get_scanner(args)
+      @table.getScanner(_hash_to_scan(args))
+    end
+
+    #----------------------------------------------------------------------------------------------
+    # Scans whole table or a range of keys and returns rows matching specific criteria
+    def _scan_internal(args = {})
+      raise(ArgumentError, "Arguments should be a Hash") unless args.kind_of?(Hash)
+
+      limit = args.delete("LIMIT") || -1
+      maxlength = args.delete("MAXLENGTH") || -1
       count = 0
       res = {}
+
+      @converters.clear()
+
+      # Start the scanner
+      scanner = @table.getScanner(_hash_to_scan(args))
       iter = scanner.iterator
 
       # Iterate results
@@ -472,23 +480,37 @@ EOF
 
      # Apply OperationAttributes to puts/scans/gets
     def set_attributes(oprattr, attributes)
-      raise(ArgumentError, "#{"ATTRIBUTES"} must be a Hash type") unless attributes.kind_of?(Hash)
-        for k,v in attributes
-          v = v.to_s unless v.nil?
-          oprattr.setAttribute(k.to_s, v.to_java_bytes)
-        end
+      raise(ArgumentError, "Attributes must be a Hash type") unless attributes.kind_of?(Hash)
+      for k,v in attributes
+        v = v.to_s unless v.nil?
+        oprattr.setAttribute(k.to_s, v.to_java_bytes)
+      end
     end
-    
+
+    def set_cell_permissions(op, permissions)
+      raise(ArgumentError, "Permissions must be a Hash type") unless permissions.kind_of?(Hash)
+      map = java.util.HashMap.new
+      permissions.each do |user,perms|
+        map.put(user.to_s, org.apache.hadoop.hbase.security.access.Permission.new(
+          perms.to_java_bytes))
+      end
+      op.setACL(map)
+    end
+
     def set_cell_visibility(oprattr, visibility)
-    	oprattr.setCellVisibility(org.apache.hadoop.hbase.security.visibility.CellVisibility.new(visibility.to_s))
+      oprattr.setCellVisibility(
+        org.apache.hadoop.hbase.security.visibility.CellVisibility.new(
+          visibility.to_s))
     end
-    
+
     def set_authorizations(oprattr, authorizations)
-        raise(ArgumentError, "#{"authorizations"} must be a Array type type") unless authorizations.kind_of?(Array)
-        auths = [ authorizations ].flatten.compact
-    	oprattr.setAuthorizations(org.apache.hadoop.hbase.security.visibility.Authorizations.new(auths.to_java(:string)))
+      raise(ArgumentError, "Authorizations must be a Array type") unless authorizations.kind_of?(Array)
+      auths = [ authorizations ].flatten.compact
+      oprattr.setAuthorizations(
+        org.apache.hadoop.hbase.security.visibility.Authorizations.new(
+          auths.to_java(:string)))
     end
-    
+
     #----------------------------
     # Add general administration utilities to the shell
     # each of the names below adds this method name to the table

Modified: hbase/trunk/hbase-shell/src/main/ruby/shell/commands/grant.rb
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-shell/src/main/ruby/shell/commands/grant.rb?rev=1589305&r1=1589304&r2=1589305&view=diff
==============================================================================
--- hbase/trunk/hbase-shell/src/main/ruby/shell/commands/grant.rb (original)
+++ hbase/trunk/hbase-shell/src/main/ruby/shell/commands/grant.rb Tue Apr 22 23:33:22 2014
@@ -35,10 +35,78 @@ For example:
 EOF
       end
 
-      def command(user, rights, table_name=nil, family=nil, qualifier=nil)
-        format_simple_command do
-          security_admin.grant(user, rights, table_name, family, qualifier)
+      def command(*args)
+
+        # command form is ambiguous at first argument
+        table_name = user = args[0]
+        raise(ArgumentError, "First argument should be a String") unless user.kind_of?(String)
+
+        if args[1].kind_of?(String)
+
+          # Original form of the command
+          #     user in args[0]
+          #     permissions in args[1]
+          #     table_name in args[2]
+          #     family in args[3] or nil
+          #     qualifier in args[4] or nil
+
+          permissions = args[1]
+          raise(ArgumentError, "Permissions are not of String type") unless permissions.kind_of?(
+            String)
+          table_name = args[2]
+          raise(ArgumentError, "Table name is not of String type") unless table_name.kind_of?(
+            String)
+          family = args[3]     # will be nil if unset
+          if not family.nil?
+            raise(ArgumentError, "Family is not of String type") unless family.kind_of?(String)
+            qualifier = args[4]  # will be nil if unset
+            if not qualifier.nil?
+              raise(ArgumentError, "Qualifier is not of String type") unless qualifier.kind_of?(
+                String)
+            end
+          else
+            qualifier = nil
+          end
+          format_simple_command do
+            security_admin.grant(user, permissions, table_name, family, qualifier)
+          end
+
+        elsif args[1].kind_of?(Hash)
+
+          # New form of the command, a cell ACL update
+          #    table_name in args[0], a string
+          #    a Hash mapping users (or groups) to permisisons in args[1]
+          #    a Hash argument suitable for passing to Table#_get_scanner in args[2]
+          # Useful for feature testing and debugging.
+
+          permissions = args[1]
+          raise(ArgumentError, "Permissions are not of Hash type") unless
+            permissions.kind_of?(Hash)
+          scan = args[2]
+          raise(ArgumentError, "Scanner specification is not a Hash") unless
+            scan.kind_of?(Hash)
+
+          t = table(table_name)
+          now = Time.now
+          scanner = t._get_scanner(scan)
+          count = 0
+          iter = scanner.iterator
+          while iter.hasNext
+            row = iter.next
+            row.list.each do |cell|
+              put = org.apache.hadoop.hbase.client.Put.new(row.getRow)
+              put.add(cell)
+              t.set_cell_permissions(put, permissions)
+              t.table.put(put)
+            end
+            count += 1
+          end
+          formatter.footer(now, count)
+
+        else
+          raise(ArgumentError, "Second argument should be a String or Hash")
         end
+
       end
     end
   end