fluke/devops-client/lib/devops-client/handler/stack.rb
2016-04-05 15:28:17 +03:00

155 lines
3.9 KiB
Ruby

require 'devops-client/handler/handler'
require 'devops-client/options/stack_options'
require 'devops-client/output/stack'
class Stack < Handler
output_with Output::Stack
def initialize(host, def_options={})
@host = host
@options_parser = StackOptions.new(ARGV, def_options)
end
def handle
@options, @args = @options_parser.parse_options_for!(current_command)
case current_command
when :list
list_handler
output
when :show
show_handler
output
when :create
create_handler
when :delete
delete_handler
when :sync
sync_handler
output
when :deploy
deploy_handler
when :reserve
reserve_handler
when :unreserve
unreserve_handler
when :change_stack_template
change_stack_template_handler
output
end
end
def create_handler
attrs = {}
attrs[:project] = options[:project] || resources_selector.select_available_project
attrs[:deploy_env] = options[:deploy_env] || resources_selector.select_available_env(attrs[:project])
env = fetcher.fetch_project(attrs[:project])['deploy_envs'].detect {|env| env['identifier'] == attrs[:deploy_env]}
attrs[:provider] = env['provider']
params_filepath = options[:parameters_file] || enter_parameter_or_empty(I18n.t('handler.stack.create.parameters_file'))
if params_filepath.empty?
attrs[:parameters] = {}
else
attrs[:parameters] = JSON.parse(File.read(params_filepath))
end
tags_filepath = options[:tags_file] || enter_parameter_or_empty(I18n.t('handler.stack.create.tags_file'))
if tags_filepath.empty?
attrs[:tags] = {}
else
attrs[:tags] = JSON.parse(File.read(tags_filepath))
end
json = JSON.pretty_generate(
without_bootstrap: options[:without_bootstrap] || false,
skip_rollback: options[:skip_rollback] || false,
stack_attributes: attrs
)
if question(I18n.t("handler.stack.question.create")) {puts json}
job_ids = post_body "/stack", json
reports_urls(job_ids)
end
end
def list_handler
@list = if @options[:given_provider]
provider_stacks(@options[:given_provider])
else
get("/stacks")
end
end
def show_handler
stack_id = @args[2]
r = inspect_parameters(@options_parser.show_params, stack_id)
unless r.nil?
@options_parser.invalid_show_command
abort(r)
end
@show = get "/stack/#{stack_id}"
end
def sync_handler
stack_id = @args[2]
r = inspect_parameters(@options_parser.sync_params, stack_id)
unless r.nil?
@options_parser.invalid_sync_command
abort(r)
end
@show = post "/stack/#{stack_id}/sync"
end
def delete_handler
stack_id = @args[2]
r = inspect_parameters(@options_parser.delete_params, stack_id)
unless r.nil?
@options_parser.invalid_delete_command
abort(r)
end
if question(I18n.t("handler.stack.question.delete", name: stack_id))
delete "/stack/#{stack_id}"
end
end
def deploy_handler
stack_id = @args[2]
job_ids = post "/stack/#{stack_id}/deploy"
reports_urls(job_ids)
end
def reserve_handler
stack_id = @args[2]
response = post "/stack/#{stack_id}/reserve"
puts response.inspect
end
def unreserve_handler
stack_id = @args[2]
response = post "/stack/#{stack_id}/unreserve"
puts response.inspect
end
def change_stack_template_handler
stack_id, template_id = @args[2], @args[3]
r = inspect_parameters(@options_parser.delete_params, stack_id, template_id)
unless r.nil?
@options_parser.invalid_change_stack_template_command
abort(r)
end
@show = put("/stack/#{stack_id}/stack_template", {stack_template: template_id})
end
private
def provider_stacks(provider)
if Providers.has_functionality?(provider, :stacks)
get("/stacks/provider/#{provider}")
else
@options_parser.invalid_list_command
abort()
end
end
end