Merge branch 'cid-393-client_enhancements' into cid-394-deploy_delete_list_of_servers

This commit is contained in:
Anton Chuchkalov 2016-02-12 14:43:32 +03:00
commit adb8d1730a
13 changed files with 104 additions and 81 deletions

View File

@ -26,7 +26,8 @@ class Deploy < Handler
@options_parser.invalid_deploy_command @options_parser.invalid_deploy_command
abort() abort()
end end
post_chunk("/deploy", :names => names, :tags => tags) job_ids = post("/deploy", :names => names, :tags => tags)
reports_urls(job_ids)
end end
end end

View File

@ -87,7 +87,7 @@ class DeployEnv
end end
def fetcher def fetcher
@fetcher ||= Helpers::ResourcesFetcher.new(host: @host, handler_object_options: @options, auth: @auth) @fetcher ||= Helpers::ResourcesFetcher.new(host: @host, handler_options: @options, auth: @auth)
end end

View File

@ -26,7 +26,11 @@ class Handler
attr_accessor :auth attr_accessor :auth
def host def host
"http://#{@host}" if @host.start_with?('http')
@host
else
"http://#{@host}"
end
end end
#TODO: only basic auth now #TODO: only basic auth now
@ -50,30 +54,9 @@ protected
end end
def fetcher def fetcher
@fetcher ||= Helpers::ResourcesFetcher.new(host: @host, handler_object_options: @options, auth: @auth) @fetcher ||= Helpers::ResourcesFetcher.new(host: @host, handler_options: @options, auth: @auth)
end end
def params_filter params
r = []
return params if params.kind_of?(String)
params.each do |k,v|
key = k.to_s
if v.kind_of?(Array)
v.each do |val|
r.push "#{key}[]=#{val}"
end
elsif v.kind_of?(Hash)
buf = {}
v.each do |k1,v1|
buf["#{key}[#{k1}]"] = v1
end
r = r + params_filter(buf)
else
r.push "#{key}=#{v}"
end
end
r
end
def inspect_parameters names, *args def inspect_parameters names, *args
names.each_with_index do |name, i| names.each_with_index do |name, i|

View File

@ -143,4 +143,26 @@ module HttpUtils
params_filter(params.select{|k,v| k != :cmd and !v.nil?}).join("&") params_filter(params.select{|k,v| k != :cmd and !v.nil?}).join("&")
end end
def params_filter params
r = []
return params if params.kind_of?(String)
params.each do |k,v|
key = k.to_s
if v.kind_of?(Array)
v.each do |val|
r.push "#{key}[]=#{val}"
end
elsif v.kind_of?(Hash)
buf = {}
v.each do |k1,v1|
buf["#{key}[#{k1}]"] = v1
end
r = r + params_filter(buf)
else
r.push "#{key}=#{v}"
end
end
r
end
end end

View File

@ -13,6 +13,17 @@ module Outputtable
outputter.output(options) outputter.output(options)
end end
def report_url(job_id)
create_url "report/#{job_id}"
end
def reports_urls(job_ids)
raise "Parameter should be an array of strings" unless job_ids.is_a?(Array)
job_ids.map do |job_id|
report_url(job_id)
end.join("\n")
end
def self.included(base) def self.included(base)
base.extend(ClassMethods) base.extend(ClassMethods)

View File

