
# HDFS Actions to get active namenode

## Options

* `nn_url` (String, array)    
  The url like https://master01.metal.ryba:50470. RYBA will take every url an will
  request Namenode's metrics to get the active status.
* `krb5_user` (obj)   
  A principal which has suffisiant permission to request namenode api.

## Source Code

    module.exports = ({options}, callback) ->
      return callback Error 'missing namenode url' unless options.nn_url
      return callback Error 'Missing krb5 user' unless options.krb5_user
      options.nn_url = [options.nn_url] unless Array.isArray options.nn_url
      options.debug ?= false
      detected = false
      options.header = null
      {krb5_user} = options
      @log message: "Entering hdfs active", level: 'DEBUG', module: '@rybajs/metal/lib/actions/hdfs/active'
      @each options.nn_url, ({options}, cb) ->
        nn_url = options.key
        @log message: "Testing Namenode #{nn_url}", level: 'DEBUG', module: '@rybajs/metal/lib/actions/hdfs/active'
        @system.execute
          shy: true
          cmd: mkcmd.hdfs krb5_user, "/bin/bash -c 'curl --negotiate -X GET -k -u : \"#{nn_url}/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus\"'"
        , (err, obj) ->
            return callback err if err
            try
              data = JSON.parse obj.stdout
              if data.beans[0]['State'] is 'active'
                detected = true
                @log message: "Active Namenode #{nn_url} detected", level: 'DEBUG', module: '@rybajs/metal/lib/actions/hdfs/active'
                return callback err, status: false, active: nn_url
            catch err
              callback err
        @next cb
      @next (err) ->
        return callback err if err
        return callback "Failed to detect active NN" unless detected

## Dependencies

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