From b7688a48212a11356ee0770e997ce9cab037fa7b Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Mon, 8 Feb 2016 23:56:05 +0700 Subject: [PATCH] client: add "provider accounts" and "image list --provider_account" --- .../lib/devops-client/handler/image.rb | 10 +++-- .../lib/devops-client/handler/provider.rb | 21 ++++++---- .../devops-client/options/image_options.rb | 8 ++++ .../devops-client/options/provider_options.rb | 3 +- .../lib/devops-client/output/base.rb | 17 +++++++++ .../lib/devops-client/output/provider.rb | 38 ++++++++++++++++--- devops-client/locales/en.yml | 3 ++ devops-service/app/api2/handlers/image.rb | 4 ++ devops-service/app/api2/routes/image.rb | 6 +++ devops-service/commands/image.rb | 8 ++-- 10 files changed, 99 insertions(+), 19 deletions(-) diff --git a/devops-client/lib/devops-client/handler/image.rb b/devops-client/lib/devops-client/handler/image.rb index 9fdc0d0..40c245b 100644 --- a/devops-client/lib/devops-client/handler/image.rb +++ b/devops-client/lib/devops-client/handler/image.rb @@ -92,12 +92,16 @@ class Image < Handler end def provider_images provider - if Providers.has_functionality?(provider, :images) - @list = get("/images/provider/#{provider}") - else + if provider == 'static' @options_parser.invalid_list_command abort() end + + if @options[:provider_account] + @list = get("/images/provider/#{provider}/#{@options[:provider_account]}") + else + @list = get("/images/provider/#{provider}") + end end def show_handler diff --git a/devops-client/lib/devops-client/handler/provider.rb b/devops-client/lib/devops-client/handler/provider.rb index 3f15699..f3389af 100644 --- a/devops-client/lib/devops-client/handler/provider.rb +++ b/devops-client/lib/devops-client/handler/provider.rb @@ -12,22 +12,29 @@ class Provider < Handler end def handle - current_command = ARGV[1].to_sym @options, @args = @options_parser.parse_options_for!(current_command) case current_command when :list list_handler - output + output(output_type: :list) + when :accounts + @provider = @args[2] + accounts_handler + output(output_type: :accounts, provider: @provider) end end def list_handler - r = inspect_parameters @options_parser.list_params - unless r.nil? - @options_parser.invalid_list_command - abort(r) - end @list = get("/providers").sort!{|x,y| x["id"] <=> y["id"]} end + def accounts_handler + r = inspect_parameters @options_parser.accounts_params, @provider + unless r.nil? + @options_parser.invalid_accounts_command + abort(r) + end + @list = get("/provider/#{@provider}/accounts") + end + end diff --git a/devops-client/lib/devops-client/options/image_options.rb b/devops-client/lib/devops-client/options/image_options.rb index 587488b..d217b78 100644 --- a/devops-client/lib/devops-client/options/image_options.rb +++ b/devops-client/lib/devops-client/options/image_options.rb @@ -27,6 +27,14 @@ class ImageOptions < CommonOptions end end + def list_options + self.options do |parser, options| + parser.banner << self.list_banner + + parser.recognize_option_value(:provider_account, resource_name: :image) + end + end + extend_options_method :list_options do |options| if args[2] == "provider" and args[3] options[:given_provider] = args[3] diff --git a/devops-client/lib/devops-client/options/provider_options.rb b/devops-client/lib/devops-client/options/provider_options.rb index 72eb74b..adbf7c1 100644 --- a/devops-client/lib/devops-client/options/provider_options.rb +++ b/devops-client/lib/devops-client/options/provider_options.rb @@ -3,13 +3,14 @@ require "devops-client/options/common_options" class ProviderOptions < CommonOptions - commands :list + commands :list, :accounts def initialize args, def_options super(args, def_options) self.header = I18n.t("headers.provider") self.banner_header = "provider" self.list_params = [] + self.accounts_params = %w(PROVIDER) end end diff --git a/devops-client/lib/devops-client/output/base.rb b/devops-client/lib/devops-client/output/base.rb index d5c8e71..f16c6d3 100644 --- a/devops-client/lib/devops-client/output/base.rb +++ b/devops-client/lib/devops-client/output/base.rb @@ -5,6 +5,8 @@ require "json" module Output class Base + MAX_CELL_WIDTH = 80 + attr_reader :options def initialize(data_to_output, options={}) @@ -43,6 +45,7 @@ module Output def create_table headers, rows, title=nil, with_num=true, separator=false return nil if headers.nil? or rows.nil? + shrink_cells_if_width_exceeded(rows) if with_num headers.unshift(I18n.t("output.table_header.number")) rows.each_with_index {|row, i| row.unshift(i + 1)} @@ -82,5 +85,19 @@ module Output [headers, rows] end + private + + def shrink_cells_if_width_exceeded(rows) + rows.each do |row| + row.each_with_index do |cell, i| + row[i] = split_to_parts_of_size(cell, MAX_CELL_WIDTH) + end + end + end + + def split_to_parts_of_size(string, size) + (string || '').chars.each_slice(size).map(&:join).join("\n") + end + end end diff --git a/devops-client/lib/devops-client/output/provider.rb b/devops-client/lib/devops-client/output/provider.rb index cd7ab16..fde48cf 100644 --- a/devops-client/lib/devops-client/output/provider.rb +++ b/devops-client/lib/devops-client/output/provider.rb @@ -4,18 +4,30 @@ module Output class Provider < Base def table - headers, rows = create - create_table(headers, rows, I18n.t("output.title.provider.list")) + case options[:output_type] + when :list + headers, rows = create_list + title = I18n.t("output.title.provider.list") + when :accounts + headers, rows = create_accounts + title = I18n.t("output.title.provider.accounts", provider: options[:provider]) + end + create_table(headers, rows, title) end def csv - headers, rows = create - create_csv(headers, rows) + case options[:output_type] + when :list + headers, rows = create_list + when :accounts + headers, rows = create_accounts + end + create_csv(headers, rows, with_num?) end private - def create + def create_list abort(I18n.t("output.not_found.provider.list")) if @data.empty? headers = [ I18n.t("output.table_header.provider") ] rows = [] @@ -25,5 +37,21 @@ module Output return headers, rows end + def create_accounts + headers = [ + I18n.t("output.table_header.id"), + I18n.t("output.table_header.description"), + I18n.t("output.table_header.ssh_key") + ] + rows = @data.map do |account| + [ + account['account_name'], + account['description'], + account['ssh_key'] + ] + end + [headers, rows] + end + end end diff --git a/devops-client/locales/en.yml b/devops-client/locales/en.yml index 119e419..8a78e2c 100644 --- a/devops-client/locales/en.yml +++ b/devops-client/locales/en.yml @@ -193,6 +193,7 @@ en: stack_template: "Stack Template" cloud_stack_id: "Cloud Stack id" stack_status: Stack status + ssh_key: SSH key title: flavor: list: "Flavors" @@ -216,6 +217,7 @@ en: test: "Project test: %{project} - %{env}" provider: list: "Providers" + accounts: "Provider %{provider} accounts" script: list: "Scripts" server: @@ -314,6 +316,7 @@ en: ssh_username: SSH user name bootstrap_template: Bootstrap template no_bootstrap_template: Do not specify bootstrap template + provider_account: Provider account id project: groups: "Security groups (comma separated list)" deploy_env: "Deploy environment identifier" diff --git a/devops-service/app/api2/handlers/image.rb b/devops-service/app/api2/handlers/image.rb index 60bbbe1..f743081 100644 --- a/devops-service/app/api2/handlers/image.rb +++ b/devops-service/app/api2/handlers/image.rb @@ -20,6 +20,10 @@ module Devops Image.get_available_provider_images(Devops::Db.connector, provider) end + def provider_account_images provider, account + Image.get_available_provider_images(Devops::Db.connector, provider, account) + end + def image id Devops::Db.connector.image(id) end diff --git a/devops-service/app/api2/routes/image.rb b/devops-service/app/api2/routes/image.rb index d6eedfc..c63ae60 100644 --- a/devops-service/app/api2/routes/image.rb +++ b/devops-service/app/api2/routes/image.rb @@ -59,6 +59,12 @@ module Devops json Devops::API2_0::Handler::Image.new(request).provider_images(provider) end + app.get_with_headers "/images/provider/:provider/:account", :headers => [:accept] do |provider, account| + check_privileges("image", "r") + check_provider(provider) + json Devops::API2_0::Handler::Image.new(request).provider_account_images(provider, account) + end + # Create devops image # # * *Request* diff --git a/devops-service/commands/image.rb b/devops-service/commands/image.rb index 0c37897..95b14da 100644 --- a/devops-service/commands/image.rb +++ b/devops-service/commands/image.rb @@ -2,10 +2,12 @@ require "providers/provider_factory" module ImageCommands - def get_available_provider_images mongo, provider + def get_available_provider_images mongo, provider, account=nil filters = mongo.available_images(provider) - if filters.empty? - [] + return [] if filters.empty? + + if account + ::Provider::ProviderFactory.get(provider, account).images(filters) else ::Provider::ProviderFactory.get(provider).images(filters) end