@ -1,13 +1,22 @@
require "devops-client/handler/helpers/http_utils"
require 'devops-client/helpers/string_helper' require 'devops-client/helpers/string_helper'
# fetches resources list along with table # fetches resources list along with table
# Rewrite this to avoid dependency on handlers
module Helpers module Helpers
class ResourcesFetcher class ResourcesFetcher
include HttpUtils
# have the same meaning as in handlers
attr_reader :username, :password, :options, :host
def initialize(options) def initialize(options)
@host = options.fetch(:host) @host = "http://#{options.fetch(:host)}"
@handler_object_options = options.fetch(:handler_object_options) @options = options.fetch(:handler_options)
@auth = options.fetch(:auth) @auth = options.fetch(:auth)
# username, password and options are used to perform http queries with module HttpUtils
@username, @password = @auth[:username], @auth[:password]
end end
def fetch(collection_name, *args) def fetch(collection_name, *args)
@ -19,12 +28,21 @@ module Helpers
[handler.list_handler(*args), handler.outputter.table] [handler.list_handler(*args), handler.outputter.table]
end end
def fetch_project(project_id)
@fetched_projects = {}
if cached = @fetched_projects[project_id]
cached
else
@fetched_projects[project_id] = get("/project/#{project_id}")
end
end
private private
def build_handler(collection_name) def build_handler(collection_name)
require_handler_file(collection_name) require_handler_file(collection_name)
handler = resource_handler_klass(collection_name).new(@host, @handler_object_options) handler = resource_handler_klass(collection_name).new(host, options)
handler.auth = @auth handler.auth = @auth
handler handler
end end

View File

@ -1,38 +1,36 @@
require 'devops-client/handler/helpers/resources_fetcher' require 'devops-client/handler/helpers/resources_fetcher'
require 'devops-client/handler/helpers/input_utils' require 'devops-client/handler/helpers/input_utils'
require 'devops-client/output/project'
module Helpers module Helpers
class ResourcesSelector class ResourcesSelector
include InputUtils include InputUtils
# fetcher_instance_or_attrs should be: def initialize(fetcher)
# instance of ResourcesFetcher raise "fetcher should be instance of ResourcesFetcher" unless fetcher.is_a?(ResourcesFetcher)
# OR @fetcher = fetcher
# hash with these keys:
# :host
# :handler_object_options
# :auth
def initialize(fetcher_instance_or_attrs)
if fetcher_instance_or_attrs.is_a?(ResourcesFetcher)
@fetcher = fetcher_instance_or_attrs
else
@fetcher = ResourcesFetcher.new(fetcher_instance_or_attrs)
end
end end
def select_available_provider(options={}) def select_available_provider
providers, table = @fetcher.fetch_with_table('provider') providers, table = @fetcher.fetch_with_table('provider')
# somewhy returns provider name as String. # somewhy returns provider name as String.
select_item_from_table(I18n.t("headers.provider"), providers, table) select_item_from_table(I18n.t("headers.provider"), providers, table)
end end
def select_available_project(options={}) def select_available_project
projects, table = @fetcher.fetch_with_table('project') projects, table = @fetcher.fetch_with_table('project')
project = select_item_from_table(I18n.t("headers.project"), projects, table) project = select_item_from_table(I18n.t("headers.project"), projects, table)
project['name'] project['name']
end end
def select_available_env(project_id)
project = @fetcher.fetch_project(project_id)
outputter = Output::Project.new(project, {output_type: :show, with_num: true})
env = select_item_from_table("Select deploy env", project['deploy_envs'], outputter.table)
env['identifier']
end
def select_available_stack_template(options={}) def select_available_stack_template(options={})
stack_templates, table = @fetcher.fetch_with_table('stack_template', options[:provider]) stack_templates, table = @fetcher.fetch_with_table('stack_template', options[:provider])
stack_template = select_item_from_table(I18n.t("headers.stack_template"), stack_templates, table) stack_template = select_item_from_table(I18n.t("headers.stack_template"), stack_templates, table)

View File

