nicholasjackson/minke

View on GitHub
bin/minke

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby
require 'optparse'
require 'minke'

ASCII_ART = <<eos
888b     d888 d8b          888
8888b   d8888 Y8P          888
88888b.d88888              888
888Y88888P888 888 88888b.  888  888  .d88b.
888 Y888P 888 888 888 "88b 888 .88P d8P  Y8b
888  Y8P  888 888 888  888 888888K  88888888
888   "   888 888 888  888 888 "88b Y8b.
888       888 888 888  888 888  888  "Y8888
eos

puts ""
puts ASCII_ART
puts ""
puts "Version: #{Minke::VERSION}"
puts ""

Minke::Generators::Processor.load_generators

puts ""
puts ""

options = {
  :config => './config.yml'
}

subtext = <<HELP
Commonly used command are:
   generate    :     generate a new template
   fetch       :     fetch dependent packages
   build       :     build template
   test        :     run unit tests
   cucumber    :     run cucumber tests
   run         :     start the application
   build_image :     build a docker image
   push        :     push built image to the registry
   encrypt     :     encrypt secrets with a private key
   shell       :     start a shell session inside the build container
   provision   :     run the provisioner using terraform
See 'minke COMMAND --help' for more information on a specific command.
HELP

global = OptionParser.new do |opts|
  opts.banner = "Usage: minke [options] [subcommand [options]]"
  opts.on("-v", "--[no-]verbose", "Run verbosely") { |v| options[:verbose] = true }
  opts.on("-m", "-m [FOLDER]", "Mount folder in Minke container, e.g. ssh keys") { }
  opts.on("-A", "--forward-ssh", "Forward ssh keys to docker") { |v| options[:forward_ssh] = true }
  opts.separator ""
  opts.separator subtext
end

subcommands = { 
  'generate' => OptionParser.new do |opts|
    opts.banner = "Usage: minke [options] generate [options]"

    opts.on('-g', '--generator GENERATOR', 'Generator plugin to use') { |v| options[:generator] = v }
    opts.on('-o', '--output OUTPUT', 'Output folder') { |v| options[:output] = v }
    opts.on('-a', '--application_name NAME', 'Application name') { |v| options[:name] = v }
    opts.on('-n', '--namespace NAMESPACE', 'Application namespace') { |v| options[:namespace] = v }
   end,

   'build' => OptionParser.new do |opts|
     # ...
   end,

   'test' => OptionParser.new do |opts|
     opts.banner = "Usage: minke [options] test [options]"

     opts.on("-c", "--config", "Load config file at given path") { |c| options[:config] = c }
   end,

   'encrypt' => OptionParser.new do |opts|
      opts.banner = "Usage: minke [options] encrypt [options]"

      opts.on('-e', '--encrypt STRING', 'Encrypt a string') { |v| options[:encrypt] = v }
      opts.on('-k', '--key STRING', 'Private key to use for encryption') { |v| options[:key] = v }
   end,
   
   'provision' => OptionParser.new do |opts|
      opts.banner = "Usage: minke [options] provision [options]"

      opts.on('-plan',    '', 'Run terraform plan')      { |v| options[:provision_mode] = 'plan'    }
      opts.on('-apply',   '', 'Run terraform apply')     { |v| options[:provision_mode] = 'apply'   }
      opts.on('-destroy', '', 'Run terraform destroy')   { |v| options[:provision_mode] = 'destroy' }
    end
}

global.order!
command = ARGV.shift

if !subcommands[command].nil?
  subcommands[command].order!
end

def load_config config_file, verbose
  reader = Minke::Config::Reader.new Minke::Logging.create_logger(STDOUT, verbose)
  config = reader.read config_file
  variables = Minke::Generators::ConfigVariables.new.tap do |v|
      v.application_name = config.application_name
      v.namespace = config.namespace
      v.src_root = File.expand_path('../')
  end
  processor = Minke::Generators::Processor.new variables, nil, Minke::Logging.create_logger(STDOUT, verbose)
  generator_config = processor.get_generator config.generator_name
  return config, generator_config
end

def doCommand(command, verbose, options, config_file = nil)
  config, generator_config = load_config(config_file, verbose) unless config_file == nil
  Minke::Command.new(
    config, 
    generator_config,
    verbose,
    options
  ).public_send(command)
end

def doGenerate(options)
  # load the installed generators
  variables = Minke::Generators::ConfigVariables.new.tap do |v|
    v.application_name = options[:name]
    v.namespace = options[:namespace]
    v.src_root = File.expand_path(options[:output]) unless options[:output] == nil
  end
  logger = Minke::Logging.create_logger(options[:verbose])
  processor = Minke::Generators::Processor.new(
    variables, 
    Minke::Docker::DockerRunner.new(logger),
    logger
    )

  processor.process options[:generator], options[:output]
end

def doEncrypt(options)
  if options[:key] == nil
    puts "Please specify a key to use for encryption using -k [path to file]"
    exit 1 
  end

  encrypt = Minke::Encryption::Encryption.new options[:key]

  puts 'Copy the below to your minke config file:'
  puts ''
  puts 'secure:'
  puts "  fingerprint: #{encrypt.fingerprint}"
  puts '  value: >'
  encrypt.encrypt_string(options[:encrypt]).split("\n").each { |l| puts "    #{l}"}
end

case command
when "test"
  doCommand(:test, options[:verbose], options, options[:config])
when "build"
  doCommand(:build, options[:verbose], options, options[:config])
when "fetch"
  doCommand(:fetch, options[:verbose], options, options[:config])
when "cucumber"
  doCommand(:cucumber, options[:verbose], options, options[:config])
when "build_image"
  doCommand(:build_image, options[:verbose], options, options[:config])
when "run"
  doCommand(:run, options[:verbose], options, options[:config])
when "push"
  doCommand(:push, options[:verbose], options, options[:config])
when "shell"
  doCommand(:shell, options[:verbose], options, options[:config])
when "provision"
  doCommand(:provision, options[:verbose], options, options[:config])
when "generate"
  if options[:generator] == nil || options[:output] == nil || options[:name] == nil || options[:namespace] == nil
    puts "Please specify options use: minke generate --help for help on command line options"
    exit 0
  end

  doGenerate(options)
when "encrypt"
  doEncrypt(options)
end