class Paknife::Cli

Constants

BACKENDS
DEFAULT_KNIFE
DEFAULT_OPTIONS
DEFAULT_THREADS
SUBCOMMANDS

Attributes

contexts[R]

Public Class Methods

new(argv) click to toggle source
# File lib/paknife/cli.rb, line 25
def initialize(argv)
  @options, backend, subcommand, nodes, knife_options = parse_argv(argv)
  @contexts = build_contexts(backend, subcommand, nodes, knife_options)
end
run(argv) click to toggle source
# File lib/paknife/cli.rb, line 19
def self.run(argv)
  new(argv).run
end

Public Instance Methods

run() click to toggle source
# File lib/paknife/cli.rb, line 30
def run
  Parallel.each(contexts, in_threads: determine_threads) do |context|
    context.run
  end
end

Private Instance Methods

build_contexts(backend, subcommand, nodes, knife_options) click to toggle source
# File lib/paknife/cli.rb, line 113
def build_contexts(backend, subcommand, nodes, knife_options)
  opts = {
    log_level: determine_log_level,
    knife: determine_knife,
  }

  nodes.map.with_index do |node, index|
    Context.new(index, backend, subcommand, node, knife_options, opts)
  end
end
determine_knife() click to toggle source
# File lib/paknife/cli.rb, line 124
def determine_knife
  @options[:knife] || ENV["PAKNIFE_KNIFE"] || DEFAULT_KNIFE
end
determine_log_level() click to toggle source
# File lib/paknife/cli.rb, line 138
def determine_log_level
  if @options[:quiet]
    :warn
  else
    :info
  end
end
determine_threads() click to toggle source
# File lib/paknife/cli.rb, line 128
def determine_threads
  threads = @options[:threads] || ENV["PAKNIFE_THREADS"] || DEFAULT_THREADS

  if threads.to_s.downcase == "max"
    @contexts.count
  else
    [@contexts.count, threads.to_i].min
  end
end
parse_argv(argv) click to toggle source
# File lib/paknife/cli.rb, line 38
def parse_argv(argv)
  [parse_options(argv), *parse_knife_argv(argv)]
end
parse_knife_argv(argv) click to toggle source
# File lib/paknife/cli.rb, line 90
def parse_knife_argv(argv)
  backend = argv.shift # solo or zero
  abort "Invalid backend: `#{backend}`" unless BACKENDS.include?(backend)

  subcommand = argv.shift
  abort "Invalid subcommand: `#{subcommand}`" unless SUBCOMMANDS.include?(subcommand)

  nodes = []
  knife_options = []
  knife_options_section = false

  argv.each do |arg|
    knife_options_section ||= arg.start_with?("-")
    if knife_options_section
      knife_options << arg
    else
      nodes << arg
    end
  end

  [backend, subcommand, nodes, knife_options]
end
parse_options(argv) click to toggle source
# File lib/paknife/cli.rb, line 42
      def parse_options(argv)
        opts = {}

        OptionParser.new do |op|
          op.banner = <<-USAGE
Usage:
  #{op.program_name} [<options>] <backend> <subcommand> <nodes> [<knife_options>]

Backend:
  solo : run knife-solo
  zero : run knffe-zero (Not well tested)

Options:
USAGE
          op.version = VERSION

          op.on("-k", "--knife VALUE") do |v|
            opts[:knife] = v
          end

          op.on("-q", "--[no-]quiet") do |v|
            opts[:quiet] = v
          end

          op.on("-t", "--threads VALUE") do |v|
            if v == "max"
              opts[:threads] = :max
            elsif v.to_i > 0
              opts[:threads] = v.to_i
            else
              abort "Invalid value for `--thread` option: #{v}"
            end
          end

          op.on_tail("-h", "--help") do
            puts op.help
            exit
          end

          op.on_tail("-v", "--version") do
            puts "#{op.program_name} #{op.version}"
            exit
          end
        end.order!

        DEFAULT_OPTIONS.merge(opts)
      end