@ -87,7 +87,6 @@ class Project < Handler
when "delete_servers" when "delete_servers"
self.options = @options_parser.delete_servers_options self.options = @options_parser.delete_servers_options
delete_servers_handler @options_parser.args delete_servers_handler @options_parser.args
output(output_type: :delete_servers)
else else
@options_parser.invalid_command @options_parser.invalid_command
end end
@ -279,7 +278,8 @@ class Project < Handler
q = {} q = {}
q[:servers] = options[:servers] unless options[:servers].nil? q[:servers] = options[:servers] unless options[:servers].nil?
q[:deploy_env] = args[3] unless args[3].nil? q[:deploy_env] = args[3] unless args[3].nil?
post_chunk "/project/#{args[2]}/deploy", q job_ids = post "/project/#{args[2]}/deploy", q
reports_urls(job_ids)
end end
def test_handler args def test_handler args
@ -288,8 +288,8 @@ class Project < Handler
@options_parser.invalid_test_command @options_parser.invalid_test_command
abort(r) abort(r)
end end
response = post "/project/test/#{args[2]}/#{args[3]}" job_ids = post "/project/test/#{args[2]}/#{args[3]}"
puts response.inspect reports_urls(job_ids)
end end
protected protected
@ -456,7 +456,8 @@ protected
deploy_env: env, deploy_env: env,
dry_run: false dry_run: false
} }
@list = delete("/project/#{project}/servers", body) response = delete("/project/#{project}/servers", body)
reports_urls(response['reports'])
end end
private private

View File

@ -75,7 +75,8 @@ class Server < Handler
q[k] = self.options[k] unless self.options[k].nil? q[k] = self.options[k] unless self.options[k].nil?
end end
post_chunk "/server", q job_ids = post "/server", q
reports_urls(job_ids)
end end
def delete_handler def delete_handler
@ -86,11 +87,11 @@ class Server < Handler
abort(r) abort(r)
end end
if question(I18n.t("handler.server.question.delete", :name => name)) if question(I18n.t("handler.server.question.delete", :name => name))
puts "Server '#{name}', deleting..." jobs_ids = delete("/server/#{name}", options) # returns array with one job id, actually
puts delete("/server/#{name}", options) puts reports_urls(jobs_ids)
end end
end end
"" nil
end end
def show_handler def show_handler
@ -117,7 +118,8 @@ class Server < Handler
if q.has_key?(:run_list) if q.has_key?(:run_list)
abort unless Project.validate_run_list(q[:run_list]) abort unless Project.validate_run_list(q[:run_list])
end end
post_chunk "/server/bootstrap", q job_ids = post "/server/bootstrap", q
reports_urls(job_ids)
end end
def add_static_handler # add <project> <env> <private_ip> <ssh_username> --public-ip <public_ip> -k <keyname> def add_static_handler # add <project> <env> <private_ip> <ssh_username> --public-ip <public_ip> -k <keyname>

View File

@ -51,19 +51,19 @@ class Stack < Handler
q = {} q = {}
q[:without_bootstrap] = options[:without_bootstrap] q[:without_bootstrap] = options[:without_bootstrap]
q[:provider] = options[:provider] || resources_selector.select_available_provider # q[:provider] = options[:provider] || resources_selector.select_available_provider
# q[:id] = options[:id] || enter_parameter(I18n.t('handler.stack.create.id'))
q[:project] = options[:project] || resources_selector.select_available_project q[:project] = options[:project] || resources_selector.select_available_project
q[:deploy_env] = options[:deploy_env] || enter_parameter(I18n.t('handler.stack.create.deploy_env')) q[:deploy_env] = options[:deploy_env] || resources_selector.select_available_env(q[:project])
# q[:run_list] = options[:run_list] || enter_parameter_or_empty(I18n.t('handler.stack.create.run_list')) env = fetcher.fetch_project(q[:project])['deploy_envs'].detect {|env| env['identifier'] == q[:deploy_env]}
# q[:run_list] = q[:run_list].split(',') q[:provider] = env['provider']
filepath = options[:parameters_file] || enter_parameter(I18n.t('handler.stack.create.parameters_file')) filepath = options[:parameters_file] || enter_parameter(I18n.t('handler.stack.create.parameters_file'))
q[:parameters] = JSON.parse(File.read(filepath)) q[:parameters] = JSON.parse(File.read(filepath))
json = JSON.pretty_generate(q) json = JSON.pretty_generate(q)
if question(I18n.t("handler.stack.question.create")) {puts json} if question(I18n.t("handler.stack.question.create")) {puts json}
post_body "/stack", json job_ids = post_body "/stack", json
reports_urls(job_ids)
end end
end end
@ -123,8 +123,8 @@ class Stack < Handler
def deploy_handler def deploy_handler
stack_id = @args[2] stack_id = @args[2]
response = post "/stack/#{stack_id}/deploy" job_ids = post "/stack/#{stack_id}/deploy"
puts response.inspect reports_urls(job_ids)
end end
def reserve_handler def reserve_handler

