From ac0a81831cd713a1291a74894468364603636fbf Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Thu, 4 Feb 2016 21:22:05 +0700 Subject: [PATCH 1/2] make report url from job ids in console client --- devops-client/lib/devops-client/handler/deploy.rb | 3 ++- .../devops-client/handler/helpers/outputtable.rb | 11 +++++++++++ .../lib/devops-client/handler/project.rb | 11 ++++++----- devops-client/lib/devops-client/handler/server.rb | 12 +++++++----- devops-client/lib/devops-client/handler/stack.rb | 7 ++++--- devops-client/lib/devops-client/output/project.rb | 15 --------------- 6 files changed, 30 insertions(+), 29 deletions(-) diff --git a/devops-client/lib/devops-client/handler/deploy.rb b/devops-client/lib/devops-client/handler/deploy.rb index f5c06ed..7ab707c 100644 --- a/devops-client/lib/devops-client/handler/deploy.rb +++ b/devops-client/lib/devops-client/handler/deploy.rb @@ -26,7 +26,8 @@ class Deploy < Handler @options_parser.invalid_deploy_command abort() end - post_chunk("/deploy", :names => names, :tags => tags) + job_ids = post("/deploy", :names => names, :tags => tags) + reports_urls(job_ids) end end diff --git a/devops-client/lib/devops-client/handler/helpers/outputtable.rb b/devops-client/lib/devops-client/handler/helpers/outputtable.rb index 1f78db3..aed1478 100644 --- a/devops-client/lib/devops-client/handler/helpers/outputtable.rb +++ b/devops-client/lib/devops-client/handler/helpers/outputtable.rb @@ -13,6 +13,17 @@ module Outputtable outputter.output(options) 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) base.extend(ClassMethods) diff --git a/devops-client/lib/devops-client/handler/project.rb b/devops-client/lib/devops-client/handler/project.rb index dd261d3..f1657a4 100644 --- a/devops-client/lib/devops-client/handler/project.rb +++ b/devops-client/lib/devops-client/handler/project.rb @@ -87,7 +87,6 @@ class Project < Handler when "delete_servers" self.options = @options_parser.delete_servers_options delete_servers_handler @options_parser.args - output(output_type: :delete_servers) else @options_parser.invalid_command end @@ -279,7 +278,8 @@ class Project < Handler q = {} q[:servers] = options[:servers] unless options[:servers].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 def test_handler args @@ -288,8 +288,8 @@ class Project < Handler @options_parser.invalid_test_command abort(r) end - response = post "/project/test/#{args[2]}/#{args[3]}" - puts response.inspect + job_ids = post "/project/test/#{args[2]}/#{args[3]}" + reports_urls(job_ids) end protected @@ -456,7 +456,8 @@ protected deploy_env: env, dry_run: false } - @list = delete("/project/#{project}/servers", body) + response = delete("/project/#{project}/servers", body) + reports_urls(response['reports']) end private diff --git a/devops-client/lib/devops-client/handler/server.rb b/devops-client/lib/devops-client/handler/server.rb index 55fbdcf..e50a76d 100644 --- a/devops-client/lib/devops-client/handler/server.rb +++ b/devops-client/lib/devops-client/handler/server.rb @@ -75,7 +75,8 @@ class Server < Handler q[k] = self.options[k] unless self.options[k].nil? end - post_chunk "/server", q + job_ids = post "/server", q + reports_urls(job_ids) end def delete_handler @@ -86,11 +87,11 @@ class Server < Handler abort(r) end if question(I18n.t("handler.server.question.delete", :name => name)) - puts "Server '#{name}', deleting..." - puts delete("/server/#{name}", options) + jobs_ids = delete("/server/#{name}", options) # returns array with one job id, actually + puts reports_urls(jobs_ids) end end - "" + nil end def show_handler @@ -117,7 +118,8 @@ class Server < Handler if q.has_key?(:run_list) abort unless Project.validate_run_list(q[:run_list]) end - post_chunk "/server/bootstrap", q + job_ids = post "/server/bootstrap", q + reports_urls(job_ids) end def add_static_handler # add --public-ip -k diff --git a/devops-client/lib/devops-client/handler/stack.rb b/devops-client/lib/devops-client/handler/stack.rb index 7385024..5bf0642 100644 --- a/devops-client/lib/devops-client/handler/stack.rb +++ b/devops-client/lib/devops-client/handler/stack.rb @@ -63,7 +63,8 @@ class Stack < Handler json = JSON.pretty_generate(q) 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 @@ -123,8 +124,8 @@ class Stack < Handler def deploy_handler stack_id = @args[2] - response = post "/stack/#{stack_id}/deploy" - puts response.inspect + job_ids = post "/stack/#{stack_id}/deploy" + reports_urls(job_ids) end def reserve_handler diff --git a/devops-client/lib/devops-client/output/project.rb b/devops-client/lib/devops-client/output/project.rb index c080e45..256fd59 100644 --- a/devops-client/lib/devops-client/output/project.rb +++ b/devops-client/lib/devops-client/output/project.rb @@ -27,8 +27,6 @@ module Output when :test title = I18n.t("output.title.project.test", :project => ARGV[2], :env => ARGV[3]) create_test(@data) - when :delete_servers - return delete_servers_output else title = I18n.t("output.title.project.list") create_list(@data) @@ -151,18 +149,5 @@ module Output headers_and_rows(stacks, fields_to_output) 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 From 9bc8f75ba382ad9ff6ac33fb1f8bbafeed1a8e69 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Sat, 6 Feb 2016 21:56:35 +0700 Subject: [PATCH 2/2] select env instead of inputting its name on stack creating --- .../handler/deploy_envs/deploy_env.rb | 2 +- .../lib/devops-client/handler/handler.rb | 29 ++++--------------- .../handler/helpers/http_utils.rb | 22 ++++++++++++++ .../handler/helpers/resources_fetcher.rb | 24 +++++++++++++-- .../handler/helpers/resources_selector.rb | 28 +++++++++--------- .../lib/devops-client/handler/stack.rb | 9 +++--- .../lib/devops-client/output/base.rb | 2 +- .../lib/devops-client/output/project.rb | 8 ++--- devops-client/locales/en.yml | 2 ++ 9 files changed, 74 insertions(+), 52 deletions(-) diff --git a/devops-client/lib/devops-client/handler/deploy_envs/deploy_env.rb b/devops-client/lib/devops-client/handler/deploy_envs/deploy_env.rb index e12c6cf..7994799 100644 --- a/devops-client/lib/devops-client/handler/deploy_envs/deploy_env.rb +++ b/devops-client/lib/devops-client/handler/deploy_envs/deploy_env.rb @@ -87,7 +87,7 @@ class DeployEnv end 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 diff --git a/devops-client/lib/devops-client/handler/handler.rb b/devops-client/lib/devops-client/handler/handler.rb index edc2b69..cfd75d3 100644 --- a/devops-client/lib/devops-client/handler/handler.rb +++ b/devops-client/lib/devops-client/handler/handler.rb @@ -26,7 +26,11 @@ class Handler attr_accessor :auth def host - "http://#{@host}" + if @host.start_with?('http') + @host + else + "http://#{@host}" + end end #TODO: only basic auth now @@ -50,30 +54,9 @@ protected end 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 - 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 names.each_with_index do |name, i| diff --git a/devops-client/lib/devops-client/handler/helpers/http_utils.rb b/devops-client/lib/devops-client/handler/helpers/http_utils.rb index a5119e5..6fcaebc 100644 --- a/devops-client/lib/devops-client/handler/helpers/http_utils.rb +++ b/devops-client/lib/devops-client/handler/helpers/http_utils.rb @@ -143,4 +143,26 @@ module HttpUtils params_filter(params.select{|k,v| k != :cmd and !v.nil?}).join("&") 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 \ No newline at end of file diff --git a/devops-client/lib/devops-client/handler/helpers/resources_fetcher.rb b/devops-client/lib/devops-client/handler/helpers/resources_fetcher.rb index 5e50ade..4514741 100644 --- a/devops-client/lib/devops-client/handler/helpers/resources_fetcher.rb +++ b/devops-client/lib/devops-client/handler/helpers/resources_fetcher.rb @@ -1,13 +1,22 @@ +require "devops-client/handler/helpers/http_utils" require 'devops-client/helpers/string_helper' # fetches resources list along with table +# Rewrite this to avoid dependency on handlers module Helpers class ResourcesFetcher + include HttpUtils + + # have the same meaning as in handlers + attr_reader :username, :password, :options, :host def initialize(options) - @host = options.fetch(:host) - @handler_object_options = options.fetch(:handler_object_options) + @host = "http://#{options.fetch(:host)}" + @options = options.fetch(:handler_options) @auth = options.fetch(:auth) + + # username, password and options are used to perform http queries with module HttpUtils + @username, @password = @auth[:username], @auth[:password] end def fetch(collection_name, *args) @@ -19,12 +28,21 @@ module Helpers [handler.list_handler(*args), handler.outputter.table] 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 def build_handler(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 end diff --git a/devops-client/lib/devops-client/handler/helpers/resources_selector.rb b/devops-client/lib/devops-client/handler/helpers/resources_selector.rb index 1b2ed8e..33d76c6 100644 --- a/devops-client/lib/devops-client/handler/helpers/resources_selector.rb +++ b/devops-client/lib/devops-client/handler/helpers/resources_selector.rb @@ -1,38 +1,36 @@ require 'devops-client/handler/helpers/resources_fetcher' require 'devops-client/handler/helpers/input_utils' +require 'devops-client/output/project' module Helpers class ResourcesSelector include InputUtils - # fetcher_instance_or_attrs should be: - # instance of ResourcesFetcher - # OR - # 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 + def initialize(fetcher) + raise "fetcher should be instance of ResourcesFetcher" unless fetcher.is_a?(ResourcesFetcher) + @fetcher = fetcher end - def select_available_provider(options={}) + def select_available_provider providers, table = @fetcher.fetch_with_table('provider') # somewhy returns provider name as String. select_item_from_table(I18n.t("headers.provider"), providers, table) end - def select_available_project(options={}) + def select_available_project projects, table = @fetcher.fetch_with_table('project') project = select_item_from_table(I18n.t("headers.project"), projects, table) project['name'] 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={}) 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) diff --git a/devops-client/lib/devops-client/handler/stack.rb b/devops-client/lib/devops-client/handler/stack.rb index 5bf0642..d294c14 100644 --- a/devops-client/lib/devops-client/handler/stack.rb +++ b/devops-client/lib/devops-client/handler/stack.rb @@ -51,12 +51,11 @@ class Stack < Handler q = {} q[:without_bootstrap] = options[:without_bootstrap] - q[:provider] = options[:provider] || resources_selector.select_available_provider - # q[:id] = options[:id] || enter_parameter(I18n.t('handler.stack.create.id')) + # q[:provider] = options[:provider] || resources_selector.select_available_provider 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[:run_list] = options[:run_list] || enter_parameter_or_empty(I18n.t('handler.stack.create.run_list')) - # q[:run_list] = q[:run_list].split(',') + q[:deploy_env] = options[:deploy_env] || resources_selector.select_available_env(q[:project]) + env = fetcher.fetch_project(q[:project])['deploy_envs'].detect {|env| env['identifier'] == q[:deploy_env]} + q[:provider] = env['provider'] filepath = options[:parameters_file] || enter_parameter(I18n.t('handler.stack.create.parameters_file')) q[:parameters] = JSON.parse(File.read(filepath)) diff --git a/devops-client/lib/devops-client/output/base.rb b/devops-client/lib/devops-client/output/base.rb index d5c8e71..82f8650 100644 --- a/devops-client/lib/devops-client/output/base.rb +++ b/devops-client/lib/devops-client/output/base.rb @@ -38,7 +38,7 @@ module Output end def with_num? - outputting_list? + @options[:with_num] || outputting_list? end def create_table headers, rows, title=nil, with_num=true, separator=false diff --git a/devops-client/lib/devops-client/output/project.rb b/devops-client/lib/devops-client/output/project.rb index 256fd59..1123c51 100644 --- a/devops-client/lib/devops-client/output/project.rb +++ b/devops-client/lib/devops-client/output/project.rb @@ -60,7 +60,7 @@ module Output def create_show show rows = [] - headers = if show["type"] == "multi" + if show["type"] == "multi" show["deploy_envs"].each do |de| subprojects = [] nodes = [] @@ -72,14 +72,14 @@ module Output end rows.push [ de["identifier"], subprojects.join("\n"), nodes.join("\n"), de["users"].join("\n") ] end - [ + headers = [ 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.users") ] else - show["deploy_envs"].each do |de| + show["deploy_envs"].each_with_index do |de, i| rows.push [ show["name"], de["identifier"], @@ -91,7 +91,7 @@ module Output (de["users"] || []).join("\n") ] end - [ + headers = [ I18n.t("output.table_header.id"), I18n.t("output.table_header.deploy_env"), I18n.t("output.table_header.image_id"), diff --git a/devops-client/locales/en.yml b/devops-client/locales/en.yml index 119e419..d088e01 100644 --- a/devops-client/locales/en.yml +++ b/devops-client/locales/en.yml @@ -43,6 +43,7 @@ en: user: "User" stack: "Stack" stack_template: "Stack template" + env: "Deploy environment" handler: flavor: list: @@ -214,6 +215,7 @@ en: show: "Project '%{name}' information" servers: "Project '%{title}' servers" test: "Project test: %{project} - %{env}" + envs: "Project '%{name}' deploy envs" provider: list: "Providers" script: