Menu

HBase Rest Gateway Check

module.exports =  header: 'HBase Rest Check', handler: ({options}) ->

Register

  @registry.register 'ranger_policy', 'ryba/ranger/actions/ranger_policy'

Assert HTTP Port

  @connection.assert
    header: 'HTTP'
    servers: options.wait.http.filter (server) -> server.host is options.fqdn
    retry: 3
    sleep: 3000

Assert HTTP Info Port

  @connection.assert
    header: 'HTTP Info'
    servers: options.wait.http_info.filter (server) -> server.host is options.fqdn
    retry: 3
    sleep: 3000

Ranger Policy

[Ranger HBase plugin][ranger-hbase] try to mimics grant/revoke by shell.

  @call
    header: 'Ranger Policy'
    if: !!options.ranger_admin
  , ->
    # Wait for Ranger admin to be started
    @call 'ryba/ranger/admin/wait', once: true, options.wait_ranger_admin
    @wait.execute
      header: 'Wait Service'
      cmd: """
      curl --fail -H \"Content-Type: application/json\" -k -X GET  \
        -u #{options.ranger_admin.username}:#{options.ranger_admin.password} \
        \"#{options.ranger_install['POLICY_MGR_URL']}/service/public/v2/api/service/name/#{options.ranger_install['REPOSITORY_NAME']}\"
      """
      code_skipped: 22
    @ranger_policy
      header: 'Create'
      username: options.ranger_admin.username
      password: options.ranger_admin.password
      url: options.ranger_install['POLICY_MGR_URL']
      policy:
        'name': "ryba-rest-check-#{options.hostname}"
        'description': 'Ryba policy used to check the HBase REST service'
        'service': options.ranger_install['REPOSITORY_NAME']
        'isEnabled': 'true'
        'isAuditEnabled': true
        'resources':
          'table':
            'values': [
              "#{options.test.namespace}:#{options.test.table}"
              ]
            'isExcludes': false
            'isRecursive': false
          'column-family':
            'values': ['*']
            'isExcludes': false
            'isRecursive': false
          'column':
            'values': ['*']
            'isExcludes': false
            'isRecursive': false
        'policyItems': [
          'accesses': [
            'type': 'read'
            'isAllowed': true
          ,
            'type': 'write'
            'isAllowed': true
          ,
            'type': 'create'
            'isAllowed': true
          ,
            'type': 'admin'
            'isAllowed': true
          ]
          'users': [options.test.user.name]
          'groups': []
          'conditions': []
          'delegateAdmin': false
        ]

Check Shell

  @call header: 'Scan', ->
    encode = (data) -> (new Buffer data, 'utf8').toString 'base64'
    decode = (data) -> (new Buffer data, 'base64').toString 'utf8'
    curl = 'curl -s '
    curl += '-k ' if options.hbase_site['hbase.rest.ssl.enabled'] is 'true'
    curl += '--negotiate -u: ' if options.hbase_site['hbase.rest.authentication.type'] is 'kerberos'
    curl += '-H "Accept: application/json" '
    curl += '-H "Content-Type: application/json" '
    protocol = if options.hbase_site['hbase.rest.ssl.enabled'] is 'true' then 'https' else 'http'
    port = options.hbase_site['hbase.rest.port']
    schema = JSON.stringify ColumnSchema: [name: "#{options.hostname}_rest"]
    rows = JSON.stringify Row: [ key: encode('my_row_rest'), Cell: [column: encode("#{options.hostname}_rest:my_column"), $: encode('my rest value')]]
    @system.execute
      cmd: mkcmd.hbase options.admin, """
      if hbase --config #{options.conf_dir} shell 2>/dev/null <<< "list_namespace_tables '#{options.test.namespace}'" | egrep '[0-9]+ row'; then
        if [ ! -z '#{options.force_check}' ] || [ "$?" -eq 1]; then
          echo [DEBUG] Cleanup existing table and namespace
          hbase --config #{options.conf_dir} shell 2>/dev/null << '    CMD' | sed -e 's/^    //';
            disable '#{options.test.namespace}:#{options.test.table}'
            drop '#{options.test.namespace}:#{options.test.table}'
            drop_namespace '#{options.test.namespace}'
          CMD
        else
          echo [INFO] Test is skipped; exit 2;
        fi
      fi
      hbase --config #{options.conf_dir} shell 2>/dev/null <<-CMD
        create_namespace '#{options.test.namespace}'
        grant '#{options.test.user.name}', 'RWCA', '@#{options.test.namespace}'
        create '#{options.test.namespace}:#{options.test.table}', 'family1'
      CMD
      """
      code_skipped: 2
      trap: true
    @system.execute
      cmd: mkcmd.test options.test_krb5_user, """
      #{curl} -X POST --data '#{schema}' #{protocol}://#{options.fqdn}:#{port}/#{options.test.namespace}:#{options.test.table}/schema
      #{curl} --data '#{rows}' #{protocol}://#{options.fqdn}:#{port}/#{options.test.namespace}:#{options.test.table}/___false-row-key___/#{options.hostname}_rest%3A
      #{curl} #{protocol}://#{options.fqdn}:#{port}/#{options.test.namespace}:#{options.test.table}/my_row_rest
      """
      unless_exec: unless options.force_check then mkcmd.test options.test_krb5_user, "hbase --config #{options.conf_dir} shell 2>/dev/null <<< \"scan '#{options.test.namespace}:#{options.test.table}', {COLUMNS => '#{options.hostname}_rest'}\" | egrep '[0-9]+ row'"
    , (err, {status, stdout, stderr}) ->
      return if err or not status
      try
        data = JSON.parse(stdout)
      catch e then throw Error "Invalid Command Output: #{JSON.stringify stdout}"
      return throw Error "Invalid ROW Key: #{JSON.stringify stdout}" unless decode(data?.Row[0]?.key) is 'my_row_rest'

Dependencies

mkcmd = require '../../lib/mkcmd'