lib/wombat/cli.rb in wombat-cli-0.2.1 vs lib/wombat/cli.rb in wombat-cli-0.3.0
- old
+ new
@@ -5,42 +5,38 @@
require 'wombat/common'
require 'wombat/build'
require 'wombat/deploy'
require 'wombat/output'
require 'wombat/delete'
+require 'wombat/update'
+require 'wombat/init'
class Options
NAME = File.basename($0).freeze
def self.parse(args)
options = OpenStruct.new
- options.templates = calculate_templates("*.json")
global = OptionParser.new do |opts|
opts.banner = "Usage: #{NAME} [SUBCOMMAND [options]]"
opts.separator ""
opts.version = Wombat::VERSION
opts.separator <<-COMMANDS.gsub(/^ {8}/, "")
build : build one or more templates
+ delete : delete a stack
+ deploy : deploy a stack
help : prints this help message
+ init : create wombat skeleton project
list : list all templates in project
- deploy : deploy a stack
outputs : get outputs for a stack
- delete : delete a stack
+ update : update lock and/or cloud template
COMMANDS
end
templates_argv_proc = proc { |options|
- options.templates = calculate_templates(args) unless args.empty?
-
- options.templates.each do |t|
- if !File.exists?("packer/#{t}.json")
- $stderr.puts "File packer/#{t}.json does not exist for template '#{t}'"
- exit(1)
- end
- end
+ options.templates = ARGV unless args.empty?
}
box_version_argv_proc = proc { |options|
options.box = ARGV[0]
options.version = ARGV[1]
@@ -48,18 +44,15 @@
stack_argv_proc = proc { |options|
options.stack = ARGV[0]
}
+ file_argv_proc = proc { |options|
+ options.file = ARGV[0]
+ }
+
subcommand = {
- help: {
- parser: OptionParser.new {},
- argv: proc { |options|
- puts global
- exit(0)
- }
- },
build: {
class: BuildRunner,
parser: OptionParser.new { |opts|
opts.banner = "Usage: #{NAME} build [options] TEMPLATE[ TEMPLATE ...]"
@@ -75,22 +68,19 @@
options.parallel = opt
end
},
argv: templates_argv_proc
},
- list: {
- class: ListRunner,
+ delete: {
+ class: DeleteRunner,
parser: OptionParser.new { |opts|
- opts.banner = "Usage: #{NAME} list [TEMPLATE ...]"
+ opts.banner = "Usage: #{NAME} delete STACK"
+
+ opts.on("-c CLOUD", "--cloud CLOUD", "Select cloud") do |opt|
+ options.cloud = opt
+ end
},
- argv: templates_argv_proc
- },
- outputs: {
- class: OutputRunner,
- parser: OptionParser.new { |opts|
- opts.banner = "Usage: #{NAME} outputs [TEMPLATE ...]"
- },
argv: stack_argv_proc
},
deploy: {
class: DeployRunner,
parser: OptionParser.new { |opts|
@@ -102,27 +92,58 @@
opts.on("--update-lock", "Update lockfile") do |opt|
options.update_lock = opt
end
- opts.on("--create-template", "Create template") do |opt|
+ opts.on("--update-template", "Update template") do |opt|
options.create_template = opt
end
},
argv: stack_argv_proc
},
- delete: {
- class: DeleteRunner,
+ help: {
+ parser: OptionParser.new {},
+ argv: proc { |options|
+ puts global
+ exit(0)
+ }
+ },
+ init: {
+ class: InitRunner,
parser: OptionParser.new { |opts|
- opts.banner = "Usage: #{NAME} delete STACK"
+ opts.banner = "Usage: #{NAME} init"
+ opts.on("-p PATH", "--path PATH", "Path to copy skeleton") do |opt|
+ options.path = opt
+ end
+ },
+ argv: stack_argv_proc
+ },
+ list: {
+ class: ListRunner,
+ parser: OptionParser.new { |opts|
+ opts.banner = "Usage: #{NAME} list [TEMPLATE ...]"
+ },
+ argv: templates_argv_proc
+ },
+ outputs: {
+ class: OutputRunner,
+ parser: OptionParser.new { |opts|
+ opts.banner = "Usage: #{NAME} outputs [TEMPLATE ...]"
+ },
+ argv: stack_argv_proc
+ },
+ update: {
+ class: UpdateRunner,
+ parser: OptionParser.new { |opts|
+ opts.banner = "Usage: #{NAME} update [lock || template]"
+
opts.on("-c CLOUD", "--cloud CLOUD", "Select cloud") do |opt|
options.cloud = opt
end
},
-
- argv: stack_argv_proc
+ argv: file_argv_proc
}
}
global.order!
@@ -133,34 +154,30 @@
options.command = command
options.klass = subcommand.fetch(command).fetch(:class)
options
end
-
- def self.calculate_templates(globs)
- Dir.chdir('packer') do
- Array(globs).
- map { |glob| result = Dir.glob("#{glob}"); result.empty? ? glob : result }.
- flatten.
- sort.
- delete_if { |file| file =~ /\.variables\./ }.
- map { |template| template.sub(/\.json$/, '') }
- end
- end
end
class ListRunner
include Common
attr_reader :templates
def initialize(opts)
- @templates = opts.templates
+ @templates = opts.templates.nil? ? calculate_templates : opts.templates
end
def start
- templates.each { |template| puts template }
+ templates.each do |t|
+ if !File.exists?("#{conf['packer_dir']}/#{t}.json")
+ $stderr.puts "File #{conf['packer_dir']}/#{t}.json does not exist for template '#{t}'"
+ exit(1)
+ else
+ puts t
+ end
+ end
end
end
class Runner