diff --git a/devops-client/lib/devops-client/options/deploy_options.rb b/devops-client/lib/devops-client/options/deploy_options.rb index 6991e27..a23443d 100644 --- a/devops-client/lib/devops-client/options/deploy_options.rb +++ b/devops-client/lib/devops-client/options/deploy_options.rb @@ -11,13 +11,13 @@ class DeployOptions < CommonOptions end def deploy_options - options do |opts, options| - opts.banner << self.banner + options do |parser, options| + parser.banner << self.banner - options[:tag] = nil - opts.on("--tag TAG1,TAG2...", "Tag names, comma separated list") do |tags| + parser.recognize_option_value(:tag, 'deploy', variable_name: 'TAG1,TAG2...') do |tags| options[:tags] = tags.split(",") end + 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 3408df5..abe2638 100644 --- a/devops-client/lib/devops-client/options/image_options.rb +++ b/devops-client/lib/devops-client/options/image_options.rb @@ -15,35 +15,14 @@ class ImageOptions < CommonOptions end def create_options + self.options do |parser, options| + parser.banner << self.create_banner - self.options do |opts, options| - opts.banner << self.create_banner - - options[:provider] = nil - opts.on("--provider PROVIDER", "Image provider") do |provider| - options[:provider] = provider - end - - options[:image_id] = nil - opts.on("--image IMAGE_ID", "Image identifier") do |image_id| - options[:image_id] = image_id - end - - options[:ssh_username] = nil - opts.on("--ssh_user USER", "SSH user name") do |username| - options[:ssh_username] = username - end - - options[:bootstrap_template] = nil - opts.on("--bootstrap_template TEMPLATE", "Bootstrap template") do |template| - options[:bootstrap_template] = template - end - - options[:no_bootstrap_template] = false - opts.on("--no_bootstrap_template", "Do not specify bootstrap template") do - options[:no_bootstrap_template] = true - end - + parser.recognize_option_value(:provider, 'image') + parser.recognize_option_value(:image_id, 'image') + parser.recognize_option_value(:ssh_username, 'image') + parser.recognize_option_value(:bootstrap_template, 'image') + parser.recognize_option_value(:no_bootstrap_template, 'image', type: :switch, switch_value: true, default: false) end end diff --git a/devops-client/lib/devops-client/options/project_options.rb b/devops-client/lib/devops-client/options/project_options.rb index 34fdcca..8e25aa2 100644 --- a/devops-client/lib/devops-client/options/project_options.rb +++ b/devops-client/lib/devops-client/options/project_options.rb @@ -25,93 +25,68 @@ class ProjectOptions < CommonOptions end def create_options - self.options do |opts, options| - opts.banner << self.create_banner - options[:groups] = nil - opts.on("--groups GROUP_1,GROUP_2...", I18n.t("options.project.create.groups")) do |groups| + self.options do |parser, options| + parser.banner << self.create_banner + + parser.recognize_option_value(:groups, 'project', variable: 'GROUP_1,GROUP_2...') do |groups| options[:groups] = groups.split(",") end - options[:identifier] = nil - opts.on("--deploy_env DEPLOY_ID", I18n.t("options.project.create.deploy_env")) do |identifier| - options[:identifier] = identifier - end - - options[:file] = nil - opts.on("-f", "--file FILE", I18n.t("options.project.create.file")) do |file| + parser.recognize_option_value(:file, 'project') do |file| abort("File '#{file}' does not exist") unless File.exist?(file) options[:file] = file end - options[:subnets] = nil - opts.on("--subnets SUBNET,SUBNET...", I18n.t("options.project.create.subnets")) do |subnet| - options[:subnets] = subnet.split(",") + parser.recognize_option_value(:subnets, 'project', variable: 'SUBNET_1,SUBNET_2...') do |subnets| + options[:subnets] = subnets.split(",") end - options[:flavor] = nil - opts.on("--flavor FLAVOR", I18n.t("options.project.create.flavor")) do |flavor| - options[:flavor] = flavor - end - - options[:image] = nil - opts.on("--image IMAGE_ID", I18n.t("options.project.create.image")) do |image| - options[:image] = image - end - - options[:run_list] = nil - opts.on("--run_list RUN_LIST", I18n.t("options.project.create.run_list")) do |run_list| - options[:run_list] = run_list - end - - options[:users] = nil - opts.on("--users USER,USER...", I18n.t("options.project.create.users")) do |users| + parser.recognize_option_value(:users, 'project', variable: 'USER_1,USER_2...') do |users| options[:users] = Set.new(users.split(",")) end - options[:provider] = nil - opts.on("--provider PROVIDER", I18n.t("options.project.create.provider")) do |provider| - options[:provider] = provider - end + parser.recognize_option_value(:deploy_env, 'project', option_key: :identifier) + parser.recognize_option_value(:flavor, 'project') + parser.recognize_option_value(:image, 'project') + parser.recognize_option_value(:run_list, 'project') + parser.recognize_option_value(:provider, 'project') + parser.recognize_option_value(:no_expires, 'project', type: :switch, switch_value: true, default: false) + parser.recognize_option_value(:expires, 'project') - options[:no_expires] = false - opts.on("--no_expires", I18n.t("options.project.create.no_expires")) do - options[:no_expires] = true - end - options[:expires] = nil - opts.on("--expires EXPIRES", I18n.t("options.project.create.expires")) do |e| - options[:expires] = e - end + # TODO: + # support short options names + # + # options[:file] = nil + # parser.on("-f", "--file FILE", I18n.t("options.project.create.file")) do |file| + # abort("File '#{file}' does not exist") unless File.exist?(file) + # options[:file] = file + # end end - end def user_add_options - self.options do |opts, options| - opts.banner << self.user_add_banner - options[:deploy_env] = nil - opts.on("--deploy_env ENV", I18n.t("options.project.user_add.deploy_env")) do |env| - options[:deploy_env] = env - end + self.options do |parser, options| + parser.banner << self.user_add_banner + + parser.recognize_option_value(:deploy_env, 'project', i18n_scope: 'user_add') end end def user_delete_options - self.options do |opts, options| - opts.banner << self.user_delete_banner - options[:deploy_env] = nil - opts.on("--deploy_env ENV", I18n.t("options.project.user_delete.deploy_env")) do |env| - options[:deploy_env] = env - end + self.options do |parser, options| + parser.banner << self.user_delete_banner + + parser.recognize_option_value(:deploy_env, 'project', i18n_scope: 'user_delete') end end def deploy_options - options do |opts, options| - opts.banner << self.deploy_banner - options[:servers] = nil - opts.on("--servers SERVERS", I18n.t("options.project.deploy.servers")) do |l| - options[:servers] = l.split(",") + options do |parser, options| + parser.banner << self.deploy_banner + + parser.recognize_option_value(:servers, 'project', i18n_scope: 'deploy') do |servers| + options[:servers] = servers.split(",") end end end diff --git a/devops-client/lib/devops-client/options/script_options.rb b/devops-client/lib/devops-client/options/script_options.rb index f1a36f9..caab4a0 100644 --- a/devops-client/lib/devops-client/options/script_options.rb +++ b/devops-client/lib/devops-client/options/script_options.rb @@ -16,10 +16,11 @@ class ScriptOptions < CommonOptions end def run_options - options do |opts, options| - opts.banner << self.delete_banner - opts.on("--params PARAMS", I18n.t("options.script.run.params")) do |p| - options[:params] = p.split(",") + options do |parser, options| + parser.banner << self.delete_banner + + parser.recognize_option_value(:params, 'script') do |params| + options[:params] = params.split(",") end end end diff --git a/devops-client/lib/devops-client/options/server_options.rb b/devops-client/lib/devops-client/options/server_options.rb index d208645..e5bfdbc 100644 --- a/devops-client/lib/devops-client/options/server_options.rb +++ b/devops-client/lib/devops-client/options/server_options.rb @@ -22,117 +22,130 @@ class ServerOptions < CommonOptions end def delete_options - options do |opts, options| - opts.banner << self.delete_banner - options[:key] = "node" - opts.on('--instance', "Delete node by instance id") do - options[:key] = "instance" - end + options do |parser, options| + parser.banner << self.delete_banner + + parser.recognize_option_value(:instance, 'server', + type: :switch, + default: 'node', + switch_value: 'instance', + option_key: :key, + i18n_scope: 'delete' + ) + + parser.recognize_option_value(:no_ask, 'server', + type: :switch, + default: false, + switch_value: true, + i18n_scope: 'delete' + ) - options[:no_ask] = false - opts.on("--no_ask", "Don't ask for permission for server deletion") do - options[:no_ask] = true - end end end def pause_options - options do |opts, options| - opts.banner << self.delete_banner - options[:key] = "node" - opts.on('--instance', "Pause server by instance id") do - options[:key] = "instance" - end + options do |parser, options| + parser.banner << self.delete_banner + + parser.recognize_option_value(:instance, 'server', + type: :switch, + default: 'node', + switch_value: 'instance', + option_key: :key, + i18n_scope: 'pause' + ) end end def unpause_options - options do |opts, options| - opts.banner << self.delete_banner - options[:key] = "node" - opts.on('--instance', "Unpause server by instance id") do - options[:key] = "instance" - end + options do |parser, options| + parser.banner << self.delete_banner + + parser.recognize_option_value(:instance, 'server', + type: :switch, + default: 'node', + switch_value: 'instance', + option_key: :key, + i18n_scope: 'unpause' + ) end end def reserve_options - options do |opts, options| - opts.banner << self.delete_banner - options[:key] = "node" - opts.on('--instance', "Reserve server by instance id") do - options[:key] = "instance" - end + options do |parser, options| + parser.banner << self.delete_banner + + parser.recognize_option_value(:instance, 'server', + type: :switch, + default: 'node', + switch_value: 'instance', + option_key: :key, + i18n_scope: 'reserve' + ) end end def unreserve_options - options do |opts, options| - opts.banner << self.delete_banner - options[:key] = "node" - opts.on('--instance', "Unreserve server by instance id") do - options[:key] = "instance" - end + options do |parser, options| + parser.banner << self.delete_banner + + parser.recognize_option_value(:instance, 'server', + type: :switch, + default: 'node', + switch_value: 'instance', + option_key: :key, + i18n_scope: 'unreserve' + ) end end def create_options - options do |opts, options| - opts.banner << self.create_banner - opts.on('--without-bootstrap', "Run server without bootsraping phase") do - options[:without_bootstrap] = true - end - -=begin - opts.on('--public-ip', "Associate public IP with server") do - options[:public_ip] = true - end -=end - - opts.on("-N", "--name NAME", "Set node name") do |n| - options[:name] = n - end - - opts.on("-G", "--groups X,Y,Z", "The security groups for this server") do |g| - options[:groups] = g.split(",") - end - - opts.on("-f", "--force", "Cancel rollback operation on error") do |f| - options[:force] = true - end - - opts.on("--key KEY", "Use another key for the server") do |k| - options[:key] = k + options do |parser, options| + parser.banner << self.create_banner + + parser.recognize_option_value('without-bootstrap', 'server', + type: :switch, + switch_value: true, + option_key: :without_bootstrap, + i18n_scope: 'create' + ) + + parser.recognize_option_value(:name, 'server', short: '-N', i18n_scope: 'create') + parser.recognize_option_value(:force, 'server', short: '-f', i18n_scope: 'create') + parser.recognize_option_value(:key, 'server', i18n_scope: 'create') + + parser.recognize_option_value(:groups, 'server', + short: '-G', + variable: 'GROUP_1,GROUP_2...', + i18n_scope: 'create' + ) do |groups| + options[:groups] = groups.split(",") end + # it was disabled somewhy + # parser.on('--public-ip', "Associate public IP with server") do + # options[:public_ip] = true + # end end end def bootstrap_options - options do |opts, options| - opts.banner << self.bootstrap_banner + options do |parser, options| + parser.banner << self.bootstrap_banner - opts.on("-N", "--name NAME", "Set chef name") do |n| - options[:name] = n - end - - opts.on("--bootstrap_template TEMPLATE", "Bootstrap template") do |template| - options[:bootstrap_template] = template - end - - opts.on("--run_list LIST", "Comma separated list like 'role[my_role],recipe[my_recipe]'") do |list| + parser.recognize_option_value(:name, 'server', short: '-N', i18n_scope: 'bootstrap') + parser.recognize_option_value(:bootstrap_template, 'server', i18n_scope: 'bootstrap') + parser.recognize_option_value(:run_list, 'server', i18n_scope: 'bootstrap') do |list| options[:run_list] = list.split(",") end end end def add_options - options do |opts, options| - opts.banner << self.add_banner + options do |parser, options| + parser.banner << self.add_banner - opts.on('--public-ip PUBLIC_IP', "Specify public IP for the server") do |ip| - options[:public_ip] = ip - end + parser.recognize_option_value('public-ip', 'server', i18n_scope: 'add', option_key: :public_ip) end end diff --git a/devops-client/lib/devops-client/options/user_options.rb b/devops-client/lib/devops-client/options/user_options.rb index 5b23460..e224431 100644 --- a/devops-client/lib/devops-client/options/user_options.rb +++ b/devops-client/lib/devops-client/options/user_options.rb @@ -15,14 +15,10 @@ class UserOptions < CommonOptions end def create_options - self.options do |opts, options| - opts.banner << self.create_banner - - options[:new_password] = nil - opts.on("--password PASSWORD", "New user password") do |p| - options[:new_password] = p - end + self.options do |parser, options| + parser.banner << self.create_banner + parser.recognize_option_value(:new_password, 'user') end end diff --git a/devops-client/locales/en.yml b/devops-client/locales/en.yml index d1ce9e7..1ac1eeb 100644 --- a/devops-client/locales/en.yml +++ b/devops-client/locales/en.yml @@ -269,3 +269,70 @@ en: script: run: params: "Script arguments (comma separated list)" + descriptions: + deploy: + tag: 'Tag names, comma separated list' + image: + provider: Image provider + image_id: Image identifier + ssh_username: SSH user name + bootstrap_template: Bootstrap template + no_bootstrap_template: Do not specify bootstrap template + project: + groups: "Security groups (comma separated list)" + deploy_env: "Deploy environment identifier" + file: "File in JSON with project settings" + subnets: "Subnets identifiers for deploy environment (ec2 - only one subnet, openstack - comma separated list)" + flavor: "Specify flavor for the project environment" + image: "Specify image identifier for the project environment" + run_list: "Additional recipes and roles (comma separated), like recipe[mycookbook::myrecipe],role[myrole]" + users: "Users list (comma separated) for deploy environment control" + provider: "Provider - 'ec2' or 'openstack'" + no_expires: "Without expiry time" + expires: "Expiry time (5m, 3h, 2d, 1w, etc)" + user_add: + deploy_env: "Add user to deploy environment" + user_delete: + deploy_env: "Delete user from deploy environment" + deploy: + servers: "Servers list (comma separated) for deploy" + script: + params: Script arguments (comma separated list) + server: + delete: + instance: Delete node by instance id + no_ask: Don't ask for permission for server deletion + pause: + instance: Pause server by instance id + unpause: + instance: Unpause server by instance id + reserve: + instance: Reserve server by instance id + unreserve: + instance: Unreserve server by instance id + create: + without-bootstrap: 'Run server without bootsraping phase' + name: Set node name + groups: The security groups for this server + force: Cancel rollback operation on error + key: User another key for server + bootstrap: + name: Set chef name + bootstrap_template: Bootstrap template + run_list: "Comma separated list like 'role[my_role],recipe[my_recipe]'" + add: + public-ip: 'Specify public IP for the server' + stack: + provider: Stack provider + id: Stack id + deploy_env: Deploy env + project: Stack project + stack_template: Stack template + parameters: Parameters hash as single quoted JSON string + stack_template: + provider: Stack template provider + id: Stack template id + template_file: Stack template file + user: + new_password: New user password +