Menu

Ranger Solr Cloud on Docker Ranger Plugin Install

module.exports = header: 'Ranger Solr Plugin install', handler: ({options}) ->
  version = null

Registry

  @registry.register 'hconfigure', 'ryba/lib/hconfigure'
  @registry.register 'hdfs_mkdir', 'ryba/lib/hdfs_mkdir'
  @registry.register 'ranger_service', 'ryba/ranger/actions/ranger_service'
  @registry.register 'ranger_policy', 'ryba/ranger/actions/ranger_policy'

Wait

  @call once: true, 'ryba/ranger/admin/wait', options.wait_ranger_admin

Packages

  @call header: 'Packages', ->
    @system.execute
      header: 'Setup Execution Version'
      shy:true
      cmd: """
      hdp-select versions | tail -1
      """
     , (err, data) ->
        return  err if err or not data.status
        version = data.stdout.trim() if data.status
        
    @service
      name: "ranger-solr-plugin"

Service Repositories

  @each options.service_repos, (opts, callback) ->
    {key, value} = opts
    #Ranger Repository
    @ranger_service
      username: options.ranger_admin.options.admin.username
      password: options.ranger_admin.options.admin.password
      url: options.solr_plugins[key].install['POLICY_MGR_URL']
      service: value
    @next callback

Service Layout

  @each options.solr_plugins, (opts, callback) ->
    {key, value} = opts
    @call
      if: value.install['XAAUDIT.HDFS.IS_ENABLED'] is 'true'
      header: 'Audit HDFS Policy'
    , ->
      @ranger_policy
        header: 'HDFS Audit'
        username: options.ranger_admin.options.admin.username
        password: options.ranger_admin.options.admin.password
        url: value.install['POLICY_MGR_URL']
        policy: value.policy_hdfs_audit
      @system.mkdir
        header: 'HDFS Spool Dir'
        if: value.install['XAAUDIT.HDFS.IS_ENABLED'] is 'true'
        target: value.install['XAAUDIT.HDFS.FILE_SPOOL_DIR']
        uid: options.solr_user.name
        gid: options.solr_user.name
        mode: 0o0750
      @call ->
        for target in value.policy_hdfs_audit
          @hdfs_mkdir
            target: target
            mode: 0o0750
            parent:
              mode: 0o0711
              user: options.user.name
              group: options.group.name
            uid: options.solr_user.name
            gid: options.solr_user.name
            krb5_user: options.hdfs_krb5_user
      @system.mkdir
        header: 'Solr Spool Dir'
        if: value.install['XAAUDIT.SOLR.IS_ENABLED'] is 'true'
        target: value.install['XAAUDIT.SOLR.FILE_SPOOL_DIR']
        uid: options.solr_user.name
        gid: options.solr_user.name
        mode: 0o0750

                  
                  
  # solr_plugin.hdp_current_version = null
  # context.system.execute
  #   cmd:  "hdp-select versions | tail -1"
  #   header: 'configure mounts'
  # , (err, data) ->
  #   return callback err if err
  #   solr_plugin.hdp_current_version = data.stdout.trim() if data.status
  # "/usr/hdp/#{solr_plugin.hdp_current_version}/ranger-solr-plugin:/usr/hdp/#{solr_plugin.hdp_current_version}/ranger-solr-plugin"
  # context.call 'ryba/ranger/plugins/solr_cloud_docker/install', solr_cluster: {config: cluster_config, name: name, host_config: host_config}

Plugin Scripts

The execution of the ranger-solr-plugin-enable script, slightly differs from other plugins. Indeed the ranger' lib dir needs to be added to solr's classpath. By default solr loads the lib directory found in the SOLR_HOME.

    @call ->
      @file
        header: 'Scripts rendering'
        if: -> version?
        source: "#{__dirname}/../../resources/plugin-install.properties"
        target: "/usr/hdp/#{version}/ranger-solr-plugin/install.properties"
        local: true
        eof: true
        backup: true
        write: for k, v of options.solr_plugins[key].install
          match: RegExp "^#{quote k}=.*$", 'mg'
          replace: "#{k}=#{v}"
          append: true
    @system.mkdir
      target: "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes"
      uid: options.solr_user.name
      gid: options.solr_group.name
      mode: 0o0750
    @system.mkdir
      target: "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/lib"
      uid: options.solr_user.name
      gid: options.solr_group.name
      mode: 0o0750
    @file
      header: 'Script Fix'
      target: "/usr/hdp/#{version}/ranger-solr-plugin/enable-solr-plugin.sh"
      write: [
          match: RegExp "^HCOMPONENT_INSTALL_DIR=.*$", 'mg'
          replace: "HCOMPONENT_INSTALL_DIR=#{options.conf_dir}/clusters/#{key}/server"
        ,
          match: RegExp "^HCOMPONENT_CONF_DIR=.*$", 'mg'
          replace: "HCOMPONENT_CONF_DIR=#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes"
        ,
          match: RegExp "^HCOMPONENT_LIB_DIR=.*$", 'mg'
          replace: "HCOMPONENT_LIB_DIR=#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/lib"
        
      ]
      backup: true
      mode: 0o750
    @call
      header: 'Enable Solr Plugin'
    , (_, callback) ->
      files = ['ranger-solr-audit.xml','ranger-solr-security.xml','ranger-policymgr-ssl.xml']
      sources_props = {}
      current_props = {}
      files_exists = {}
      @system.execute
        cmd: """
        echo '' | keytool -list \
          -storetype jceks \
          -keystore /etc/ranger/#{options.solr_plugins[key].install['REPOSITORY_NAME']}/cred.jceks | egrep '.*ssltruststore|auditdbcred|sslkeystore'
        """
        code_skipped: 1
      @call
        if: -> @status -1 #do not need this if the cred.jceks file is not provisioned
      , ->
        @each files, (opts, cb) ->
          file = opts.key
          target = "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes/#{file}"
          ssh = @ssh options.ssh
          fs.exists ssh, target, (err, exists) ->
            return cb err if err
            return cb() unless exists
            files_exists["#{file}"] = exists
            properties.read ssh, target , (err, props) ->
              return cb err if err
              sources_props["#{file}"] = props
              cb()
      @system.execute
        header: 'Script Execution'
        cmd: """
        if /usr/hdp/#{version}/ranger-solr-plugin/enable-solr-plugin.sh ;
        then exit 0 ;
        else exit 1 ;
        fi;
        """
      @hconfigure
        header: 'Fix ranger-solr-security conf'
        target: "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes/ranger-solr-security.xml"
        merge: true
        properties:
          'ranger.plugin.solr.policy.rest.ssl.config.file': "/usr/solr-cloud/current/server/solr-webapp/webapp/WEB-INF/classes/ranger-policymgr-ssl.xml"
      @chown
        header: 'Fix Permissions'
        target: "/etc/ranger/#{value.install['REPOSITORY_NAME']}/.cred.jceks.crc"
        uid: options.solr_user.name
        gid: options.solr_group.name
      @hconfigure
        header: 'JAAS Properties for solr'
        target: "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes/ranger-solr-audit.xml"
        merge: true
        properties: value.audit
      @each files, (opts, cb) ->
        file = opts.key
        target = "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes/#{file}"
        ssh = @ssh options.ssh
        fs.exists ssh, target, (err, exists) ->
          return callback err if err
          properties.read ssh, target , (err, props) ->
            return cb err if err
            current_props["#{file}"] = props
            cb()
      @call
        header: 'Diff'
        shy: true
      , ->
        for file in files
          #do not need to go further if the file did not exist
          return callback null, true unless sources_props["#{file}"]?
          for prop, value of current_props["#{file}"]
            return callback null, true unless value is sources_props["#{file}"][prop]
          for prop, value of sources_props["#{file}"]
            return callback null, true unless value is current_props["#{file}"][prop]
          return callback null, false
    @system.copy
      source: '/etc/hadoop/conf/core-site.xml'
      target: "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes/core-site.xml"
    @system.copy
      source: '/etc/hadoop/conf/hdfs-site.xml'
      target: "#{options.conf_dir}/clusters/#{key}/server/solr-webapp/webapp/WEB-INF/classes/hdfs-site.xml"
    @next callback

Dependencies

quote = require 'regexp-quote'
path = require 'path'
mkcmd = require '../../../lib/mkcmd'
properties = require '../../../lib/properties'
fs = require 'ssh2-fs'