Menu

HDFS Mkdir

Create a directory on an HDFS File/Directory using webhdfs api. If owner and group are passed in options, it will also set ownerships.

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.
  • target (string)
    The target File/directory to set owner on. Required.
  • owner (string)
    The username as a string. Required.
  • group (string) the groupname. Required.
  • mode (string) the mode to apply on target. Required.

Source Code

Show 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
  return callback Error 'Missing target directory' unless options.target
  active_url = null
  file_exists = null
  do_owner = options.owner? and options.group?
  count = 0
  if options.target.indexOf('hdfs://') is 0 
    for i in [0..options.target.length]
      count++ if options.target[i] is '/'
      if count == 3
        options.target = options.target.slice(i)
        break
  options.mode ?= '750'
  options.debug ?= false
  options.header = null
  @log message: "Entering hdfs mkdir", level: 'DEBUG', module: 'ryba/lib/actions/hdfs/active'
  @registry.register ['hdfs','active'], require './active'
  @registry.register ['hdfs','chown'], require './chown'
  @call ->
    @hdfs.active options
    , (err, obj) ->
      active_url = obj.active 
  @call
    shy: true
  , ->
    @system.execute
      cmd: mkcmd.hdfs options.krb5_user, "/bin/bash -c 'curl -H \"Content-Type: application/json\"  --negotiate -X GET -k -u : \"#{active_url}/webhdfs/v1#{options.target}?op=GETFILESTATUS\"'"
    , (err, obj) ->
        throw err if err
        try
          data = JSON.parse obj.stdout
          if data.RemoteException?.exception?
            switch data.RemoteException.exception
              when 'FileNotFoundException'
                file_exists = false
                @log message: "Directory #{options.target} does not exist", level: 'INFO'
              else
                throw Error data.RemoteException
          else
            ## check owner and permission
            @log message: "#{options.target} already exist", level: 'INFO'
            file_exists = true
            throw Error 'Target is not a directory' unless  data['FileStatus']['type'] is 'DIRECTORY'
        catch err
          throw err
  @call
    unless: -> file_exists 
  ,  (_ , cb)->
    @system.execute
      cmd: mkcmd.hdfs options.krb5_user, "/bin/bash -c 'curl --negotiate -X PUT -k -u : \"#{active_url}/webhdfs/v1#{options.target}?op=MKDIRS&permission=#{options.mode}\"'"
    @next cb
  @hdfs.chown options
  @next callback

Dependencies

Show Source Code
mkcmd = require '../../mkcmd'