View File

@ -38,7 +38,7 @@ module Output
end end
def with_num? def with_num?
outputting_list? @options[:with_num] || outputting_list?
end end
def create_table headers, rows, title=nil, with_num=true, separator=false def create_table headers, rows, title=nil, with_num=true, separator=false

View File

@ -27,8 +27,6 @@ module Output
when :test when :test
title = I18n.t("output.title.project.test", :project => ARGV[2], :env => ARGV[3]) title = I18n.t("output.title.project.test", :project => ARGV[2], :env => ARGV[3])
create_test(@data) create_test(@data)
when :delete_servers
return delete_servers_output
else else
title = I18n.t("output.title.project.list") title = I18n.t("output.title.project.list")
create_list(@data) create_list(@data)
@ -62,7 +60,7 @@ module Output
def create_show show def create_show show
rows = [] rows = []
headers = if show["type"] == "multi" if show["type"] == "multi"
show["deploy_envs"].each do |de| show["deploy_envs"].each do |de|
subprojects = [] subprojects = []
nodes = [] nodes = []
@ -74,14 +72,14 @@ module Output
end end
rows.push [ de["identifier"], subprojects.join("\n"), nodes.join("\n"), de["users"].join("\n") ] rows.push [ de["identifier"], subprojects.join("\n"), nodes.join("\n"), de["users"].join("\n") ]
end end
[ headers = [
I18n.t("output.table_header.deploy_env"), I18n.t("output.table_header.deploy_env"),
I18n.t("output.table_header.subproject") + " - " + I18n.t("output.table_header.deploy_env"), I18n.t("output.table_header.subproject") + " - " + I18n.t("output.table_header.deploy_env"),
I18n.t("output.table_header.node_number"), I18n.t("output.table_header.node_number"),
I18n.t("output.table_header.users") I18n.t("output.table_header.users")
] ]
else else
show["deploy_envs"].each do |de| show["deploy_envs"].each_with_index do |de, i|
rows.push [ rows.push [
show["name"], show["name"],
de["identifier"], de["identifier"],
@ -93,7 +91,7 @@ module Output
(de["users"] || []).join("\n") (de["users"] || []).join("\n")
] ]
end end
[ headers = [
I18n.t("output.table_header.id"), I18n.t("output.table_header.id"),
I18n.t("output.table_header.deploy_env"), I18n.t("output.table_header.deploy_env"),
I18n.t("output.table_header.image_id"), I18n.t("output.table_header.image_id"),
@ -151,18 +149,5 @@ module Output
headers_and_rows(stacks, fields_to_output) headers_and_rows(stacks, fields_to_output)
end end
def delete_servers_output
output = ''
if @data['reports'].empty?
output << 'There are no deleted servers.'
else
output << "Reports for servers deleting:\n----\n"
output << @data['reports'].join("\n")
end
output
end
end end
end end

View File

@ -43,6 +43,7 @@ en:
user: "User" user: "User"
stack: "Stack" stack: "Stack"
stack_template: "Stack template" stack_template: "Stack template"
env: "Deploy environment"
handler: handler:
flavor: flavor:
list: list:
@ -214,6 +215,7 @@ en:
show: "Project '%{name}' information" show: "Project '%{name}' information"
servers: "Project '%{title}' servers" servers: "Project '%{title}' servers"
test: "Project test: %{project} - %{env}" test: "Project test: %{project} - %{env}"
envs: "Project '%{name}' deploy envs"
provider: provider:
list: "Providers" list: "Providers"
script: script: