Compare commits
No commits in common. "1841982268b4f8288d05f64c6cb3f9361f0b8b26" and "04eac802666661e53d700c69dbc2c34635148804" have entirely different histories.
1841982268
...
04eac80266
@ -12,12 +12,14 @@ module DevopsClient
|
|||||||
DEVOPS_HOME = "#{ENV["HOME"]}/.devops/"
|
DEVOPS_HOME = "#{ENV["HOME"]}/.devops/"
|
||||||
# properties file key=value
|
# properties file key=value
|
||||||
@@config_file = File.join(DEVOPS_HOME, "devops-client.conf")
|
@@config_file = File.join(DEVOPS_HOME, "devops-client.conf")
|
||||||
|
#CONFIG_FILE="#{ENV["HOME"]}/.devops/devops-client.conf"
|
||||||
|
|
||||||
def self.config_file
|
def self.config_file
|
||||||
@@config_file
|
@@config_file
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.run
|
def self.run
|
||||||
|
|
||||||
DevopsClient::get_config_file_option
|
DevopsClient::get_config_file_option
|
||||||
config = DevopsClient::read_config(@@config_file)
|
config = DevopsClient::read_config(@@config_file)
|
||||||
|
|
||||||
@ -53,7 +55,7 @@ module DevopsClient
|
|||||||
puts e.message
|
puts e.message
|
||||||
exit(11)
|
exit(11)
|
||||||
rescue NotFound => e
|
rescue NotFound => e
|
||||||
puts e.message
|
puts "Not found: #{e.message}"
|
||||||
exit(12)
|
exit(12)
|
||||||
rescue InvalidQuery => e
|
rescue InvalidQuery => e
|
||||||
puts "Invalid query: #{e.message}"
|
puts "Invalid query: #{e.message}"
|
||||||
@ -107,7 +109,7 @@ module DevopsClient
|
|||||||
|
|
||||||
def self.set_default_config file
|
def self.set_default_config file
|
||||||
locales = I18n.locales
|
locales = I18n.locales
|
||||||
config = {:api => "v3", :locale => "en"}
|
config = {:api => "v2.0", :locale => "en"}
|
||||||
I18n.language = config[:locale]
|
I18n.language = config[:locale]
|
||||||
puts I18n.t("log.warn", :msg => I18n.t("config.not_exist", :file => file))
|
puts I18n.t("log.warn", :msg => I18n.t("config.not_exist", :file => file))
|
||||||
config[:locale] = begin
|
config[:locale] = begin
|
||||||
|
|||||||
@ -0,0 +1,29 @@
|
|||||||
|
require "devops-client/handler/handler"
|
||||||
|
require "devops-client/options/bootstrap_templates_options"
|
||||||
|
require "json"
|
||||||
|
require "devops-client/output/bootstrap_templates"
|
||||||
|
|
||||||
|
class BootstrapTemplates < Handler
|
||||||
|
|
||||||
|
output_with Output::BootstrapTemplates
|
||||||
|
|
||||||
|
def initialize(host, def_options={})
|
||||||
|
@host, @options = host, def_options
|
||||||
|
@options_parser = BootstrapTemplatesOptions.new(ARGV, def_options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle
|
||||||
|
case ARGV[1]
|
||||||
|
when "list"
|
||||||
|
@options, @args = @options_parser.parse_options_for!(:list)
|
||||||
|
list_handler
|
||||||
|
output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def list_handler
|
||||||
|
@list = get("/templates")
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
@ -1,232 +0,0 @@
|
|||||||
require "devops-client/handler/handler"
|
|
||||||
require "devops-client/handler/helpers/validators"
|
|
||||||
require "devops-client/options/category_options"
|
|
||||||
require "set"
|
|
||||||
require "devops-client/output/category"
|
|
||||||
|
|
||||||
class Category < Handler
|
|
||||||
|
|
||||||
output_with Output::Category
|
|
||||||
|
|
||||||
def initialize(host, def_options={})
|
|
||||||
@host = host
|
|
||||||
@options = def_options
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle
|
|
||||||
@options_parser = CategoryOptions.new(ARGV, @options)
|
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
|
||||||
extract_parameters
|
|
||||||
case @command
|
|
||||||
when :create
|
|
||||||
create_handler
|
|
||||||
when :delete
|
|
||||||
delete_handler
|
|
||||||
when :deploy
|
|
||||||
deploy_handler
|
|
||||||
when :list
|
|
||||||
list_handler
|
|
||||||
output(project: @project_id, env: @environment)
|
|
||||||
when :servers_list
|
|
||||||
servers_handler
|
|
||||||
output(project: @project_id, env: @environment)
|
|
||||||
when :stacks
|
|
||||||
stacks_handler
|
|
||||||
output
|
|
||||||
when :set_run_list
|
|
||||||
set_run_list_handler
|
|
||||||
when :show
|
|
||||||
show_handler
|
|
||||||
output(project: @project_id, env: @environment, cat: @category)
|
|
||||||
when :update
|
|
||||||
update_handler
|
|
||||||
when :servers_delete
|
|
||||||
delete_servers_handler
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def list_handler
|
|
||||||
@list = get "/project/#{@project_id}/environment/#{@environment}/categories"
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_handler
|
|
||||||
delete "/project/#{@project_id}/environment/#{@environment}/category/#{@category}" if question(I18n.t("handler.category.question.delete", env: @environment, cat: @category, project: @project_id))
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_handler
|
|
||||||
@show = get("/project/#{@project_id}/environment/#{@environment}/category/#{@category}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_handler args
|
|
||||||
r = inspect_parameters @options_parser.update_params, args[2], args[3]
|
|
||||||
unless r.nil?
|
|
||||||
@options_parser.invalid_update_command
|
|
||||||
abort(r)
|
|
||||||
end
|
|
||||||
update_object_from_file "project", args[2], args[3]
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_handler
|
|
||||||
file = self.options[:file]
|
|
||||||
json = nil
|
|
||||||
unless file.nil?
|
|
||||||
json = File.read(file)
|
|
||||||
begin
|
|
||||||
JSON.parse(json)
|
|
||||||
rescue JSON::ParserError => e
|
|
||||||
abort(I18n.t("handler.category.create.invalid_json", :file => file))
|
|
||||||
end
|
|
||||||
else
|
|
||||||
cat = create_category
|
|
||||||
json = JSON.pretty_generate(cat)
|
|
||||||
end
|
|
||||||
post_body("/project/#{@project_id}/environment/#{@environment}/category", json) if question(I18n.t("handler.category.question.create")){puts json}
|
|
||||||
end
|
|
||||||
|
|
||||||
def servers_handler
|
|
||||||
@list = get "/project/#{@project_id}/environment/#{@environment}/servers"
|
|
||||||
end
|
|
||||||
|
|
||||||
def stacks_handler
|
|
||||||
@list = get "/project/#{@project_id}/environment/#{@environment}/stacks"
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_run_list_handler
|
|
||||||
run_list = @run_list || []
|
|
||||||
if run_list.empty?
|
|
||||||
exit unless question(I18n.t("handler.project.question.run_list.empty"))
|
|
||||||
else
|
|
||||||
exit unless Validators.validate_run_list(run_list)
|
|
||||||
end
|
|
||||||
|
|
||||||
post "/project/#{@project_id}/environment/#{@environment}/run_list", run_list
|
|
||||||
end
|
|
||||||
|
|
||||||
def deploy_handler args
|
|
||||||
q = {}
|
|
||||||
q[:servers] = options[:servers] unless options[:servers].nil?
|
|
||||||
job_ids = post "/project/#{args[2]}/deploy", q
|
|
||||||
reports_urls(job_ids)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_handler args
|
|
||||||
r = inspect_parameters @options_parser.test_params, args[2], args[3]
|
|
||||||
unless r.nil?
|
|
||||||
@options_parser.invalid_test_command
|
|
||||||
abort(r)
|
|
||||||
end
|
|
||||||
job_ids = post "/project/test/#{args[2]}/#{args[3]}"
|
|
||||||
reports_urls(job_ids)
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
def get_project_info_obj project_id
|
|
||||||
get("/project/#{project_id}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_category
|
|
||||||
cat = {id: @category, provider: {}, cm_tool: {}}
|
|
||||||
|
|
||||||
case (self.options[:provider] || resources_selector.select_available_provider)
|
|
||||||
when 'static'
|
|
||||||
create_static_category_provider(cat[:provider])
|
|
||||||
when 'aws'
|
|
||||||
create_aws_category_provider(cat[:provider])
|
|
||||||
end
|
|
||||||
fill_configuration_manager_tool(cat[:cm_tool])
|
|
||||||
cat
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_static_category_provider cat_provider
|
|
||||||
fill_category_provider("static", cat_provider)
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_aws_category_provider cat_provider
|
|
||||||
fill_category_provider("aws", cat_provider)
|
|
||||||
cat_provider[:type] = choose_item_from_list(I18n.t('headers.category_type'), %w(server stack))
|
|
||||||
if cat_provider[:type] == 'server'
|
|
||||||
fill_category_cloud_provider cat_provider do
|
|
||||||
cat_provider[:vpc_id] = self.options[:vpc_id] || resources_selector.select_available_vpc(provider: cat_provider[:name], account: cat_provider[:account])
|
|
||||||
cat_provider[:subnet] = self.options[:subnet] || resources_selector.select_available_network(provider: cat_provider[:name], account: cat_provider[:account], vpc_id: cat_provider[:vpc_id])
|
|
||||||
end
|
|
||||||
else
|
|
||||||
cat_provider[:stack_template] = self.options[:stack_template] || resources_selector.select_available_stack_template(provider: 'aws')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def fill_category_provider provider_name, cat_provider
|
|
||||||
cat_provider[:name] = provider_name
|
|
||||||
cat_provider[:account] = self.options[:account] || resources_selector.select_available_provider_account(cat_provider[:name])["account_name"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def fill_category_cloud_provider cat_provider
|
|
||||||
cat_provider[:flavor] = self.options[:flavor] || resources_selector.select_available_flavor(provider: cat_provider[:name], account: cat_provider[:account])
|
|
||||||
cat_provider[:image] = self.options[:image] || resources_selector.select_available_image(provider: cat_provider[:name], account: cat_provider[:account])
|
|
||||||
yield
|
|
||||||
cat_provider[:security_groups] = self.options[:security_groups] || resources_selector.select_available_security_groups(provider: cat_provider[:name], account: cat_provider[:account], vpc_id: cat_provider[:vpc_id])
|
|
||||||
#TODO cat_provider[:stack_template] = self.options[:stack_template] || resources_selector.select_available_stack_template(provider: cat_provider[:name], account: cat_provider[:account])
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_identifier d, names
|
|
||||||
set_parameter d, :id do
|
|
||||||
begin
|
|
||||||
n = enter_parameter I18n.t("handler.environment.create.id") + ": "
|
|
||||||
if names.include?(n)
|
|
||||||
puts I18n.t("handler.environment.create.id_exists", :env => n)
|
|
||||||
raise ArgumentError
|
|
||||||
else
|
|
||||||
names.push n
|
|
||||||
n
|
|
||||||
end
|
|
||||||
rescue ArgumentError
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_parameter obj, key
|
|
||||||
if self.options[key].nil?
|
|
||||||
obj[key] = yield
|
|
||||||
else
|
|
||||||
obj[key] = self.options[key]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def data_to_output
|
|
||||||
@list || @show || @test
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_servers_handler
|
|
||||||
ask_for_delete_servers(@project_id, @environment)
|
|
||||||
body = {
|
|
||||||
dry_run: false
|
|
||||||
}
|
|
||||||
response = post("/project/#{@project_id}/environment/#{@environment}/servers/delete", body)
|
|
||||||
reports_urls(response['reports'])
|
|
||||||
end
|
|
||||||
|
|
||||||
def fill_configuration_manager_tool tool
|
|
||||||
tool[:name] = "chef"
|
|
||||||
tool[:bootstrap_template] = self.options[:bootstrap_template] || resources_selector.select_available_bootstrap_template
|
|
||||||
tool[:chef_env] = enter_parameter(I18n.t('handler.category.create.chef_env'))
|
|
||||||
end
|
|
||||||
private
|
|
||||||
|
|
||||||
def ask_for_delete_servers(project, env)
|
|
||||||
body = {
|
|
||||||
dry_run: true
|
|
||||||
}
|
|
||||||
to_delete = post("/project/#{project}/environment/#{env}/servers/delete", body)
|
|
||||||
if to_delete.empty?
|
|
||||||
abort "There are no servers to delete."
|
|
||||||
else
|
|
||||||
puts "Servers to delete:\n----\n"
|
|
||||||
puts to_delete.join("\n")
|
|
||||||
puts '----'
|
|
||||||
end
|
|
||||||
if @options[:dry_run] || !question('Are you sure to delete them')
|
|
||||||
abort
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
require "devops-client/handler/handler"
|
|
||||||
require "devops-client/options/chef_options"
|
|
||||||
require "json"
|
|
||||||
require "devops-client/output/chef"
|
|
||||||
|
|
||||||
class Chef < Handler
|
|
||||||
|
|
||||||
output_with Output::Chef
|
|
||||||
|
|
||||||
def initialize(host, def_options={})
|
|
||||||
@host, @options = host, def_options
|
|
||||||
@options_parser = ChefOptions.new(ARGV, def_options)
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle
|
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
|
||||||
extract_parameters
|
|
||||||
case @command
|
|
||||||
when :bootstrap_templates
|
|
||||||
bootstrap_templates_handler
|
|
||||||
when :tags_list
|
|
||||||
tags_list_handler
|
|
||||||
end
|
|
||||||
output
|
|
||||||
end
|
|
||||||
|
|
||||||
def bootstrap_templates_handler
|
|
||||||
@list = get("/chef/bootstrap_templates")
|
|
||||||
end
|
|
||||||
|
|
||||||
def tags_list_handler
|
|
||||||
@list = get("/chef/tags/#{@cm_name}")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
@ -71,6 +71,14 @@ class DeployEnv
|
|||||||
d[:users] = d[:users].to_a
|
d[:users] = d[:users].to_a
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.validate_run_list run_list
|
||||||
|
return true if run_list.empty?
|
||||||
|
rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/
|
||||||
|
e = run_list.select {|l| (rl =~ l).nil?}
|
||||||
|
res = e.empty?
|
||||||
|
puts I18n.t("handler.project.create.run_list.invalid", :list => e.join(", ")) unless res
|
||||||
|
res
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|||||||
@ -1,239 +0,0 @@
|
|||||||
require "devops-client/handler/handler"
|
|
||||||
require "devops-client/handler/helpers/validators"
|
|
||||||
require "devops-client/options/environment_options"
|
|
||||||
require "set"
|
|
||||||
require "devops-client/output/environment"
|
|
||||||
|
|
||||||
class Environment < Handler
|
|
||||||
|
|
||||||
output_with Output::Environment
|
|
||||||
|
|
||||||
def initialize(host, def_options={})
|
|
||||||
@host = host
|
|
||||||
@options = def_options
|
|
||||||
@options_parser = EnvironmentOptions.new(ARGV, def_options)
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle
|
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
|
||||||
extract_parameters
|
|
||||||
case @command
|
|
||||||
when :create
|
|
||||||
create_handler
|
|
||||||
when :delete
|
|
||||||
delete_handler
|
|
||||||
when :deploy
|
|
||||||
deploy_handler
|
|
||||||
when :list
|
|
||||||
list_handler
|
|
||||||
output(project: @project_id)
|
|
||||||
when :servers_list
|
|
||||||
servers_handler
|
|
||||||
output
|
|
||||||
when :stacks
|
|
||||||
stacks_handler
|
|
||||||
output
|
|
||||||
when :set_run_list
|
|
||||||
set_run_list_handler
|
|
||||||
when :show
|
|
||||||
show_handler
|
|
||||||
output(project: @project_id, env: @environment)
|
|
||||||
when :update
|
|
||||||
update_handler
|
|
||||||
when :user_add
|
|
||||||
user_add_handler
|
|
||||||
when :user_delete
|
|
||||||
user_delete_handler
|
|
||||||
when :servers_delete
|
|
||||||
delete_servers_handler
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def list_handler
|
|
||||||
@list = get "/project/#{@project_id}/environments"
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_handler
|
|
||||||
if question(I18n.t("handler.project.question.delete", name: @environment))
|
|
||||||
delete "/project/#{@project_id}/environment/#{@environment}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_handler
|
|
||||||
@show = get("/project/#{@project_id}/environment/#{@environment}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_handler args
|
|
||||||
update_object_from_file "project", args[2], args[3]
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_handler
|
|
||||||
file = self.options[:file]
|
|
||||||
json = nil
|
|
||||||
unless file.nil?
|
|
||||||
json = File.read(file)
|
|
||||||
begin
|
|
||||||
JSON.parse(json)
|
|
||||||
rescue JSON::ParserError => e
|
|
||||||
abort(I18n.t("handler.environment.create.invalid_json", :file => file))
|
|
||||||
end
|
|
||||||
else
|
|
||||||
json = JSON.pretty_generate(create_environment)
|
|
||||||
end
|
|
||||||
post_body("/project/#{@project_id}/environment", json) if question(I18n.t("handler.environment.question.create")){puts json}
|
|
||||||
end
|
|
||||||
|
|
||||||
def servers_handler
|
|
||||||
@list = get "/project/#{@project_id}/environment/#{@environment}/servers"
|
|
||||||
end
|
|
||||||
|
|
||||||
def stacks_handler
|
|
||||||
@list = get "/project/#{@project_id}/environment/#{@environment}/stacks"
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_add_handler
|
|
||||||
project = get_project_info_obj(@project_id)
|
|
||||||
users = environment_users(project)
|
|
||||||
post "/project/#{@project_id}/environment/#{@environment}/users/add", users
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_delete_handler
|
|
||||||
post "/project/#{@project_id}/environment/#{@environment}/users/delete", @users
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_run_list_handler
|
|
||||||
run_list = @run_list || []
|
|
||||||
if run_list.empty?
|
|
||||||
exit unless question(I18n.t("handler.project.question.run_list.empty"))
|
|
||||||
else
|
|
||||||
exit unless Validators.validate_run_list(run_list)
|
|
||||||
end
|
|
||||||
|
|
||||||
post "/project/#{@project_id}/environment/#{@environment}/run_list", run_list
|
|
||||||
end
|
|
||||||
|
|
||||||
def deploy_handler args
|
|
||||||
r = inspect_parameters @options_parser.deploy_params, args[2], args[3]
|
|
||||||
unless r.nil?
|
|
||||||
@options_parser.invalid_deploy_command
|
|
||||||
abort(r)
|
|
||||||
end
|
|
||||||
q = {}
|
|
||||||
q[:servers] = options[:servers] unless options[:servers].nil?
|
|
||||||
q[:deploy_env] = args[3] unless args[3].nil?
|
|
||||||
job_ids = post "/project/#{args[2]}/deploy", q
|
|
||||||
reports_urls(job_ids)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_handler args
|
|
||||||
r = inspect_parameters @options_parser.test_params, args[2], args[3]
|
|
||||||
unless r.nil?
|
|
||||||
@options_parser.invalid_test_command
|
|
||||||
abort(r)
|
|
||||||
end
|
|
||||||
job_ids = post "/project/test/#{args[2]}/#{args[3]}"
|
|
||||||
reports_urls(job_ids)
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
def get_project_info_obj project_id
|
|
||||||
get("/project/#{project_id}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_environment
|
|
||||||
project = get_project_info_obj(@project_id)
|
|
||||||
names = project["environments"].map{|env| env["id"]}
|
|
||||||
abort(I18n.t("handler.environment.create.id_exists")) if names.include?(@environment)
|
|
||||||
e = {categories: [], id: @environment}
|
|
||||||
# set_identifier(e, names)
|
|
||||||
|
|
||||||
e[:run_list] = if self.options[:run_list]
|
|
||||||
abort("Invalid run list: '#{self.options[:run_list].join(",")}'") unless Validators.validate_run_list(self.options[:run_list])
|
|
||||||
self.options[:run_list]
|
|
||||||
else
|
|
||||||
input_run_list
|
|
||||||
end
|
|
||||||
|
|
||||||
e[:users] = environment_users(project)
|
|
||||||
|
|
||||||
unless self.options[:no_expires]
|
|
||||||
set_parameter e, :expires do
|
|
||||||
s = enter_parameter_or_empty(I18n.t("options.project.create.expires") + ": ").strip
|
|
||||||
s.empty? ? nil : s
|
|
||||||
end
|
|
||||||
end
|
|
||||||
e
|
|
||||||
end
|
|
||||||
|
|
||||||
def environment_users project
|
|
||||||
if self.options[:users]
|
|
||||||
self.options[:users]
|
|
||||||
else
|
|
||||||
if question(I18n.t("handler.project.create.question.users_choose"))
|
|
||||||
#choose
|
|
||||||
resources_selector.select_available_users(label: I18n.t("handler.project.create.users"), data: project["project_users"] + [project["owner"]])
|
|
||||||
else
|
|
||||||
#enter
|
|
||||||
get_comma_separated_list(I18n.t("input.message.input_list", cmd: I18n.t("input.user.list")))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_identifier d, names
|
|
||||||
set_parameter d, :id do
|
|
||||||
begin
|
|
||||||
n = enter_parameter I18n.t("handler.environment.create.id") + ": "
|
|
||||||
if names.include?(n)
|
|
||||||
puts I18n.t("handler.environment.create.id_exists", :env => n)
|
|
||||||
raise ArgumentError
|
|
||||||
else
|
|
||||||
names.push n
|
|
||||||
n
|
|
||||||
end
|
|
||||||
rescue ArgumentError
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_parameter obj, key
|
|
||||||
if self.options[key].nil?
|
|
||||||
obj[key] = yield
|
|
||||||
else
|
|
||||||
obj[key] = self.options[key]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def data_to_output
|
|
||||||
@list || @show || @test
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_servers_handler
|
|
||||||
ask_for_delete_servers(@project_id, @environment)
|
|
||||||
body = {
|
|
||||||
dry_run: false
|
|
||||||
}
|
|
||||||
response = post("/project/#{@project_id}/environment/#{@environment}/servers/delete", body)
|
|
||||||
reports_urls(response['reports'])
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def ask_for_delete_servers(project, env)
|
|
||||||
body = {
|
|
||||||
dry_run: true
|
|
||||||
}
|
|
||||||
to_delete = post("/project/#{project}/environment/#{env}/servers/delete", body)
|
|
||||||
if to_delete.empty?
|
|
||||||
abort "There are no servers to delete."
|
|
||||||
else
|
|
||||||
puts "Servers to delete:\n----\n"
|
|
||||||
puts to_delete.join("\n")
|
|
||||||
puts '----'
|
|
||||||
end
|
|
||||||
if @options[:dry_run] || !question('Are you sure to delete them')
|
|
||||||
abort
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -8,29 +8,57 @@ class Filter < Handler
|
|||||||
output_with Output::Filters
|
output_with Output::Filters
|
||||||
|
|
||||||
def initialize(host, def_options)
|
def initialize(host, def_options)
|
||||||
@host, @options = host, def_options
|
self.host = host
|
||||||
@options_parser = FilterOptions.new(ARGV, def_options)
|
@options_parser = FilterOptions.new(ARGV, def_options)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
case ARGV[1]
|
||||||
extract_parameters
|
when "image"
|
||||||
case @command
|
provider = ARGV[3]
|
||||||
when :image_list
|
case ARGV[2]
|
||||||
@list = get("/filter/#{@provider}/images")
|
when "list"
|
||||||
|
self.options = @options_parser.image_list_options
|
||||||
|
check_provider provider
|
||||||
|
@list = get("/filter/#{provider}/images")
|
||||||
output
|
output
|
||||||
when :image_add
|
when "add"
|
||||||
@list = post_body("/filter/#{@provider}/images/add", @image.to_json)
|
self.options = @options_parser.image_add_options
|
||||||
|
check_provider provider
|
||||||
|
@list = put_body("/filter/#{provider}/image", get_images(ARGV).to_json)
|
||||||
@list = @list["images"] unless @list.nil?
|
@list = @list["images"] unless @list.nil?
|
||||||
output
|
output
|
||||||
when :image_delete
|
when "delete"
|
||||||
if question(I18n.t("handler.filter.question.delete", :name => @image.join("', '")))
|
self.options = @options_parser.image_delete_options
|
||||||
@list = post_body("/filter/#{@provider}/images/delete", @image.to_json)
|
check_provider provider
|
||||||
|
images = get_images(ARGV)
|
||||||
|
if question(I18n.t("handler.filter.question.delete", :name => images.join("', '")))
|
||||||
|
@list = delete_body("/filter/#{provider}/image", images.to_json)
|
||||||
@list = @list["images"] unless @list.nil?
|
@list = @list["images"] unless @list.nil?
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
@options_parser.invalid_image_command
|
||||||
|
abort("Invalid image parameter: #{ARGV[2]}, it should be 'add' or 'delete' or 'list'")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_provider provider
|
||||||
|
if provider != "ec2" and provider != "openstack"
|
||||||
|
@options_parser.invalid_image_command
|
||||||
|
abort("Invalid image parameter: provider '#{provider}', it should be 'ec2' or 'openstack'")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_images args
|
||||||
|
images = args[4..-1]
|
||||||
|
if images.empty?
|
||||||
|
@options_parser.invalid_image_command
|
||||||
|
abort("Images list is empty")
|
||||||
|
end
|
||||||
|
images
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
34
devops-client/lib/devops-client/handler/flavor.rb
Normal file
34
devops-client/lib/devops-client/handler/flavor.rb
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
require "devops-client/handler/handler"
|
||||||
|
require "devops-client/options/flavor_options"
|
||||||
|
require "json"
|
||||||
|
require "devops-client/output/flavors"
|
||||||
|
|
||||||
|
class Flavor < Handler
|
||||||
|
|
||||||
|
output_with Output::Flavors
|
||||||
|
|
||||||
|
def initialize(host, def_options={})
|
||||||
|
@host, @options = host, def_options
|
||||||
|
@options_parser = FlavorOptions.new(ARGV, def_options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle
|
||||||
|
case ARGV[1]
|
||||||
|
when "list"
|
||||||
|
@options, @args = @options_parser.parse_options_for!(:list)
|
||||||
|
list_handler
|
||||||
|
output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def list_handler(provider=nil)
|
||||||
|
provider ||= @args[2]
|
||||||
|
r = inspect_parameters @options_parser.list_params, provider
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_list_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
@list = get("/flavors/#{provider}").sort!{|x,y| x["id"] <=> y["id"]}
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
35
devops-client/lib/devops-client/handler/group.rb
Normal file
35
devops-client/lib/devops-client/handler/group.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
require "devops-client/handler/handler"
|
||||||
|
require "devops-client/options/group_options"
|
||||||
|
require "json"
|
||||||
|
require "devops-client/output/groups"
|
||||||
|
|
||||||
|
class Group < Handler
|
||||||
|
|
||||||
|
output_with Output::Groups
|
||||||
|
|
||||||
|
def initialize(host, def_options={})
|
||||||
|
@host, @options = host, def_options
|
||||||
|
@options_parser = GroupOptions.new(ARGV, def_options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle
|
||||||
|
case ARGV[1]
|
||||||
|
when "list"
|
||||||
|
@options, @args = @options_parser.parse_options_for!(:list)
|
||||||
|
list_handler(@args[2], @args[3])
|
||||||
|
output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def list_handler(provider=nil, vpc_id=nil)
|
||||||
|
r = inspect_parameters @options_parser.list_params, provider
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_list_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
p = {}
|
||||||
|
p["vpc-id"] = vpc_id unless vpc_id.nil?
|
||||||
|
@list = get("/groups/#{provider}", p)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@ -23,7 +23,7 @@ class Handler
|
|||||||
|
|
||||||
attr_reader :options
|
attr_reader :options
|
||||||
attr_writer :host
|
attr_writer :host
|
||||||
attr_accessor :auth, :command
|
attr_accessor :auth
|
||||||
|
|
||||||
def host
|
def host
|
||||||
if @host.start_with?('http')
|
if @host.start_with?('http')
|
||||||
@ -35,11 +35,11 @@ class Handler
|
|||||||
|
|
||||||
#TODO: only basic auth now
|
#TODO: only basic auth now
|
||||||
def username
|
def username
|
||||||
self.auth[:username]
|
self.options[:username] || self.auth[:username]
|
||||||
end
|
end
|
||||||
|
|
||||||
def password
|
def password
|
||||||
self.auth[:password]
|
self.options[:password] || self.auth[:password]
|
||||||
end
|
end
|
||||||
|
|
||||||
def options= o
|
def options= o
|
||||||
@ -57,36 +57,13 @@ protected
|
|||||||
@fetcher ||= Helpers::ResourcesFetcher.new(host: @host, handler_options: @options, auth: @auth)
|
@fetcher ||= Helpers::ResourcesFetcher.new(host: @host, handler_options: @options, auth: @auth)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Parameters
|
|
||||||
# PARAM - mandatory parameter, will be available by variable @param
|
def inspect_parameters names, *args
|
||||||
# [PARAM] - not mandatory parameter, will be available by variable @param (can be nil)
|
|
||||||
# PARAM... - mandatory parameters, will be available by variable @param, it is array with one or more elements
|
|
||||||
# [PARAM...] - not mandatory parameters, will be available by variable @param, it is array with one or more elements or nil
|
|
||||||
def extract_parameters
|
|
||||||
cmd = @command
|
|
||||||
names = @options_parser.send("#{cmd}_params")
|
|
||||||
return unless names
|
|
||||||
names.each_with_index do |name, i|
|
names.each_with_index do |name, i|
|
||||||
if name.start_with? "[" and name.end_with? "]"
|
next if name.start_with? "[" and name.end_with? "]"
|
||||||
param_name = name.delete("[]")
|
if args[i].nil? or args[i].empty?
|
||||||
if param_name.end_with? "..."
|
return "\n" + I18n.t("handler.error.parameter.undefined", :name => name)
|
||||||
param_name = param_name.delete(".")
|
|
||||||
instance_variable_set "@" + param_name.downcase, @args[i..-1]
|
|
||||||
return
|
|
||||||
end
|
|
||||||
elsif name.end_with? "..."
|
|
||||||
param_name = name.delete(".")
|
|
||||||
instance_variable_set "@" + param_name.downcase, @args[i..-1]
|
|
||||||
return
|
|
||||||
else
|
|
||||||
if @args[i].nil? or @args[i].empty?
|
|
||||||
@options_parser.send("invalid_#{cmd}_command")
|
|
||||||
res = "\n" + I18n.t("handler.error.parameter.undefined", :name => name)
|
|
||||||
abort(res)
|
|
||||||
end
|
|
||||||
param_name = name
|
|
||||||
end
|
end
|
||||||
instance_variable_set "@" + param_name.downcase, @args[i]
|
|
||||||
end
|
end
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
@ -101,4 +78,8 @@ protected
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def current_command
|
||||||
|
ARGV[1].to_sym if ARGV[1]
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,55 +1,57 @@
|
|||||||
require "devops-client/options/main"
|
|
||||||
|
|
||||||
class HandlerFactory
|
class HandlerFactory
|
||||||
|
|
||||||
def self.create cmd, host, auth, def_options
|
def self.create cmd, host, auth, def_options
|
||||||
klass = case cmd
|
klass = case cmd
|
||||||
when ImageOptions::COMMAND_NAME
|
when "flavor"
|
||||||
|
require "devops-client/handler/flavor"
|
||||||
|
Flavor
|
||||||
|
when "image"
|
||||||
require "devops-client/handler/image"
|
require "devops-client/handler/image"
|
||||||
Image
|
Image
|
||||||
when FilterOptions::COMMAND_NAME
|
when "filter"
|
||||||
require "devops-client/handler/filter"
|
require "devops-client/handler/filter"
|
||||||
Filter
|
Filter
|
||||||
when DeployOptions::COMMAND_NAME
|
when "group"
|
||||||
|
require "devops-client/handler/group"
|
||||||
|
Group
|
||||||
|
when "deploy"
|
||||||
require "devops-client/handler/deploy"
|
require "devops-client/handler/deploy"
|
||||||
Deploy
|
Deploy
|
||||||
when ProjectOptions::COMMAND_NAME
|
when "project"
|
||||||
require "devops-client/handler/project"
|
require "devops-client/handler/project"
|
||||||
Project
|
Project
|
||||||
when EnvironmentOptions::COMMAND_NAME
|
when "network"
|
||||||
require "devops-client/handler/environment"
|
require "devops-client/handler/network"
|
||||||
Environment
|
Network
|
||||||
when CategoryOptions::COMMAND_NAME
|
when "key"
|
||||||
require "devops-client/handler/category"
|
|
||||||
Category
|
|
||||||
when KeyOptions::COMMAND_NAME
|
|
||||||
require "devops-client/handler/key"
|
require "devops-client/handler/key"
|
||||||
Key
|
Key
|
||||||
when UserOptions::COMMAND_NAME
|
when "user"
|
||||||
require "devops-client/handler/user"
|
require "devops-client/handler/user"
|
||||||
User
|
User
|
||||||
when ProviderOptions::COMMAND_NAME
|
when "provider"
|
||||||
require "devops-client/handler/provider"
|
require "devops-client/handler/provider"
|
||||||
Provider
|
Provider
|
||||||
when ServerOptions::COMMAND_NAME
|
when "tag"
|
||||||
|
require "devops-client/handler/tag"
|
||||||
|
Tag
|
||||||
|
when "server"
|
||||||
require "devops-client/handler/server"
|
require "devops-client/handler/server"
|
||||||
Server
|
Server
|
||||||
when ScriptOptions::COMMAND_NAME
|
when "script"
|
||||||
require "devops-client/handler/script"
|
require "devops-client/handler/script"
|
||||||
Script
|
Script
|
||||||
when ChefOptions::COMMAND_NAME
|
when "templates"
|
||||||
require "devops-client/handler/chef"
|
require "devops-client/handler/bootstrap_templates"
|
||||||
Chef
|
BootstrapTemplates
|
||||||
when StackTemplateOptions::COMMAND_NAME
|
when "stack_template"
|
||||||
require "devops-client/handler/stack_template"
|
require "devops-client/handler/stack_template"
|
||||||
StackTemplate
|
StackTemplate
|
||||||
when StackOptions::COMMAND_NAME
|
when "stack"
|
||||||
require "devops-client/handler/stack"
|
require "devops-client/handler/stack"
|
||||||
Stack
|
Stack
|
||||||
when RoleOptions::COMMAND_NAME
|
|
||||||
require "devops-client/handler/role"
|
|
||||||
Role
|
|
||||||
else
|
else
|
||||||
|
require "devops-client/options/main"
|
||||||
Main.new(ARGV, def_options).info
|
Main.new(ARGV, def_options).info
|
||||||
exit(10)
|
exit(10)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -9,7 +9,7 @@ module HttpUtils
|
|||||||
end
|
end
|
||||||
|
|
||||||
def get path, params={}
|
def get path, params={}
|
||||||
get_with_headers path, params, headers()
|
get_with_headers path, params, self.headers("Content-Type")
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_with_headers path, params={}, headers={}
|
def get_with_headers path, params={}, headers={}
|
||||||
@ -108,9 +108,6 @@ module HttpUtils
|
|||||||
return (res.contenttype.include?("application/json") ? JSON.parse(res.body) : res.body)
|
return (res.contenttype.include?("application/json") ? JSON.parse(res.body) : res.body)
|
||||||
end
|
end
|
||||||
case res.status
|
case res.status
|
||||||
when 422
|
|
||||||
puts res.body
|
|
||||||
raise InvalidQuery.new(extract_message(res))
|
|
||||||
when 404
|
when 404
|
||||||
raise NotFound.new(extract_message(res))
|
raise NotFound.new(extract_message(res))
|
||||||
when 400
|
when 400
|
||||||
@ -168,4 +165,4 @@ module HttpUtils
|
|||||||
r
|
r
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -1,5 +1,3 @@
|
|||||||
require "devops-client/handler/helpers/validators"
|
|
||||||
|
|
||||||
module InputUtils
|
module InputUtils
|
||||||
|
|
||||||
def question str
|
def question str
|
||||||
@ -10,7 +8,7 @@ module InputUtils
|
|||||||
res = false
|
res = false
|
||||||
#system("stty raw -echo")
|
#system("stty raw -echo")
|
||||||
begin
|
begin
|
||||||
print "#{str}? (y/n): "
|
print "#{str} (y/n): "
|
||||||
s = STDIN.gets.strip
|
s = STDIN.gets.strip
|
||||||
if s == "y"
|
if s == "y"
|
||||||
res = true
|
res = true
|
||||||
@ -27,17 +25,6 @@ module InputUtils
|
|||||||
res
|
res
|
||||||
end
|
end
|
||||||
|
|
||||||
def input_run_list
|
|
||||||
begin
|
|
||||||
run_list = get_comma_separated_list(I18n.t("input.run_list.label") + ": ")
|
|
||||||
raise ArgumentError.new(I18n.t("input.run_list.invalid", list: run_list.join(","))) unless Validators.validate_run_list(run_list)
|
|
||||||
run_list
|
|
||||||
rescue ArgumentError => e
|
|
||||||
puts e.message
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def choose_image_cmd images, t=nil
|
def choose_image_cmd images, t=nil
|
||||||
abort(I18n.t("handler.error.list.empty", :name => "Image")) if images.empty?
|
abort(I18n.t("handler.error.list.empty", :name => "Image")) if images.empty?
|
||||||
if options[:image_id].nil?
|
if options[:image_id].nil?
|
||||||
@ -97,7 +84,7 @@ module InputUtils
|
|||||||
puts table
|
puts table
|
||||||
end
|
end
|
||||||
begin
|
begin
|
||||||
print "#{I18n.t("handler.message.choose", :name => title.downcase)}: "
|
print "#{title}: "
|
||||||
buf = STDIN.gets.strip
|
buf = STDIN.gets.strip
|
||||||
if buf.empty? and !default.nil?
|
if buf.empty? and !default.nil?
|
||||||
return default
|
return default
|
||||||
@ -109,10 +96,6 @@ module InputUtils
|
|||||||
return i - 1
|
return i - 1
|
||||||
end
|
end
|
||||||
|
|
||||||
def choose_item_from_list(title, items)
|
|
||||||
items[ choose_number_from_list(title, items) ]
|
|
||||||
end
|
|
||||||
|
|
||||||
def choose_indexes_from_list title, list, table=nil, default=nil, defindex=nil
|
def choose_indexes_from_list title, list, table=nil, default=nil, defindex=nil
|
||||||
abort(I18n.t("handler.error.list.empty", :name => title)) if list.empty?
|
abort(I18n.t("handler.error.list.empty", :name => title)) if list.empty?
|
||||||
ar = nil
|
ar = nil
|
||||||
@ -128,7 +111,7 @@ module InputUtils
|
|||||||
I18n.t("handler.message.choose_list_default", :name => title, :default => default)
|
I18n.t("handler.message.choose_list_default", :name => title, :default => default)
|
||||||
end
|
end
|
||||||
begin
|
begin
|
||||||
ar = get_comma_separated_list(msg + ": ").map do |g|
|
ar = get_comma_separated_list(msg).map do |g|
|
||||||
n = Integer g.strip
|
n = Integer g.strip
|
||||||
raise ArgumentError.new(I18n.t("handler.error.number.invalid")) if n < 1 or n > list.size
|
raise ArgumentError.new(I18n.t("handler.error.number.invalid")) if n < 1 or n > list.size
|
||||||
n
|
n
|
||||||
@ -142,13 +125,4 @@ module InputUtils
|
|||||||
ar.map{|i| i - 1}
|
ar.map{|i| i - 1}
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_item_from_table(title, items, table)
|
|
||||||
items[ choose_number_from_list(title, items, table) ]
|
|
||||||
end
|
|
||||||
|
|
||||||
def select_items_from_table(title, items, table, options={})
|
|
||||||
indexes = choose_indexes_from_list(title, items, table, options[:default], options[:default_index])
|
|
||||||
items.values_at(*indexes)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -6,7 +6,7 @@ module Outputtable
|
|||||||
|
|
||||||
def outputter
|
def outputter
|
||||||
raise 'You should use "output_with" method to define outputter' unless self.class.outputter_class
|
raise 'You should use "output_with" method to define outputter' unless self.class.outputter_class
|
||||||
@outputter ||= self.class.outputter_class.new(data_to_output, options.merge(current_command: @command))
|
@outputter ||= self.class.outputter_class.new(data_to_output, options.merge(current_command: current_command))
|
||||||
end
|
end
|
||||||
|
|
||||||
def output(options={})
|
def output(options={})
|
||||||
@ -14,7 +14,7 @@ module Outputtable
|
|||||||
end
|
end
|
||||||
|
|
||||||
def report_url(job_id)
|
def report_url(job_id)
|
||||||
create_url "task/#{job_id}/report"
|
create_url "report/#{job_id}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def reports_urls(job_ids)
|
def reports_urls(job_ids)
|
||||||
@ -24,6 +24,7 @@ module Outputtable
|
|||||||
end.join("\n")
|
end.join("\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def self.included(base)
|
def self.included(base)
|
||||||
base.extend(ClassMethods)
|
base.extend(ClassMethods)
|
||||||
end
|
end
|
||||||
@ -35,4 +36,4 @@ module Outputtable
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -25,24 +25,9 @@ module Helpers
|
|||||||
|
|
||||||
def fetch_with_table(collection_name, *args)
|
def fetch_with_table(collection_name, *args)
|
||||||
handler = build_handler(collection_name)
|
handler = build_handler(collection_name)
|
||||||
handler.command = :list
|
|
||||||
[handler.list_handler(*args), handler.outputter.table]
|
[handler.list_handler(*args), handler.outputter.table]
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_list_data_with_table(collection_name, data)
|
|
||||||
handler = build_handler(collection_name)
|
|
||||||
handler.command = :list
|
|
||||||
handler.instance_variable_set('@list', data)
|
|
||||||
[data, handler.outputter.table]
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_by_command_with_table(collection_name, command, args={}, options={})
|
|
||||||
handler = build_handler(collection_name)
|
|
||||||
handler.command = command
|
|
||||||
args.each {|key, val| handler.instance_variable_set("@#{key}", val) }
|
|
||||||
return handler.send("#{command}_handler"), handler.outputter.output(options)
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_project(project_id)
|
def fetch_project(project_id)
|
||||||
@fetched_projects = {}
|
@fetched_projects = {}
|
||||||
if cached = @fetched_projects[project_id]
|
if cached = @fetched_projects[project_id]
|
||||||
@ -52,24 +37,12 @@ module Helpers
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_provider_accounts(provider)
|
|
||||||
handler = build_handler('provider')
|
|
||||||
[handler.accounts_handler(provider), handler.outputter.output(output_type: :accounts, provider: provider)]
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_category(project, environment_name, category)
|
|
||||||
environment = fetch_project(project)['environments'].detect do |env|
|
|
||||||
env['id'] == environment_name
|
|
||||||
end
|
|
||||||
environment['categories'].detect {|cat| cat['id'] == category }
|
|
||||||
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, self.options)
|
handler = resource_handler_klass(collection_name).new(host, options)
|
||||||
handler.auth = @auth
|
handler.auth = @auth
|
||||||
handler
|
handler
|
||||||
end
|
end
|
||||||
@ -83,4 +56,4 @@ module Helpers
|
|||||||
Object.const_get(class_name)
|
Object.const_get(class_name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -12,25 +12,10 @@ module Helpers
|
|||||||
@fetcher = fetcher
|
@fetcher = fetcher
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_available_provider(options={})
|
def select_available_provider
|
||||||
providers = @fetcher.fetch('provider')
|
providers, table = @fetcher.fetch_with_table('provider')
|
||||||
providers -= options[:except] if options[:except]
|
# somewhy returns provider name as String.
|
||||||
choose_item_from_list(I18n.t("headers.provider"), providers)
|
select_item_from_table(I18n.t("headers.provider"), providers, table)
|
||||||
end
|
|
||||||
|
|
||||||
def select_available_bootstrap_template
|
|
||||||
templates, table = @fetcher.fetch_by_command_with_table('chef', :bootstrap_templates)
|
|
||||||
select_item_from_table(I18n.t("headers.bootstrap_templates"), templates, table)
|
|
||||||
end
|
|
||||||
|
|
||||||
def select_available_provider_account provider
|
|
||||||
accounts, table = @fetcher.fetch_by_command_with_table('provider', :accounts, {provider: provider})
|
|
||||||
select_item_from_table(I18n.t("headers.provider_account"), accounts, table)
|
|
||||||
end
|
|
||||||
|
|
||||||
def select_available_provider_account_image provider, provider_account
|
|
||||||
images, table = @fetcher.fetch_by_command_with_table('provider', :images, {provider: provider, account: provider_account})
|
|
||||||
select_item_from_table(I18n.t("headers.image"), images, table)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_available_project
|
def select_available_project
|
||||||
@ -52,61 +37,41 @@ module Helpers
|
|||||||
stack_template['id']
|
stack_template['id']
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_available_flavor(args)
|
def select_available_flavor(options={})
|
||||||
flavors, table = @fetcher.fetch_by_command_with_table('provider', :flavors, args, {provider: args[:provider], account: args[:account]})
|
flavors, table = @fetcher.fetch_with_table('flavor', options[:provider])
|
||||||
abort(I18n.t("handler.provider.flavor.list.empty")) if flavors.empty?
|
abort(I18n.t("handler.flavor.list.empty")) if flavors.empty?
|
||||||
|
|
||||||
select_item_from_table(I18n.t("choose.flavor"), flavors, table)["id"]
|
flavors_descriptions = flavors.map {|f| "#{f["id"]}. #{f["name"]} - #{f["ram"]}, #{f["disk"]}, #{f["v_cpus"]} CPU"}
|
||||||
|
index = choose_number_from_list(I18n.t("headers.flavor"), flavors_descriptions, table)
|
||||||
|
|
||||||
|
flavors[index]['id']
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_available_image(args)
|
def select_available_image(options={})
|
||||||
images, table = @fetcher.fetch_by_command_with_table('image', :list, args, {provider: args[:provider], account: args[:account]})
|
images, table = @fetcher.fetch_with_table('image', options[:provider])
|
||||||
abort(I18n.t("handler.provider.images.list.empty")) if images.empty?
|
image = select_item_from_table(I18n.t("headers.image"), images, table)
|
||||||
|
image['id']
|
||||||
select_item_from_table(I18n.t("choose.image"), images, table)["id"]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_available_vpc(args)
|
def select_available_network(options={})
|
||||||
vpcs, table = @fetcher.fetch_by_command_with_table('provider', :vpc, args)
|
networks, table = @fetcher.fetch_with_table('network', options[:provider])
|
||||||
abort(I18n.t("handler.provider.vpc.list.empty")) if vpcs.empty?
|
table_title = options[:table_title] || I18n.t("headers.network")
|
||||||
|
|
||||||
select_item_from_table(I18n.t("choose.vpc"), vpcs, table)["vpc_id"]
|
selected_networks = select_items_from_table(table_title, networks, table)
|
||||||
end
|
|
||||||
|
|
||||||
def select_available_network(args, options={})
|
|
||||||
networks, table = @fetcher.fetch_by_command_with_table('provider', :networks, args)
|
|
||||||
select_item_from_table(I18n.t("choose.network"), networks, table)["subnetId"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def select_available_networks(args)
|
|
||||||
networks, table = @fetcher.fetch_by_command_with_table('provider', :networks, args)
|
|
||||||
|
|
||||||
selected_networks = select_items_from_table(I18n.t("choose.networks"), networks, table)
|
|
||||||
selected_networks.map {|network| network['name']}
|
selected_networks.map {|network| network['name']}
|
||||||
end
|
end
|
||||||
|
|
||||||
# options:
|
|
||||||
# :data - list of strings
|
|
||||||
def select_available_users(options={})
|
def select_available_users(options={})
|
||||||
title = options[:label] || I18n.t("input.users.label")
|
title = options[:table_title] || I18n.t("handler.project.create.user")
|
||||||
users, table = if options[:data]
|
users, table = @fetcher.fetch_with_table('user')
|
||||||
@fetcher.show_list_data_with_table('user', options[:data].map{|v| {'id' => v}})
|
|
||||||
else
|
|
||||||
@fetcher.fetch_with_table('user')
|
|
||||||
end
|
|
||||||
|
|
||||||
users = select_items_from_table(title, users, table)
|
users = select_items_from_table(title, users, table)
|
||||||
users.map {|user| user['id']}
|
users.map {|user| user['id']}
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_available_ssh_keys(options={})
|
def select_available_groups(options={})
|
||||||
ssh_keys, table = @fetcher.fetch_with_table('key')
|
title = options[:table_title] || I18n.t("options.project.create.groups")
|
||||||
|
groups, table = @fetcher.fetch_with_table('group', options[:provider], options[:vpc_id])
|
||||||
select_item_from_table(I18n.t("choose.ssh_key"), ssh_keys, table)['id']
|
|
||||||
end
|
|
||||||
|
|
||||||
def select_available_security_groups(args)
|
|
||||||
groups, table = @fetcher.fetch_by_command_with_table('provider', :security_groups, args)
|
|
||||||
|
|
||||||
# somewhy groups returned as a hash, not array
|
# somewhy groups returned as a hash, not array
|
||||||
groups_array = []
|
groups_array = []
|
||||||
@ -116,22 +81,19 @@ module Helpers
|
|||||||
end
|
end
|
||||||
|
|
||||||
default_index = groups_array.index {|t| t['id'] == 'default'}
|
default_index = groups_array.index {|t| t['id'] == 'default'}
|
||||||
select_items_from_table(I18n.t("choose.security_groups"), groups_array, table, default: 'default', default_index: default_index).map{|g| g["id"]}
|
select_items_from_table(title, groups_array, table, default: 'default', default_index: default_index)
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_available_roles used_roles=[]
|
private
|
||||||
roles, table = @fetcher.fetch_with_table('role')
|
|
||||||
roles.delete_if{|role| used_roles.include?(role["id"])} unless used_roles.empty?
|
def select_item_from_table(title, items, table)
|
||||||
roles = select_items_from_table(I18n.t("headers.role"), roles, table)
|
items[ choose_number_from_list(title, items, table) ]
|
||||||
roles.map{|r| r['id']}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def select_user_roles used_roles
|
def select_items_from_table(title, items, table, options={})
|
||||||
roles, table = @fetcher.fetch_with_table('role')
|
indexes = choose_indexes_from_list(title, items, table, options[:default], options[:default_index])
|
||||||
roles.select{|role| used_roles.include?(role["id"])}
|
items.values_at(*indexes)
|
||||||
roles = select_items_from_table(I18n.t("headers.role"), roles, table)
|
|
||||||
roles.map{|r| r['id']}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1,16 +0,0 @@
|
|||||||
class Validators
|
|
||||||
|
|
||||||
class << self
|
|
||||||
|
|
||||||
def validate_run_list run_list
|
|
||||||
return true if run_list.empty?
|
|
||||||
rl = /\Arole|recipe\[[\w-]+(::[\w-]+)?\]\Z/
|
|
||||||
e = run_list.select {|l| (rl =~ l).nil?}
|
|
||||||
res = e.empty?
|
|
||||||
puts I18n.t("handler.project.create.run_list.invalid", :list => e.join(", ")) unless res
|
|
||||||
res
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -1,21 +1,22 @@
|
|||||||
require "devops-client/handler/handler"
|
require "devops-client/handler/handler"
|
||||||
require "devops-client/options/image_options"
|
require "devops-client/options/image_options"
|
||||||
require "devops-client/output/image"
|
require "devops-client/output/image"
|
||||||
|
require "devops-client/handler/bootstrap_templates"
|
||||||
|
|
||||||
class Image < Handler
|
class Image < Handler
|
||||||
|
|
||||||
output_with Output::Image
|
output_with Output::Image
|
||||||
|
|
||||||
def initialize(host, def_options={})
|
def initialize(host, def_options={})
|
||||||
@host = host
|
# QUESTION:
|
||||||
@options = def_options
|
# why we set @options variable here while we always reset it in #handle method?
|
||||||
|
@host, @options = host, def_options
|
||||||
|
@options_parser = ImageOptions.new(ARGV, def_options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@options_parser = ImageOptions.new(ARGV, @options)
|
@options, @args = @options_parser.parse_options_for!(current_command)
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
case current_command
|
||||||
extract_parameters
|
|
||||||
case @command
|
|
||||||
when :list
|
when :list
|
||||||
list_handler
|
list_handler
|
||||||
output
|
output
|
||||||
@ -31,52 +32,109 @@ class Image < Handler
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_templates
|
||||||
|
bt = BootstrapTemplates.new(@host, self.options)
|
||||||
|
bt.auth = self.auth
|
||||||
|
list = bt.list_handler
|
||||||
|
return list, nil if list.empty?
|
||||||
|
[list, bt.outputter.table]
|
||||||
|
end
|
||||||
|
|
||||||
def create_handler
|
def create_handler
|
||||||
q = {}
|
q = {}
|
||||||
q[:provider] = options[:provider] || resources_selector.select_available_provider
|
q[:provider] = options[:provider] || resources_selector.select_available_provider
|
||||||
q[:provider_account] = options[:provider_account] || resources_selector.select_available_provider_account(q[:provider])["account_name"]
|
|
||||||
image = resources_selector.select_available_provider_account_image(q[:provider], q[:provider_account])
|
|
||||||
|
|
||||||
|
provider_images(q[:provider])
|
||||||
|
|
||||||
|
# QUESTION:
|
||||||
|
# why we select image in create image handler?
|
||||||
|
image = nil
|
||||||
|
if options[:image_id].nil?
|
||||||
|
image = choose_image_cmd(@list, self.outputter.table)
|
||||||
|
else
|
||||||
|
image = @list.detect{|i| i["id"] == options[:image_id]}
|
||||||
|
abort("Invalid image id '#{options[:image_id]}'") if image.nil?
|
||||||
|
end
|
||||||
q["name"] = image["name"]
|
q["name"] = image["name"]
|
||||||
q["id"] = image["id"]
|
q["id"] = image["id"]
|
||||||
q["image_id"] = q["id"]
|
|
||||||
|
|
||||||
q["remote_user"] = options[:ssh_username] || enter_parameter(I18n.t("handler.image.create.ssh_user") + ": ")
|
q["remote_user"] = options[:ssh_username] || enter_parameter(I18n.t("handler.image.create.ssh_user") + ": ")
|
||||||
|
|
||||||
|
q["bootstrap_template"] = if options[:bootstrap_template].nil? and options[:no_bootstrap_template] == false
|
||||||
|
bt, bt_t = get_templates
|
||||||
|
if bt.empty?
|
||||||
|
puts I18n.t("handler.image.create.template_empty")
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
# QUESTION:
|
||||||
|
# what does this '-1' mean?
|
||||||
|
i = choose_number_from_list(I18n.t("handler.image.create.template"), bt, bt_t, -1)
|
||||||
|
if i == -1
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
bt[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
json = JSON.pretty_generate(q)
|
json = JSON.pretty_generate(q)
|
||||||
post_body "/image", json if question(I18n.t("handler.image.question.create")){puts json}
|
post_body "/image", json if question(I18n.t("handler.image.question.create")){puts json}
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_handler
|
def list_handler(provider=nil)
|
||||||
path = "/images"
|
provider ||= @options[:given_provider]
|
||||||
params = {}
|
@list = if provider
|
||||||
params["provider"] = @provider if @provider
|
provider_images(provider)
|
||||||
params["account"] = @account if @account
|
else
|
||||||
unless params.empty?
|
get("/images")
|
||||||
path += "?" + params.map{|k,v| "#{k}=#{v}"}.join("&")
|
|
||||||
end
|
end
|
||||||
@list = get(path)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def provider_images provider, provider_account
|
def provider_images provider
|
||||||
if provider == 'static'
|
if provider == 'static'
|
||||||
@options_parser.invalid_list_command
|
@options_parser.invalid_list_command
|
||||||
abort()
|
abort()
|
||||||
end
|
end
|
||||||
|
|
||||||
@list = get("/provider/#{provider}/account/#{provider_account}/images")
|
if @options[:provider_account]
|
||||||
|
@list = get("/images/provider/#{provider}/#{@options[:provider_account]}")
|
||||||
|
else
|
||||||
|
@list = get("/images/provider/#{provider}")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_handler
|
def show_handler
|
||||||
@show = get "/image/#{@image}"
|
id = @args[2]
|
||||||
|
r = inspect_parameters @options_parser.show_params, id
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_show_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
@show = get "/image/#{id}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_handler
|
def delete_handler
|
||||||
delete "/image/#{@image}" if question(I18n.t("handler.image.question.delete", :name => @image))
|
id = @args[2]
|
||||||
|
r = inspect_parameters @options_parser.delete_params, id
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_delete_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
if question(I18n.t("handler.image.question.delete", :name => id))
|
||||||
|
delete "/image/#{id}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# QUESTION:
|
||||||
|
# what does inspect_parameters do and what do args[2] and args[3] actually mean?
|
||||||
def update_handler
|
def update_handler
|
||||||
update_object_from_file "image", @image, @file
|
r = inspect_parameters @options_parser.update_params, @args[2], @args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_update_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
update_object_from_file "image", @args[2], @args[3]
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -13,9 +13,8 @@ class Key < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
@options, @args = @options_parser.parse_options_for!(current_command)
|
||||||
extract_parameters
|
case current_command
|
||||||
case @command
|
|
||||||
when :list
|
when :list
|
||||||
list_handler
|
list_handler
|
||||||
output
|
output
|
||||||
@ -27,18 +26,30 @@ class Key < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def add_handler
|
def add_handler
|
||||||
content = File.read(@file)
|
r = inspect_parameters @options_parser.add_params, @args[2], @args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_add_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
content = File.read(@args[3])
|
||||||
q = {
|
q = {
|
||||||
"key_name" => @key_name,
|
"key_name" => @args[2],
|
||||||
"file_name" => File.basename(@file),
|
"file_name" => File.basename(@args[3]),
|
||||||
"content" => content
|
"content" => content
|
||||||
}
|
}
|
||||||
json = JSON.pretty_generate(q)
|
post "/key", q
|
||||||
post_body "/key", json if question(I18n.t("handler.key.question.create")){puts json}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_handler
|
def delete_handler
|
||||||
delete "/key/#{@key_name}" if question(I18n.t("handler.key.question.delete", :name => @key_name))
|
r = inspect_parameters @options_parser.delete_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_delete_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
if question(I18n.t("handler.key.question.delete", :name => @args[2]))
|
||||||
|
delete "/key/#{@args[2]}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_handler
|
def list_handler
|
||||||
|
|||||||
35
devops-client/lib/devops-client/handler/network.rb
Normal file
35
devops-client/lib/devops-client/handler/network.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
require "devops-client/handler/handler"
|
||||||
|
require "devops-client/options/network_options"
|
||||||
|
require "json"
|
||||||
|
require "devops-client/output/network"
|
||||||
|
|
||||||
|
class Network < Handler
|
||||||
|
|
||||||
|
output_with Output::Network
|
||||||
|
|
||||||
|
def initialize(host, def_options={})
|
||||||
|
@host, @options = host, def_options
|
||||||
|
@options_parser = NetworkOptions.new(ARGV, def_options)
|
||||||
|
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(@args[2])
|
||||||
|
output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def list_handler(provider=nil)
|
||||||
|
r = inspect_parameters @options_parser.list_params, provider
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_list_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
@list = get("/networks/#{provider}").sort!{|x,y| x["name"] <=> y["name"]}
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
@ -1,57 +1,94 @@
|
|||||||
require "devops-client/handler/provider"
|
require "devops-client/handler/provider"
|
||||||
require "devops-client/handler/image"
|
require "devops-client/handler/image"
|
||||||
|
require "devops-client/handler/flavor"
|
||||||
|
require "devops-client/handler/network"
|
||||||
|
require "devops-client/handler/group"
|
||||||
require "devops-client/handler/user"
|
require "devops-client/handler/user"
|
||||||
require "devops-client/handler/helpers/validators"
|
|
||||||
require "devops-client/options/project_options"
|
require "devops-client/options/project_options"
|
||||||
require "json"
|
require "json"
|
||||||
require "set"
|
require "set"
|
||||||
require "devops-client/output/project"
|
require "devops-client/output/project"
|
||||||
|
require "devops-client/handler/deploy_envs/deploy_env_factory"
|
||||||
|
|
||||||
class Project < Handler
|
class Project < Handler
|
||||||
|
attr_accessor :def_options
|
||||||
|
|
||||||
output_with Output::Project
|
output_with Output::Project
|
||||||
|
|
||||||
def initialize(host, def_options={})
|
def initialize(host, def_options={})
|
||||||
@host = host
|
self.host = host
|
||||||
|
self.def_options = self.options = def_options
|
||||||
@options_parser = ProjectOptions.new(ARGV, def_options)
|
@options_parser = ProjectOptions.new(ARGV, def_options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
case ARGV[1]
|
||||||
extract_parameters
|
when "create"
|
||||||
case @command
|
self.options = @options_parser.create_options
|
||||||
when :create
|
create_handler @options_parser.args
|
||||||
create_handler
|
when "delete"
|
||||||
when :delete
|
self.options = @options_parser.delete_options
|
||||||
delete_handler
|
delete_handler @options_parser.args
|
||||||
when :list
|
when "deploy"
|
||||||
|
self.options = @options_parser.deploy_options
|
||||||
|
deploy_handler @options_parser.args
|
||||||
|
when "list"
|
||||||
|
self.options = @options_parser.list_options
|
||||||
list_handler
|
list_handler
|
||||||
output
|
output
|
||||||
when :servers
|
when "multi"
|
||||||
servers_handler
|
case ARGV[2]
|
||||||
output
|
when "create"
|
||||||
when :stacks
|
self.options = @options_parser.multi_create_options
|
||||||
stacks_handler
|
multi_create_handler @options_parser.args
|
||||||
output
|
else
|
||||||
when :set_run_list
|
@options_parser.invalid_multi_command
|
||||||
set_run_list_handler
|
abort(I18n.t("handler.project.invalid_subcommand", :cmd => ARGV[1], :scmd => ARGV[2]))
|
||||||
when :show
|
end
|
||||||
show_handler
|
when "servers"
|
||||||
output
|
self.options = @options_parser.servers_options
|
||||||
when :update
|
servers_handler @options_parser.args
|
||||||
puts "TODO: update"
|
output(output_type: :servers)
|
||||||
exit
|
when "stacks"
|
||||||
update_handler
|
self.options = @options_parser.stacks_options
|
||||||
when :user_add
|
stacks_handler @options_parser.args
|
||||||
user_add_handler
|
output(output_type: :stacks)
|
||||||
when :user_delete
|
when "set"
|
||||||
user_delete_handler
|
case ARGV[2]
|
||||||
when :archive
|
when "run_list"
|
||||||
archive_handler
|
self.options = @options_parser.set_run_list_options
|
||||||
when :unarchive
|
set_run_list_handler @options_parser.args
|
||||||
unarchive_handler
|
else
|
||||||
|
@options_parser.invalid_set_command
|
||||||
|
abort(I18n.t("handler.project.invalid_subcommand", :cmd => ARGV[1], :scmd => ARGV[2]))
|
||||||
|
end
|
||||||
|
when "show"
|
||||||
|
self.options = @options_parser.show_options
|
||||||
|
show_handler @options_parser.args
|
||||||
|
output(output_type: :show)
|
||||||
|
when "update"
|
||||||
|
self.options = @options_parser.update_options
|
||||||
|
update_handler @options_parser.args
|
||||||
|
when "user"
|
||||||
|
case ARGV[2]
|
||||||
|
when "add"
|
||||||
|
self.options = @options_parser.user_add_options
|
||||||
|
user_add_handler @options_parser.args
|
||||||
|
when "delete"
|
||||||
|
self.options = @options_parser.user_delete_options
|
||||||
|
user_delete_handler @options_parser.args
|
||||||
|
else
|
||||||
|
@options_parser.invalid_user_command
|
||||||
|
abort(I18n.t("handler.project.invalid_subcommand", :cmd => ARGV[1], :scmd => ARGV[2]))
|
||||||
|
end
|
||||||
when "test"
|
when "test"
|
||||||
test_handler
|
self.options = @options_parser.test_options
|
||||||
|
test_handler @options_parser.args
|
||||||
|
when "delete_servers"
|
||||||
|
self.options = @options_parser.delete_servers_options
|
||||||
|
delete_servers_handler @options_parser.args
|
||||||
|
else
|
||||||
|
@options_parser.invalid_command
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -59,23 +96,32 @@ class Project < Handler
|
|||||||
@list = get "/projects"
|
@list = get "/projects"
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_handler
|
def delete_handler args
|
||||||
delete "/project/#{@project_id}" if question(I18n.t("handler.project.question.delete", :name => @project_id))
|
r = inspect_parameters @options_parser.delete_params, args[2], args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_delete_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
o = {}
|
||||||
|
o[:deploy_env] = args[3] unless args[3].nil?
|
||||||
|
|
||||||
|
message = args[2]
|
||||||
|
message += ".#{args[3]}" unless args[3].nil?
|
||||||
|
if question(I18n.t("handler.project.question.delete", :name => message))
|
||||||
|
delete "/project/#{args[2]}", o
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_handler
|
def show_handler args
|
||||||
@show = get("/project/#{@project_id}")
|
r = inspect_parameters @options_parser.show_params, args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_show_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
@show = get_project_info_obj(args[2])
|
||||||
end
|
end
|
||||||
|
|
||||||
def archive_handler
|
def update_handler args
|
||||||
post "/project/#{@project_id}/archive"
|
|
||||||
end
|
|
||||||
|
|
||||||
def unarchive_handler
|
|
||||||
post "/project/#{@project_id}/unarchive"
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_handler
|
|
||||||
r = inspect_parameters @options_parser.update_params, args[2], args[3]
|
r = inspect_parameters @options_parser.update_params, args[2], args[3]
|
||||||
unless r.nil?
|
unless r.nil?
|
||||||
@options_parser.invalid_update_command
|
@options_parser.invalid_update_command
|
||||||
@ -84,7 +130,7 @@ class Project < Handler
|
|||||||
update_object_from_file "project", args[2], args[3]
|
update_object_from_file "project", args[2], args[3]
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_handler
|
def create_handler args
|
||||||
file = self.options[:file]
|
file = self.options[:file]
|
||||||
unless file.nil?
|
unless file.nil?
|
||||||
json = File.read(file)
|
json = File.read(file)
|
||||||
@ -95,34 +141,145 @@ class Project < Handler
|
|||||||
end
|
end
|
||||||
post_body("/project", json)
|
post_body("/project", json)
|
||||||
else
|
else
|
||||||
create_project
|
r = inspect_parameters @options_parser.create_params, args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_create_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
unless self.options[:username].nil? || self.options[:password].nil?
|
||||||
|
self.auth[:username] = self.options[:username]
|
||||||
|
self.auth[:password] = self.options[:password]
|
||||||
|
self.def_options[:username] = self.auth[:username]
|
||||||
|
end
|
||||||
|
create_project args, :create_project_deploy_env_cmd
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def servers_handler
|
def servers_handler args
|
||||||
@list = get "/project/#{@project_id}/servers"
|
r = inspect_parameters @options_parser.servers_params, args[2], args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_servers_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
o = {}
|
||||||
|
unless args[3].nil?
|
||||||
|
o[:deploy_env] = args[3]
|
||||||
|
end
|
||||||
|
@servers = get "/project/#{args[2]}/servers", o
|
||||||
end
|
end
|
||||||
|
|
||||||
def stacks_handler
|
def stacks_handler args
|
||||||
@list = get "/project/#{@project_id}/stacks"
|
project, deploy_env = args[2], args[3]
|
||||||
|
r = inspect_parameters @options_parser.stacks_params, project, deploy_env
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_stacks_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
options = {}
|
||||||
|
unless deploy_env.nil?
|
||||||
|
options[:deploy_env] = deploy_env
|
||||||
|
end
|
||||||
|
@list = get "/project/#{args[2]}/stacks", options
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_add_handler
|
def user_add_handler args
|
||||||
post "/project/#{@project_id}/users/add", @user_name
|
r = inspect_parameters @options_parser.user_add_params, args[3], args[4]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_user_add_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
q = {:users => args[4..-1]}
|
||||||
|
q[:deploy_env] = options[:deploy_env] unless options[:deploy_env].nil?
|
||||||
|
put "/project/#{args[3]}/user", q
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_delete_handler
|
def user_delete_handler args
|
||||||
post "/project/#{@project_id}/users/delete", @user_name
|
r = inspect_parameters @options_parser.user_delete_params, args[3], args[4]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_user_delete_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
q = {:users => args[4..-1]}
|
||||||
|
q[:deploy_env] = options[:deploy_env] unless options[:deploy_env].nil?
|
||||||
|
delete_body "/project/#{args[3]}/user", q.to_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_run_list_handler
|
def multi_create_handler args
|
||||||
run_list = @run_list || []
|
r = inspect_parameters @options_parser.multi_create_params, args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_multi_create_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
create_project args, :create_project_multi_deploy_env_cmd, :multi
|
||||||
|
|
||||||
|
i = Image.new(@host, self.def_options)
|
||||||
|
images, ti = i.list_handler, i.table
|
||||||
|
f = Flavor.new(@host, self.def_options)
|
||||||
|
flavors, tf = f.list_handler, f.table
|
||||||
|
g = Group.new(@host, self.def_options)
|
||||||
|
groups, tg = g.list_handler, g.table
|
||||||
|
|
||||||
|
list = list_handler
|
||||||
|
info, multi = {}, {:type => "multi", :name => args[3], :deploy_envs => []}
|
||||||
|
begin # Add environment
|
||||||
|
nodes, projects, servers = [], [], {}
|
||||||
|
deploy_env = {:identifier => enter_parameter("Deploy environment identifier: ")}
|
||||||
|
begin # Add server
|
||||||
|
server_name = args[3] + "_" + enter_parameter("Server name: " + args[3] + "_")
|
||||||
|
s = servers[server_name] = {}
|
||||||
|
s[:groups] = choose_indexes_from_list("Security groups", list, tg, "default", list.index("default")).map{|i| list[i]}
|
||||||
|
s[:flavor] = choose_flavor_cmd(flavors, tf)["name"]
|
||||||
|
s[:image] = choose_image_cmd(images, ti)["id"]
|
||||||
|
subprojects = s[:subprojects] = []
|
||||||
|
|
||||||
|
begin # Add project
|
||||||
|
o = {}
|
||||||
|
o[:project_id] = project_id = choose_project(list, table)
|
||||||
|
info[project_id] = get_project_info_obj(project_id) unless info.has_key?(project_id)
|
||||||
|
envs = info[project_id]["deploy_envs"].map{|de| de["identifier"]}
|
||||||
|
o[:project_env] = ( envs.size > 1 ? choose_project_env(envs) : envs[0] )
|
||||||
|
subprojects.push o
|
||||||
|
end while question("Add project?")
|
||||||
|
|
||||||
|
end while question("Add server?")
|
||||||
|
|
||||||
|
deploy_env[:servers] = servers
|
||||||
|
multi[:deploy_envs].push deploy_env
|
||||||
|
end while question(I18n.t("handler.project.question.add_env"))
|
||||||
|
puts JSON.pretty_generate(multi)
|
||||||
|
post "/project", :json => multi.to_json if question(I18n.t("handler.project.question.create"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_run_list_handler args
|
||||||
|
r = inspect_parameters @options_parser.set_run_list_params, args[3], args[4], args[5]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_set_run_list_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
run_list = []
|
||||||
|
args[5..args.size].each do |e|
|
||||||
|
run_list += e.split(",")
|
||||||
|
end
|
||||||
if run_list.empty?
|
if run_list.empty?
|
||||||
exit unless question(I18n.t("handler.project.question.run_list.empty"))
|
exit unless question(I18n.t("handler.project.run_list.empty"))
|
||||||
else
|
else
|
||||||
exit unless Validators.validate_run_list(run_list)
|
exit unless DeployEnv.validate_run_list(run_list)
|
||||||
end
|
end
|
||||||
post "/project/#{@project_id}/run_list", run_list
|
put "/project/#{args[3]}/#{args[4]}/run_list", run_list
|
||||||
|
end
|
||||||
|
|
||||||
|
def deploy_handler args
|
||||||
|
r = inspect_parameters @options_parser.deploy_params, args[2], args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_deploy_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
q = {}
|
||||||
|
q[:servers] = options[:servers] unless options[:servers].nil?
|
||||||
|
q[:deploy_env] = args[3] unless args[3].nil?
|
||||||
|
job_ids = post "/project/#{args[2]}/deploy", q
|
||||||
|
reports_urls(job_ids)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_handler args
|
def test_handler args
|
||||||
@ -135,36 +292,196 @@ class Project < Handler
|
|||||||
reports_urls(job_ids)
|
reports_urls(job_ids)
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
def create_project
|
def get_project_info_obj project_id
|
||||||
|
get("/project/#{project_id}")
|
||||||
|
end
|
||||||
|
|
||||||
project = {:environments => [], :id => @project_id}
|
def create_project args, env_method_name, type=nil
|
||||||
project[:description] = options[:description] || enter_parameter_or_empty(I18n.t("handler.project.create.description") + ": ")
|
project_name = args[2]
|
||||||
project[:project_users] = if options[:project_users]
|
providers = {}
|
||||||
options[:project_users]
|
providers[:obj], providers[:table] = fetcher.fetch_with_table('provider')
|
||||||
else
|
begin
|
||||||
if question(I18n.t("handler.project.create.question.users_choose"))
|
project = get_project_info_obj(project_name)
|
||||||
#choose
|
puts_warn I18n.t("handler.project.exist", :project => project_name)
|
||||||
resources_selector.select_available_users(label: I18n.t("handler.project.create.users"))
|
names = project["deploy_envs"].map{|de| de["identifier"]}
|
||||||
else
|
new_envs = []
|
||||||
#enter
|
while question(I18n.t("handler.project.question.add_env"))
|
||||||
get_comma_separated_list(I18n.t("input.message.input_list", cmd: I18n.t("input.user.list")))
|
new_envs << method(env_method_name).call(project_name, providers, names)
|
||||||
|
break if self.options[:no_ask]
|
||||||
end
|
end
|
||||||
|
puts JSON.pretty_generate(new_envs)
|
||||||
|
if question(I18n.t("handler.project.question.update_with_new_envs"))
|
||||||
|
new_envs.each do |env|
|
||||||
|
post "/project/#{project_name}/deploy_env", env
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue NotFound => e
|
||||||
|
project = create_project_cmd(project_name, providers, env_method_name)
|
||||||
|
project[:name] = args[2]
|
||||||
|
puts json = JSON.pretty_generate(project)
|
||||||
|
post_body("/project", json) if question(I18n.t("handler.project.question.create"))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_project_cmd project_name, providers, env_method
|
||||||
|
project = {:deploy_envs => []}
|
||||||
|
names = []
|
||||||
|
begin
|
||||||
|
d = method(env_method).call(project_name, providers, names)
|
||||||
|
project[:deploy_envs].push d
|
||||||
|
break if self.options[:no_ask]
|
||||||
|
end while question(I18n.t("handler.project.question.add_env"))
|
||||||
|
project
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_project_deploy_env_cmd project, providers, names
|
||||||
|
d = {}
|
||||||
|
set_identifier(d, names)
|
||||||
|
|
||||||
|
set_provider(d, providers)
|
||||||
|
|
||||||
|
de = DeployEnvFactory.create(d[:provider], @host, self.options, self.auth)
|
||||||
|
de.fill d
|
||||||
|
|
||||||
|
=begin
|
||||||
|
unless d[:provider] == "static"
|
||||||
|
set_flavor(d, buf)
|
||||||
|
set_image(d, buf)
|
||||||
|
vpc_id = set_subnets(d, buf)
|
||||||
|
set_groups(d, buf, vpc_id)
|
||||||
|
end
|
||||||
|
set_users(d, buf)
|
||||||
|
|
||||||
|
unless self.options[:run_list].nil?
|
||||||
|
self.options[:run_list] = self.options[:run_list].split(",").map{|e| e.strip}
|
||||||
|
abort("Invalid run list: '#{self.options[:run_list].join(",")}'") unless Project.validate_run_list(self.options[:run_list])
|
||||||
|
end
|
||||||
|
set_parameter d, :run_list do
|
||||||
|
set_run_list_cmd project, d[:identifier]
|
||||||
end
|
end
|
||||||
|
|
||||||
project[:run_list] = if self.options[:run_list]
|
unless self.options[:no_expires]
|
||||||
abort("Invalid run list: '#{self.options[:run_list].join(",")}'") unless Validators.validate_run_list(self.options[:run_list])
|
set_parameter d, :expires do
|
||||||
self.options[:run_list]
|
s = enter_parameter_or_empty(I18n.t("options.project.create.expires") + ": ").strip
|
||||||
|
s.empty? ? nil : s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
d
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_project_multi_deploy_env_cmd project, providers, names
|
||||||
|
d = {}
|
||||||
|
set_identifier(d, names)
|
||||||
|
|
||||||
|
set_provider(d, providers)
|
||||||
|
buf = providers[d[:provider]]
|
||||||
|
|
||||||
|
set_flavor(d, buf)
|
||||||
|
set_image(d, buf)
|
||||||
|
vpc_id = set_subnets(d, buf)
|
||||||
|
set_groups(d, buf, vpc_id)
|
||||||
|
set_users(d, buf)
|
||||||
|
|
||||||
|
unless self.options[:run_list].nil?
|
||||||
|
self.options[:run_list] = self.options[:run_list].split(",").map{|e| e.strip}
|
||||||
|
abort("Invalid run list: '#{self.options[:run_list].join(",")}'") unless DeployEnv.validate_run_list(self.options[:run_list])
|
||||||
|
end
|
||||||
|
set_parameter d, :run_list do
|
||||||
|
set_run_list_cmd project, d[:identifier]
|
||||||
|
end
|
||||||
|
|
||||||
|
unless self.options[:no_expires]
|
||||||
|
set_parameter d, :expires do
|
||||||
|
s = enter_parameter_or_empty(I18n.t("options.project.create.expires") + ": ").strip
|
||||||
|
s.empty? ? nil : s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
d
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_identifier d, names
|
||||||
|
set_parameter d, :identifier do
|
||||||
|
begin
|
||||||
|
n = enter_parameter I18n.t("handler.project.create.env") + ": "
|
||||||
|
if names.include?(n)
|
||||||
|
puts I18n.t("handler.project.create.env_exist", :env => n)
|
||||||
|
raise ArgumentError
|
||||||
|
else
|
||||||
|
names.push n
|
||||||
|
n
|
||||||
|
end
|
||||||
|
rescue ArgumentError
|
||||||
|
retry
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_provider d, providers
|
||||||
|
set_parameter d, :provider do
|
||||||
|
providers[:obj][ choose_number_from_list(I18n.t("headers.provider"), providers[:obj], providers[:table]) ]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_parameter obj, key
|
||||||
|
if self.options[key].nil?
|
||||||
|
obj[key] = yield
|
||||||
else
|
else
|
||||||
input_run_list
|
obj[key] = self.options[key]
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
json = JSON.pretty_generate(project)
|
# returns project id
|
||||||
post_body("/project", json) if question(I18n.t("handler.project.question.create")){puts json}
|
def choose_project projects, table=nil
|
||||||
|
abort(I18n.t("handler.project.list.empty")) if projects.empty?
|
||||||
|
projects[ choose_number_from_list(I18n.t("headers.project"), projects, table) ]
|
||||||
|
end
|
||||||
|
|
||||||
|
# returns project env
|
||||||
|
def choose_project_env project_envs, table=nil
|
||||||
|
abort(I18n.t("handler.project.env.list.empty")) if project_envs.empty?
|
||||||
|
project_envs[ choose_number_from_list(I18n.t("headers.project_env"), project_envs, table) ]
|
||||||
end
|
end
|
||||||
|
|
||||||
def data_to_output
|
def data_to_output
|
||||||
@list || @show || @test
|
@list || @show || @servers || @test
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete_servers_handler(args)
|
||||||
|
project, env = args[2], args[3]
|
||||||
|
if error = inspect_parameters(@options_parser.delete_servers_params, project, env)
|
||||||
|
@options_parser.invalid_delete_servers_command
|
||||||
|
abort(error)
|
||||||
|
end
|
||||||
|
|
||||||
|
ask_for_delete_servers(project, env)
|
||||||
|
body = {
|
||||||
|
deploy_env: env,
|
||||||
|
dry_run: false
|
||||||
|
}
|
||||||
|
response = delete("/project/#{project}/servers", body)
|
||||||
|
reports_urls(response['reports'])
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def ask_for_delete_servers(project, env)
|
||||||
|
body = {
|
||||||
|
deploy_env: env,
|
||||||
|
dry_run: true
|
||||||
|
}
|
||||||
|
to_delete = delete("/project/#{project}/servers", body)['to_delete']
|
||||||
|
if to_delete.empty?
|
||||||
|
abort "There are no servers to delete."
|
||||||
|
else
|
||||||
|
puts "Servers to delete:\n----\n"
|
||||||
|
puts to_delete.join("\n")
|
||||||
|
puts '----'
|
||||||
|
end
|
||||||
|
if @options[:dry_run] || !question('Are you sure to delete them? ')
|
||||||
|
abort
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -8,97 +8,33 @@ class Provider < Handler
|
|||||||
|
|
||||||
def initialize(host, def_options={})
|
def initialize(host, def_options={})
|
||||||
@host, @options = host, def_options
|
@host, @options = host, def_options
|
||||||
|
@options_parser = ProviderOptions.new(ARGV, def_options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@options_parser = ProviderOptions.new(ARGV, @options)
|
@options, @args = @options_parser.parse_options_for!(current_command)
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
case current_command
|
||||||
extract_parameters
|
when :list
|
||||||
case @command
|
list_handler
|
||||||
when :account_create
|
output(output_type: :list)
|
||||||
return account_create_handler
|
when :accounts
|
||||||
when :account_delete
|
@provider = @args[2]
|
||||||
return account_delete_handler
|
accounts_handler
|
||||||
|
output(output_type: :accounts, provider: @provider)
|
||||||
end
|
end
|
||||||
send("#{@command}_handler")
|
|
||||||
output_data = {
|
|
||||||
provider: @provider,
|
|
||||||
account: @account
|
|
||||||
}
|
|
||||||
output(output_data)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_handler
|
def list_handler
|
||||||
@list = get("/providers").sort!{|x,y| x["id"] <=> y["id"]}
|
@list = get("/providers").sort!{|x,y| x["id"] <=> y["id"]}
|
||||||
end
|
end
|
||||||
|
|
||||||
def account_create_handler
|
|
||||||
file = @options[:file]
|
|
||||||
unless file.nil?
|
|
||||||
json = File.read(file)
|
|
||||||
begin
|
|
||||||
JSON.parse(json)
|
|
||||||
rescue JSON::ParserError => e
|
|
||||||
abort(I18n.t("handler.provider.account.create.invalid_json", :file => file))
|
|
||||||
end
|
|
||||||
post_body("/provider/#{@provider}/account", json)
|
|
||||||
else
|
|
||||||
create_account
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_delete_handler
|
|
||||||
delete "/provider/#{@provider}/account/#{@account}" if question(I18n.t("handler.provider.account.question.delete", :account => @account))
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_account
|
|
||||||
q = {
|
|
||||||
"account_name" => @account
|
|
||||||
}
|
|
||||||
q["description"] = options[:description] || enter_parameter_or_empty(I18n.t("handler.provider.account.create.description") + ": ")
|
|
||||||
q["ssh_key"] = options[:ssh_key] || resources_selector.select_available_ssh_keys
|
|
||||||
|
|
||||||
case @provider
|
|
||||||
when Providers::Aws
|
|
||||||
q["use_iam_profile"] = options[:use_iam_profile] || question(I18n.t("handler.provider.account.create.aws.use_iam_profile"))
|
|
||||||
unless q["use_iam_profile"]
|
|
||||||
q["access_key_id"] = options[:access_key_id] || enter_parameter(I18n.t("handler.provider.account.create.aws.access_key_id") + ": ")
|
|
||||||
q["secret_access_key"] = options[:secret_access_key] || enter_parameter(I18n.t("handler.provider.account.create.aws.secret_access_key") + ": ")
|
|
||||||
end
|
|
||||||
when Providers::Openstack
|
|
||||||
when Providers::Static
|
|
||||||
# nothing to do
|
|
||||||
end
|
|
||||||
json = JSON.pretty_generate(q)
|
|
||||||
post_body "/provider/#{@provider}/account", json if question(I18n.t("handler.provider.account.question.create")){puts json}
|
|
||||||
end
|
|
||||||
|
|
||||||
def accounts_handler
|
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")
|
@list = get("/provider/#{@provider}/accounts")
|
||||||
end
|
end
|
||||||
|
|
||||||
def flavors_handler
|
|
||||||
@list = get("/provider/#{@provider}/account/#{@account}/flavors").sort!{|x,y| x["id"] <=> y["id"]}
|
|
||||||
end
|
|
||||||
|
|
||||||
def images_handler
|
|
||||||
@list = get("/provider/#{@provider}/account/#{@account}/images")
|
|
||||||
end
|
|
||||||
|
|
||||||
def networks_handler
|
|
||||||
path = "/provider/#{@provider}/account/#{@account}/networks"
|
|
||||||
path += "?vpc-id=#{@vpc_id}" if @vpc_id
|
|
||||||
@list = get(path)
|
|
||||||
end
|
|
||||||
|
|
||||||
def vpc_handler
|
|
||||||
abort(I18n.t("handler.provider.vpc.invalid_provider")) unless @provider == Providers::Aws
|
|
||||||
@list = get("/provider/#{@provider}/account/#{@account}/vpcs")
|
|
||||||
end
|
|
||||||
|
|
||||||
def security_groups_handler
|
|
||||||
path = "/provider/#{@provider}/account/#{@account}/security_groups"
|
|
||||||
path += "?vpc-id=#{@vpc_id}" if @vpc_id
|
|
||||||
@list = get(path)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,75 +0,0 @@
|
|||||||
require "devops-client/handler/handler"
|
|
||||||
require "devops-client/options/role_options"
|
|
||||||
require "devops-client/output/role"
|
|
||||||
|
|
||||||
class Role < Handler
|
|
||||||
|
|
||||||
output_with Output::Role
|
|
||||||
include InputUtils
|
|
||||||
|
|
||||||
def initialize(host, def_options={})
|
|
||||||
@host, @options = host, def_options
|
|
||||||
@options_parser = RoleOptions.new(ARGV, def_options)
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle
|
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
|
||||||
extract_parameters
|
|
||||||
case @command
|
|
||||||
when :list
|
|
||||||
list_handler
|
|
||||||
output
|
|
||||||
when :show
|
|
||||||
show_handler
|
|
||||||
output
|
|
||||||
when :create
|
|
||||||
create_handler
|
|
||||||
when :delete
|
|
||||||
delete_handler
|
|
||||||
when :policies
|
|
||||||
policies_handler
|
|
||||||
output
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def list_handler
|
|
||||||
@list = get("/security/roles")
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_handler
|
|
||||||
@show = get("/security/role/#{@role_name}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def policies_handler
|
|
||||||
@list = get("/security/policies")
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_handler
|
|
||||||
q = {
|
|
||||||
"name" => @role_name
|
|
||||||
}
|
|
||||||
q["description"] = options[:description] || enter_parameter(I18n.t("handler.role.create.description") + ": ")
|
|
||||||
all = question(I18n.t("handler.role.question.all_policies"))
|
|
||||||
if all
|
|
||||||
q["policies"] = ["all"]
|
|
||||||
else
|
|
||||||
policies_handler
|
|
||||||
|
|
||||||
q["policies"] = if options[:policies]
|
|
||||||
#TODO: validation
|
|
||||||
options[:policies]
|
|
||||||
else
|
|
||||||
@command = :policies
|
|
||||||
select_items_from_table(I18n.t("handler.role.create.policies"), @list, outputter.table).map{|p| p["id"]}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
json = JSON.pretty_generate(q)
|
|
||||||
post_body "/security/role", json if question(I18n.t("handler.role.question.create")){puts json}
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_handler
|
|
||||||
delete("/security/role/#{@role_name}") if question(I18n.t("handler.role.question.delete", role: @role_name))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -9,19 +9,18 @@ class Server < Handler
|
|||||||
|
|
||||||
def initialize(host, def_options={})
|
def initialize(host, def_options={})
|
||||||
@host, @options = host, def_options
|
@host, @options = host, def_options
|
||||||
|
@options_parser = ServerOptions.new(ARGV, def_options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@options_parser = ServerOptions.new(ARGV, @options)
|
@options, @args = @options_parser.parse_options_for!(current_command)
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
case current_command
|
||||||
extract_parameters
|
|
||||||
case @command
|
|
||||||
when :list
|
when :list
|
||||||
list_handler
|
list_handler
|
||||||
output
|
output
|
||||||
when :show
|
when :show
|
||||||
show_handler
|
show_handler
|
||||||
output(server: @server_id)
|
output
|
||||||
when :create
|
when :create
|
||||||
create_handler
|
create_handler
|
||||||
when :delete
|
when :delete
|
||||||
@ -30,8 +29,6 @@ class Server < Handler
|
|||||||
delete_list_handler
|
delete_list_handler
|
||||||
when :bootstrap
|
when :bootstrap
|
||||||
bootstrap_handler
|
bootstrap_handler
|
||||||
when :unbootstrap
|
|
||||||
unbootstrap_handler
|
|
||||||
when :sync
|
when :sync
|
||||||
sync_handler
|
sync_handler
|
||||||
when :pause
|
when :pause
|
||||||
@ -50,20 +47,35 @@ class Server < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def list_handler
|
def list_handler
|
||||||
params = {}
|
if @args[2].nil?
|
||||||
params["provider"] = @provider if @provider
|
@list = get("/servers")
|
||||||
@list = get("/servers", params)
|
return @list
|
||||||
|
end
|
||||||
|
self.options[:type] = @args[2]
|
||||||
|
@list = case @args[2]
|
||||||
|
when "chef"
|
||||||
|
get("/servers/chef").map {|l| {"chef_node_name" => l}}
|
||||||
|
when "ec2", "openstack", "static"
|
||||||
|
get("/servers/#{@args[2]}")
|
||||||
|
else
|
||||||
|
@options_parser.invalid_list_command
|
||||||
|
abort("Invlid argument '#{@args[2]}'")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_handler
|
def create_handler
|
||||||
|
r = inspect_parameters @options_parser.create_params, @args[2], @args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_create_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
|
||||||
q = {
|
q = {
|
||||||
project: @project,
|
:project => @args[2],
|
||||||
environment: @environment,
|
:deploy_env => @args[3]
|
||||||
category: @category
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[:ssh_key, :without_bootstrap, :name, :groups, :skip_rollback, :private_ip].each do |k|
|
[:key, :without_bootstrap, :name, :groups, :force, :private_ip].each do |k|
|
||||||
q[k] = self.options[k] unless self.options[k].nil?
|
q[k] = self.options[k] unless self.options[k].nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -72,10 +84,18 @@ class Server < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def delete_handler
|
def delete_handler
|
||||||
if question(I18n.t("handler.server.question.delete", :id => @server_id))
|
@args[2..-1].each do |name|
|
||||||
jobs_ids = delete("/server/#{@server_id}", options) # returns array with one job id, actually
|
r = inspect_parameters @options_parser.delete_params, name
|
||||||
reports_urls(jobs_ids)
|
unless r.nil?
|
||||||
|
@options_parser.invalid_delete_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
if question(I18n.t("handler.server.question.delete", :name => name))
|
||||||
|
jobs_ids = delete("/server/#{name}", options) # returns array with one job id, actually
|
||||||
|
puts reports_urls(jobs_ids)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# this method differs from #delete_handler in this:
|
# this method differs from #delete_handler in this:
|
||||||
@ -83,8 +103,10 @@ class Server < Handler
|
|||||||
# Timur said we planned to transfer all server requests to using ids by default, that's why
|
# Timur said we planned to transfer all server requests to using ids by default, that's why
|
||||||
# later we could get rid of #delete_list method.
|
# later we could get rid of #delete_list method.
|
||||||
def delete_list_handler
|
def delete_list_handler
|
||||||
if question(I18n.t("handler.server.question.delete_list", ids: @server_id.join(', ')))
|
abort "Please specify at least one server id" if @args.length < 3
|
||||||
servers_jobs = post("/servers/delete", {servers_ids: @server_id})
|
server_ids = @args[2..-1]
|
||||||
|
if question(I18n.t("handler.server.question.delete_list", ids: server_ids.join(', ')))
|
||||||
|
servers_jobs = post("/server/delete_list", {servers_ids: server_ids})
|
||||||
servers_jobs.each do |server_id, job_id|
|
servers_jobs.each do |server_id, job_id|
|
||||||
puts "Report for deleting #{server_id}: #{report_url(job_id)}"
|
puts "Report for deleting #{server_id}: #{report_url(job_id)}"
|
||||||
end
|
end
|
||||||
@ -93,39 +115,47 @@ class Server < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def show_handler
|
def show_handler
|
||||||
@show = get("/server/#{@server_id}")
|
r = inspect_parameters @options_parser.show_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_show_command
|
||||||
|
abort r
|
||||||
|
end
|
||||||
|
@show = get("/server/#{@args[2]}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def bootstrap_handler
|
def bootstrap_handler
|
||||||
q = {}
|
r = inspect_parameters @options_parser.bootstrap_params, @args[2]
|
||||||
[:cm_name, :bootstrap_template, :run_list].each do |k|
|
unless r.nil?
|
||||||
|
@options_parser.invalid_bootstrap_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
q = {
|
||||||
|
:instance_id => @args[2]
|
||||||
|
}
|
||||||
|
[:name, :bootstrap_template, :run_list].each do |k|
|
||||||
q[k] = self.options[k] unless self.options[k].nil?
|
q[k] = self.options[k] unless self.options[k].nil?
|
||||||
end
|
end
|
||||||
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
|
||||||
job_ids = post "/server/#{@server_id}/bootstrap", q
|
job_ids = post "/server/bootstrap", q
|
||||||
reports_urls(job_ids)
|
reports_urls(job_ids)
|
||||||
end
|
end
|
||||||
|
|
||||||
def unbootstrap_handler
|
|
||||||
if question(I18n.t("handler.server.question.unbootstrap", :id => @server_id))
|
|
||||||
job_ids = post("/server/#{@server_id}/unbootstrap")
|
|
||||||
reports_urls(job_ids)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def add_static_handler # add <project> <env> <private_ip> <ssh_username> <keyname> --public-ip <public_ip>
|
def add_static_handler # add <project> <env> <private_ip> <ssh_username> <keyname> --public-ip <public_ip>
|
||||||
|
r = inspect_parameters @options_parser.add_params, @args[2], @args[3], @args[4], @args[5], @args[6]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_add_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
q = {
|
q = {
|
||||||
project: @project,
|
:project => @args[2],
|
||||||
environment: @environment,
|
:deploy_env => @args[3],
|
||||||
category: @category,
|
:private_ip => @args[4],
|
||||||
private_ip: @ip,
|
:remote_user => @args[5],
|
||||||
remote_user: @ssh_user,
|
:key => @args[6]
|
||||||
key: @key_id,
|
|
||||||
name: @name
|
|
||||||
}
|
}
|
||||||
q[:public_ip] = self.options[:public_ip] if self.options[:public_ip]
|
q[:public_ip] = self.options[:public_ip] unless self.options[:public_ip].nil?
|
||||||
post "/server/add", q
|
post "/server/add", q
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -149,19 +179,39 @@ class Server < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def pause_handler
|
def pause_handler
|
||||||
post "/server/#{@server_id}/pause"
|
r = inspect_parameters @options_parser.pause_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_pause_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
post "/server/#{@args[2]}/pause", options
|
||||||
end
|
end
|
||||||
|
|
||||||
def unpause_handler
|
def unpause_handler
|
||||||
post "/server/#{@server_id}/unpause"
|
r = inspect_parameters @options_parser.unpause_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_unpause_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
post "/server/#{@args[2]}/unpause", options
|
||||||
end
|
end
|
||||||
|
|
||||||
def reserve_handler
|
def reserve_handler
|
||||||
post "/server/#{@server_id}/reserve"
|
r = inspect_parameters @options_parser.reserve_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_reserve_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
post "/server/#{@args[2]}/reserve", options
|
||||||
end
|
end
|
||||||
|
|
||||||
def unreserve_handler
|
def unreserve_handler
|
||||||
post "/server/#{@server_id}/unreserve"
|
r = inspect_parameters @options_parser.unreserve_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_unreserve_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
post "/server/#{@args[2]}/unreserve", options
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -13,9 +13,8 @@ class Stack < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
@options, @args = @options_parser.parse_options_for!(current_command)
|
||||||
extract_parameters
|
case current_command
|
||||||
case @command
|
|
||||||
when :list
|
when :list
|
||||||
list_handler
|
list_handler
|
||||||
output
|
output
|
||||||
@ -42,14 +41,11 @@ class Stack < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_handler
|
def create_handler
|
||||||
attrs = {
|
attrs = {}
|
||||||
project: @project,
|
attrs[:project] = options[:project] || resources_selector.select_available_project
|
||||||
environment: @environment,
|
attrs[:deploy_env] = options[:deploy_env] || resources_selector.select_available_env(attrs[:project])
|
||||||
category: @category
|
env = fetcher.fetch_project(attrs[:project])['deploy_envs'].detect {|env| env['identifier'] == attrs[:deploy_env]}
|
||||||
}
|
attrs[:provider] = env['provider']
|
||||||
category = fetcher.fetch_category(@project, @environment, @category)
|
|
||||||
attrs[:provider] = category['provider']['name']
|
|
||||||
attrs[:provider_account] = category['provider']['account']
|
|
||||||
|
|
||||||
params_filepath = options[:parameters_file] || enter_parameter_or_empty(I18n.t('handler.stack.create.parameters_file'))
|
params_filepath = options[:parameters_file] || enter_parameter_or_empty(I18n.t('handler.stack.create.parameters_file'))
|
||||||
if params_filepath.empty?
|
if params_filepath.empty?
|
||||||
@ -65,11 +61,14 @@ class Stack < Handler
|
|||||||
attrs[:tags] = JSON.parse(File.read(tags_filepath))
|
attrs[:tags] = JSON.parse(File.read(tags_filepath))
|
||||||
end
|
end
|
||||||
|
|
||||||
json = JSON.pretty_generate(
|
attrs.merge!(
|
||||||
without_bootstrap: options[:without_bootstrap] || false,
|
launch_options: {
|
||||||
skip_rollback: options[:skip_rollback] || false,
|
without_bootstrap: options[:without_bootstrap] || false,
|
||||||
stack_attributes: attrs
|
skip_rollback: options[:skip_rollback] || false,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
json = JSON.pretty_generate(attrs)
|
||||||
if question(I18n.t("handler.stack.question.create")) {puts json}
|
if question(I18n.t("handler.stack.question.create")) {puts json}
|
||||||
job_ids = post_body "/stack", json
|
job_ids = post_body "/stack", json
|
||||||
reports_urls(job_ids)
|
reports_urls(job_ids)
|
||||||
@ -105,8 +104,14 @@ class Stack < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def delete_handler
|
def delete_handler
|
||||||
if question(I18n.t("handler.stack.question.delete", name: @stack))
|
stack_id = @args[2]
|
||||||
delete "/stack/#{@stack}"
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -14,11 +14,10 @@ class StackTemplate < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
@options, @args = @options_parser.parse_options_for!(current_command)
|
||||||
extract_parameters
|
case current_command
|
||||||
case @command
|
|
||||||
when :list
|
when :list
|
||||||
list_handler(@provider)
|
list_handler
|
||||||
output
|
output
|
||||||
when :show
|
when :show
|
||||||
show_handler
|
show_handler
|
||||||
@ -35,45 +34,74 @@ class StackTemplate < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_handler
|
def create_handler
|
||||||
q = {
|
q = {}
|
||||||
id: options[:id],
|
q[:provider] = options[:provider] || resources_selector.select_available_provider
|
||||||
provider: options[:provider],
|
q[:id] = options[:id] || enter_parameter(I18n.t('handler.stack_template.create.id'))
|
||||||
provider_account: options[:provider_account]
|
|
||||||
}
|
|
||||||
q[:provider] ||= resources_selector.select_available_provider(except: ['static'])
|
|
||||||
q[:provider_account] ||= resources_selector.select_available_provider_account(q[:provider])['account_name']
|
|
||||||
q[:id] ||= enter_parameter(I18n.t('handler.stack_template.create.id'))
|
|
||||||
|
|
||||||
filepath = options[:template_file] || enter_parameter(I18n.t('handler.stack_template.create.template_file'))
|
filepath = options[:template_file] || enter_parameter(I18n.t('handler.stack_template.create.template_file'))
|
||||||
q[:template_body] = get_file_contents(filepath)
|
q[:template_body] = get_file_contents(filepath)
|
||||||
|
|
||||||
if question(I18n.t('handler.stack_template.question.create')) { puts confirming_json(q) }
|
json = JSON.pretty_generate(q)
|
||||||
post_body("/stack_template/#{q[:provider]}", JSON.pretty_generate(q))
|
post_body("/stack_template/#{q[:provider]}", json) if question(I18n.t('handler.stack_template.question.create')){puts json}
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_handler(provider=nil)
|
def list_handler(provider=nil)
|
||||||
@list = if provider
|
provider ||= @options[:given_provider]
|
||||||
|
@list = get_stack_templates(provider)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_stack_templates(provider=nil)
|
||||||
|
if provider
|
||||||
provider_stack_templates(provider)
|
provider_stack_templates(provider)
|
||||||
else
|
else
|
||||||
get("/stack_templates")
|
get("/stack_templates")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def show_handler
|
def show_handler
|
||||||
@show = get "/stack_template/#{@stack_template}"
|
r = inspect_parameters @options_parser.show_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_show_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
@show = get "/stack_template/#{@args[2]}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_handler
|
def delete_handler
|
||||||
if question(I18n.t("handler.stack_template.question.delete", name: @stack_template))
|
r = inspect_parameters(@options_parser.delete_params, @args[2])
|
||||||
delete "/stack_template/#{@stack_template}"
|
unless r.nil?
|
||||||
|
@options_parser.invalid_delete_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
if question(I18n.t("handler.stack_template.question.delete", name: @args[2]))
|
||||||
|
delete "/stack_template/#{@args[2]}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
def update_url_handler
|
||||||
|
r = inspect_parameters @options_parser.update_url_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_update_url_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
stack_template = post "/stack_template/#{@args[2]}/update_template_url"
|
||||||
|
puts stack_template['template_url']
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_available_parameters_handler
|
||||||
|
r = inspect_parameters @options_parser.update_url_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_update_url_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
stack_template = post "/stack_template/#{@args[2]}/update_available_parameters"
|
||||||
|
puts JSON.pretty_generate(stack_template['available_parameters'])
|
||||||
|
end
|
||||||
|
|
||||||
def provider_stack_templates(provider)
|
def provider_stack_templates(provider)
|
||||||
if Providers.has_functionality?(provider, :stack_templates)
|
if Providers.has_functionality?(provider, :stack_templates)
|
||||||
|
@provider = true
|
||||||
@list = get("/stack_templates/provider/#{provider}")
|
@list = get("/stack_templates/provider/#{provider}")
|
||||||
else
|
else
|
||||||
@options_parser.invalid_list_command
|
@options_parser.invalid_list_command
|
||||||
@ -81,10 +109,4 @@ class StackTemplate < Handler
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def confirming_json(hash)
|
|
||||||
to_output = hash.dup
|
|
||||||
to_output[:template_body] = to_output[:template_body][0..40] + '…'
|
|
||||||
JSON.pretty_generate(to_output)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
61
devops-client/lib/devops-client/handler/tag.rb
Normal file
61
devops-client/lib/devops-client/handler/tag.rb
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
require "devops-client/handler/handler"
|
||||||
|
require "devops-client/options/tag_options"
|
||||||
|
require "json"
|
||||||
|
require "devops-client/output/tag"
|
||||||
|
|
||||||
|
class Tag < Handler
|
||||||
|
|
||||||
|
output_with Output::Tag
|
||||||
|
|
||||||
|
def initialize(host, def_options={})
|
||||||
|
@host, @options = host, def_options
|
||||||
|
@options_parser = TagOptions.new(ARGV, def_options)
|
||||||
|
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
|
||||||
|
when :create
|
||||||
|
create_handler
|
||||||
|
when :delete
|
||||||
|
delete_handler
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def list_handler
|
||||||
|
r = inspect_parameters @options_parser.list_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_list_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
@list = get("/tags/#{@args[2]}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_handler
|
||||||
|
if @args.length == 3
|
||||||
|
@options_parser.invalid_create_command
|
||||||
|
abort()
|
||||||
|
end
|
||||||
|
node = @args[2]
|
||||||
|
tags = @args[3..-1]
|
||||||
|
|
||||||
|
post "/tags/#{node}", tags
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_handler
|
||||||
|
if @args.length == 3
|
||||||
|
@options_parser.invalid_delete_command
|
||||||
|
abort()
|
||||||
|
end
|
||||||
|
node = @args[2]
|
||||||
|
tags = @args[3..-1]
|
||||||
|
|
||||||
|
if question(I18n.t("handler.user.question.delete", :name => tags.join("', '"), :node => node))
|
||||||
|
delete "/tags/#{node}", tags
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -7,15 +7,14 @@ class User < Handler
|
|||||||
output_with Output::User
|
output_with Output::User
|
||||||
|
|
||||||
def initialize(host, def_options={})
|
def initialize(host, def_options={})
|
||||||
@host = host
|
@host, @options = host, def_options
|
||||||
@options = def_options
|
|
||||||
@options_parser = UserOptions.new(ARGV, def_options)
|
@options_parser = UserOptions.new(ARGV, def_options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle
|
def handle
|
||||||
@command, @options, @args = @options_parser.parse_options_for!
|
current_command = ARGV[1].to_sym
|
||||||
extract_parameters
|
@options, @args = @options_parser.parse_options_for!(current_command)
|
||||||
case @command
|
case current_command
|
||||||
when :list
|
when :list
|
||||||
list_handler
|
list_handler
|
||||||
output
|
output
|
||||||
@ -23,14 +22,12 @@ class User < Handler
|
|||||||
create_handler
|
create_handler
|
||||||
when :delete
|
when :delete
|
||||||
delete_handler
|
delete_handler
|
||||||
|
when :grant
|
||||||
|
grant_handler
|
||||||
when :password
|
when :password
|
||||||
password_handler
|
password_handler
|
||||||
when :email
|
when :email
|
||||||
email_handler
|
email_handler
|
||||||
when :role_add
|
|
||||||
role_add_handler
|
|
||||||
when :role_delete
|
|
||||||
role_delete_handler
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -39,46 +36,75 @@ class User < Handler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_handler
|
def create_handler
|
||||||
q = {
|
r = inspect_parameters @options_parser.create_params, @args[2], @args[3]
|
||||||
"id" => @user_name,
|
unless r.nil?
|
||||||
"email" => @email
|
@options_parser.invalid_create_command
|
||||||
}
|
abort(r)
|
||||||
q["password"] = self.options[:new_password] || enter_password(@user_name)
|
end
|
||||||
q["roles"] = resources_selector.select_available_roles
|
|
||||||
|
|
||||||
json = JSON.pretty_generate(q)
|
password = self.options[:new_password] || enter_password(@args[2])
|
||||||
post_body "/user", json if question(I18n.t("handler.user.question.create")){puts json}
|
|
||||||
|
q = {
|
||||||
|
"username" => @args[2],
|
||||||
|
"password" => password,
|
||||||
|
"email" => @args[3]
|
||||||
|
}
|
||||||
|
post "/user", q
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_handler
|
def delete_handler
|
||||||
delete "/user/#{@user_name}" if question(I18n.t("handler.user.question.delete", :name => @user_name))
|
r = inspect_parameters @options_parser.delete_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_delete_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
if question(I18n.t("handler.user.question.delete", :name => @args[2]))
|
||||||
|
delete "/user/#{@args[2]}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def password_handler
|
def password_handler
|
||||||
|
r = inspect_parameters @options_parser.password_params, @args[2]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_password_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
|
|
||||||
|
password = enter_password(@args[2])
|
||||||
q = {
|
q = {
|
||||||
"password" => enter_password(@user_name)
|
"password" => password
|
||||||
}
|
}
|
||||||
|
|
||||||
put "/user/#{@user_name}/password", q
|
put "/user/#{@args[2]}/password", q
|
||||||
end
|
end
|
||||||
|
|
||||||
def email_handler
|
def email_handler
|
||||||
|
r = inspect_parameters @options_parser.email_params, @args[2], @args[3]
|
||||||
|
unless r.nil?
|
||||||
|
@options_parser.invalid_email_command
|
||||||
|
abort(r)
|
||||||
|
end
|
||||||
q = {
|
q = {
|
||||||
"email" => @email
|
"email" => @args[3]
|
||||||
}
|
}
|
||||||
put "/user/#{@user_name}/email", q
|
put "/user/#{@args[2]}/email", q
|
||||||
end
|
end
|
||||||
|
|
||||||
def role_add_handler
|
def grant_handler
|
||||||
user = get("/user/#{@user_name}")
|
r = inspect_parameters @options_parser.grant_params, @args[2], @args[3], @args[4]
|
||||||
q = resources_selector.select_available_roles(user["roles"])
|
unless r.nil?
|
||||||
post "/user/#{@user_name}/roles/add", q
|
@options_parser.invalid_grant_command
|
||||||
end
|
abort(r)
|
||||||
|
end
|
||||||
|
|
||||||
def role_delete_handler
|
@args[3] = '' if @args[3].nil?
|
||||||
user = get("/user/#{@user_name}")
|
q = {
|
||||||
q = resources_selector.select_user_roles(user["roles"])
|
'cmd' => @args[3],
|
||||||
post "/user/#{@user_name}/roles/delete", q
|
'privileges' => @args[4]
|
||||||
|
}
|
||||||
|
|
||||||
|
put "/user/#{@args[2]}", q
|
||||||
end
|
end
|
||||||
|
|
||||||
def enter_password user
|
def enter_password user
|
||||||
|
|||||||
@ -0,0 +1,13 @@
|
|||||||
|
require "devops-client/options/common_options"
|
||||||
|
|
||||||
|
class BootstrapTemplatesOptions < CommonOptions
|
||||||
|
|
||||||
|
commands :list
|
||||||
|
|
||||||
|
def initialize args, def_options
|
||||||
|
super(args, def_options)
|
||||||
|
self.header = I18n.t("headers.template")
|
||||||
|
self.banner_header = "templates"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@ -1,91 +0,0 @@
|
|||||||
require "devops-client/options/common_options"
|
|
||||||
require "set"
|
|
||||||
|
|
||||||
class CategoryOptions < CommonOptions
|
|
||||||
|
|
||||||
commands :create, :delete, :deploy, :list, {:servers => [:list, :delete]}, :stacks, {:set => [:run_list]}, :show, :update
|
|
||||||
|
|
||||||
COMMAND_NAME = "cat"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
|
||||||
super(args, def_options)
|
|
||||||
self.header = I18n.t("headers.category")
|
|
||||||
id = "PROJECT_ID"
|
|
||||||
env = "ENVIRONMENT"
|
|
||||||
cat = "CATEGORY"
|
|
||||||
self.list_params = [id, env]
|
|
||||||
self.show_params = [id, env, cat]
|
|
||||||
self.create_params = [id, env, cat]
|
|
||||||
self.delete_params = [id, env, cat]
|
|
||||||
self.deploy_params = [id, env, cat]
|
|
||||||
self.set_run_list_params = [id, env, cat, "[RUN_LIST...]"]
|
|
||||||
self.servers_list_params = [id, env, cat]
|
|
||||||
#self.stacks_params = [id, "[#{env}]", "[#{cat}]"]
|
|
||||||
self.update_params = [id, env, cat, "FILE"]
|
|
||||||
#self.delete_servers_params = [id, "[#{env}]"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_options
|
|
||||||
self.options do |parser, options|
|
|
||||||
parser.banner << self.create_banner
|
|
||||||
parser.resource_name = :project
|
|
||||||
|
|
||||||
parser.recognize_option_value(:groups, variable: 'GROUP_1,GROUP_2...') do |groups|
|
|
||||||
options[:groups] = groups.split(",")
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:file) do |file|
|
|
||||||
abort("File '#{file}' does not exist") unless File.exist?(file)
|
|
||||||
options[:file] = file
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:subnets, variable: 'SUBNET_1,SUBNET_2...') do |subnets|
|
|
||||||
options[:subnets] = subnets.split(",")
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:users, variable: 'USER_1,USER_2...') do |users|
|
|
||||||
options[:users] = Set.new(users.split(","))
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:run_list, variable: 'ROLE_1,ROLE_2...') do |run_list|
|
|
||||||
options[:run_list] = Set.new(run_list.split(",")).to_a
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:deploy_env, option_key: :identifier)
|
|
||||||
parser.recognize_option_value(:flavor)
|
|
||||||
parser.recognize_option_value(:image)
|
|
||||||
parser.recognize_option_value(:run_list)
|
|
||||||
parser.recognize_option_value(:provider)
|
|
||||||
parser.recognize_option_value(:no_expires, type: :switch, switch_value: true, default: false)
|
|
||||||
parser.recognize_option_value(:expires)
|
|
||||||
|
|
||||||
|
|
||||||
# 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 deploy_options
|
|
||||||
options do |parser, options|
|
|
||||||
parser.banner << self.deploy_banner
|
|
||||||
|
|
||||||
parser.recognize_option_value(:servers, resource_name: :project, command_name: 'deploy') do |servers|
|
|
||||||
options[:servers] = servers.split(",")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_servers_options
|
|
||||||
self.options do |parser, options|
|
|
||||||
parser.recognize_option_value(:dry_run, resource_name: :project, type: :switch, default: false, switch_value: true, command_name: 'delete_servers')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
require "devops-client/options/common_options"
|
|
||||||
|
|
||||||
class ChefOptions < CommonOptions
|
|
||||||
|
|
||||||
commands :bootstrap_templates, tags: [:list, :set, :unset]
|
|
||||||
|
|
||||||
COMMAND_NAME = "chef"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
|
||||||
super(args, def_options)
|
|
||||||
self.header = I18n.t("headers.chef")
|
|
||||||
self.banner_header = COMMAND_NAME
|
|
||||||
self.bootstrap_templates_params = []
|
|
||||||
self.tags_list_params = ["CM_NAME"]
|
|
||||||
self.tags_set_params = ["CM_NAME", "TAGS..."]
|
|
||||||
self.tags_unset_params = ["CM_NAME", "TAGS..."]
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -13,27 +13,22 @@ class CommonOptions
|
|||||||
CSV_FORMAT = "csv"
|
CSV_FORMAT = "csv"
|
||||||
OUTPUT_FROMATS = [TABLE_FORMAT, JSON_FORMAT, CSV_FORMAT]
|
OUTPUT_FROMATS = [TABLE_FORMAT, JSON_FORMAT, CSV_FORMAT]
|
||||||
|
|
||||||
# skip command name and subcommand
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
self.args = args
|
self.args = args
|
||||||
self.default_options = def_options
|
self.default_options = def_options
|
||||||
self.banner_header = self.class::COMMAND_NAME
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.commands *cmds
|
def self.commands *cmds
|
||||||
acommands = []
|
define_method :available_commands do
|
||||||
|
cmds
|
||||||
|
end
|
||||||
|
|
||||||
cmds.each do |cmd|
|
cmds.each do |cmd|
|
||||||
if cmd.is_a?(Hash)
|
if cmd.is_a?(Hash)
|
||||||
key = cmd.keys[0]
|
key = cmd.keys[0]
|
||||||
acommands.push key.to_sym
|
|
||||||
cmd[key].each do |subcmd|
|
cmd[key].each do |subcmd|
|
||||||
create_command key.to_s, subcmd.to_s
|
create_command key.to_s, subcmd.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
define_method "#{key}_subcommands" do
|
|
||||||
cmd[key]
|
|
||||||
end
|
|
||||||
|
|
||||||
invalid_command_method = "invalid_#{key}_command"
|
invalid_command_method = "invalid_#{key}_command"
|
||||||
banner_method = "#{key}_banner"
|
banner_method = "#{key}_banner"
|
||||||
|
|
||||||
@ -45,19 +40,10 @@ class CommonOptions
|
|||||||
cmd[key].map{|sc| self.send("#{key}_#{sc}_banner")}.join("") + "\n"
|
cmd[key].map{|sc| self.send("#{key}_#{sc}_banner")}.join("") + "\n"
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
acommands.push cmd.to_sym
|
|
||||||
create_command cmd.to_s
|
create_command cmd.to_s
|
||||||
|
|
||||||
define_method "#{cmd}_subcommands" do
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
define_method :available_commands do
|
|
||||||
acommands
|
|
||||||
end
|
|
||||||
|
|
||||||
define_method "banners" do
|
define_method "banners" do
|
||||||
r = []
|
r = []
|
||||||
cmds.each do |cmd|
|
cmds.each do |cmd|
|
||||||
@ -121,25 +107,13 @@ class CommonOptions
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# returns [command, options, args] because they are always needed together
|
# returns [options, args] because they are always needed together
|
||||||
# will exit if operation is unsupported
|
# will exit if operation is unsupported
|
||||||
def parse_options_for!
|
def parse_options_for!(command)
|
||||||
if !ARGV[1] || ARGV[1].start_with?("-")
|
|
||||||
invalid_command
|
|
||||||
end
|
|
||||||
command = ARGV[1].to_sym
|
|
||||||
# available_commands method is defined dinamically in .commands method
|
# available_commands method is defined dinamically in .commands method
|
||||||
if available_commands.include?(command)
|
if available_commands.include?(command)
|
||||||
subcommands = send("#{command}_subcommands")
|
|
||||||
n = 2
|
|
||||||
unless subcommands.empty?
|
|
||||||
n = 3
|
|
||||||
return invalid_command if !ARGV[2] || !subcommands.include?(ARGV[2].to_sym)
|
|
||||||
command = "#{command}_#{ARGV[2]}".to_sym
|
|
||||||
end
|
|
||||||
|
|
||||||
options = send("#{command}_options")
|
options = send("#{command}_options")
|
||||||
[command, options, args[n..-1]]
|
[options, args]
|
||||||
else
|
else
|
||||||
invalid_command
|
invalid_command
|
||||||
end
|
end
|
||||||
|
|||||||
@ -4,8 +4,6 @@ class DeployOptions < CommonOptions
|
|||||||
|
|
||||||
attr_accessor :deploy_params
|
attr_accessor :deploy_params
|
||||||
|
|
||||||
COMMAND_NAME = "deploy"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.deploy")
|
self.header = I18n.t("headers.deploy")
|
||||||
|
|||||||
@ -1,108 +0,0 @@
|
|||||||
require "devops-client/options/common_options"
|
|
||||||
require "set"
|
|
||||||
|
|
||||||
class EnvironmentOptions < CommonOptions
|
|
||||||
|
|
||||||
commands :create, :delete, :deploy, :list, {:servers => [:list, :delete]}, :stacks, {:set => [:run_list]}, :show, :update, {:user => [:add, :delete]}
|
|
||||||
|
|
||||||
COMMAND_NAME = "env"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
|
||||||
super(args, def_options)
|
|
||||||
self.header = I18n.t("headers.environment")
|
|
||||||
id = "PROJECT_ID"
|
|
||||||
env = "ENVIRONMENT"
|
|
||||||
self.list_params = [id]
|
|
||||||
self.show_params = [id, env]
|
|
||||||
self.create_params = [id, env]
|
|
||||||
self.delete_params = [id, env]
|
|
||||||
self.deploy_params = [id, env]
|
|
||||||
self.set_run_list_params = [id, env, "[RUN_LIST...]"]
|
|
||||||
self.servers_list_params = [id, env]
|
|
||||||
#self.stacks_params = [id, "[#{env}]", "[#{cat}]"]
|
|
||||||
self.update_params = [id, env, "FILE"]
|
|
||||||
self.user_add_params = [id, env]
|
|
||||||
self.user_delete_params = [id, env, "USER..."]
|
|
||||||
#self.delete_servers_params = [id, "[#{env}]"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_options
|
|
||||||
self.options do |parser, options|
|
|
||||||
parser.banner << self.create_banner
|
|
||||||
parser.resource_name = :project
|
|
||||||
|
|
||||||
parser.recognize_option_value(:groups, variable: 'GROUP_1,GROUP_2...') do |groups|
|
|
||||||
options[:groups] = groups.split(",")
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:file) do |file|
|
|
||||||
abort("File '#{file}' does not exist") unless File.exist?(file)
|
|
||||||
options[:file] = file
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:subnets, variable: 'SUBNET_1,SUBNET_2...') do |subnets|
|
|
||||||
options[:subnets] = subnets.split(",")
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:users, variable: 'USER_1,USER_2...') do |users|
|
|
||||||
options[:users] = Set.new(users.split(","))
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:run_list, variable: 'ROLE_1,ROLE_2...') do |run_list|
|
|
||||||
options[:run_list] = Set.new(run_list.split(",")).to_a
|
|
||||||
end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:deploy_env, option_key: :identifier)
|
|
||||||
parser.recognize_option_value(:flavor)
|
|
||||||
parser.recognize_option_value(:image)
|
|
||||||
parser.recognize_option_value(:run_list)
|
|
||||||
parser.recognize_option_value(:provider)
|
|
||||||
parser.recognize_option_value(:no_expires, type: :switch, switch_value: true, default: false)
|
|
||||||
parser.recognize_option_value(:expires)
|
|
||||||
|
|
||||||
|
|
||||||
# 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 |parser, options|
|
|
||||||
parser.banner << self.user_add_banner
|
|
||||||
|
|
||||||
parser.recognize_option_value(:deploy_env, resource_name: :project, command_name: 'user_add')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_delete_options
|
|
||||||
self.options do |parser, options|
|
|
||||||
parser.banner << self.user_delete_banner
|
|
||||||
|
|
||||||
parser.recognize_option_value(:deploy_env, resource_name: :project, command_name: 'user_delete')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def deploy_options
|
|
||||||
options do |parser, options|
|
|
||||||
parser.banner << self.deploy_banner
|
|
||||||
|
|
||||||
parser.recognize_option_value(:servers, resource_name: :project, command_name: 'deploy') do |servers|
|
|
||||||
options[:servers] = servers.split(",")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def delete_servers_options
|
|
||||||
self.options do |parser, options|
|
|
||||||
parser.recognize_option_value(:dry_run, resource_name: :project, type: :switch, default: false, switch_value: true, command_name: 'delete_servers')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -5,14 +5,13 @@ class FilterOptions < CommonOptions
|
|||||||
|
|
||||||
commands :image => [:add, :delete, :list]
|
commands :image => [:add, :delete, :list]
|
||||||
|
|
||||||
COMMAND_NAME = "filter"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.filters")
|
self.header = I18n.t("headers.filters")
|
||||||
|
self.banner_header = "filter"
|
||||||
p = "PROVIDER"
|
p = "PROVIDER"
|
||||||
self.image_list_params = [p]
|
self.image_list_params = [p]
|
||||||
i = "IMAGE..."
|
i = "IMAGE [IMAGE ...]"
|
||||||
self.image_add_params = [p, i]
|
self.image_add_params = [p, i]
|
||||||
self.image_delete_params = [p, i]
|
self.image_delete_params = [p, i]
|
||||||
end
|
end
|
||||||
|
|||||||
19
devops-client/lib/devops-client/options/flavor_options.rb
Normal file
19
devops-client/lib/devops-client/options/flavor_options.rb
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
require "optparse"
|
||||||
|
require "devops-client/options/common_options"
|
||||||
|
|
||||||
|
class FlavorOptions < CommonOptions
|
||||||
|
|
||||||
|
commands :list
|
||||||
|
|
||||||
|
def initialize args, def_options
|
||||||
|
super(args, def_options)
|
||||||
|
self.header = I18n.t("headers.flavor")
|
||||||
|
self.banner_header = "flavor"
|
||||||
|
self.list_params = ["PROVIDER"]
|
||||||
|
end
|
||||||
|
|
||||||
|
extend_options_method :list_options do |options|
|
||||||
|
options[:given_provider] = args[2] if args[2]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
19
devops-client/lib/devops-client/options/group_options.rb
Normal file
19
devops-client/lib/devops-client/options/group_options.rb
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
require "optparse"
|
||||||
|
require "devops-client/options/common_options"
|
||||||
|
|
||||||
|
class GroupOptions < CommonOptions
|
||||||
|
|
||||||
|
commands :list
|
||||||
|
|
||||||
|
def initialize args, def_options
|
||||||
|
super(args, def_options)
|
||||||
|
self.header = I18n.t("headers.group")
|
||||||
|
self.banner_header = "group"
|
||||||
|
self.list_params = ["PROVIDER", "[VPC-ID]"]
|
||||||
|
end
|
||||||
|
|
||||||
|
extend_options_method :list_options do |options|
|
||||||
|
options[:given_provider] = args[2] if args[2]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@ -4,15 +4,13 @@ class ImageOptions < CommonOptions
|
|||||||
|
|
||||||
commands :create, :delete, :list, :show, :update
|
commands :create, :delete, :list, :show, :update
|
||||||
|
|
||||||
COMMAND_NAME = "image"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.image")
|
self.header = I18n.t("headers.image")
|
||||||
self.list_params = ["[PROVIDER]"]
|
self.banner_header = "image"
|
||||||
|
self.list_params = ["[provider]", "[ec2|openstack]"]
|
||||||
self.show_params = ["IMAGE"]
|
self.show_params = ["IMAGE"]
|
||||||
self.create_params = []
|
self.delete_params = ["IMAGE"]
|
||||||
self.delete_params = ["IMAGE" ]
|
|
||||||
self.update_params = ["IMAGE", "FILE"]
|
self.update_params = ["IMAGE", "FILE"]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -22,9 +20,10 @@ class ImageOptions < CommonOptions
|
|||||||
parser.resource_name = :image
|
parser.resource_name = :image
|
||||||
|
|
||||||
parser.recognize_option_value(:provider)
|
parser.recognize_option_value(:provider)
|
||||||
parser.recognize_option_value(:provider_account)
|
|
||||||
parser.recognize_option_value(:image_id)
|
parser.recognize_option_value(:image_id)
|
||||||
parser.recognize_option_value(:ssh_username)
|
parser.recognize_option_value(:ssh_username)
|
||||||
|
parser.recognize_option_value(:bootstrap_template)
|
||||||
|
parser.recognize_option_value(:no_bootstrap_template, type: :switch, switch_value: true, default: false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -3,12 +3,10 @@ require "devops-client/options/common_options"
|
|||||||
class KeyOptions < CommonOptions
|
class KeyOptions < CommonOptions
|
||||||
commands :add, :delete, :list
|
commands :add, :delete, :list
|
||||||
|
|
||||||
COMMAND_NAME = "key"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.key")
|
self.header = I18n.t("headers.key")
|
||||||
self.list_params = []
|
self.banner_header = "key"
|
||||||
self.add_params = ["KEY_NAME", "FILE"]
|
self.add_params = ["KEY_NAME", "FILE"]
|
||||||
self.delete_params = ["KEY_NAME"]
|
self.delete_params = ["KEY_NAME"]
|
||||||
end
|
end
|
||||||
|
|||||||
@ -2,49 +2,42 @@ require "optparse"
|
|||||||
require "devops-client/options/server_options"
|
require "devops-client/options/server_options"
|
||||||
require "devops-client/options/image_options"
|
require "devops-client/options/image_options"
|
||||||
require "devops-client/options/project_options"
|
require "devops-client/options/project_options"
|
||||||
require "devops-client/options/environment_options"
|
|
||||||
require "devops-client/options/category_options"
|
|
||||||
require "devops-client/options/provider_options"
|
require "devops-client/options/provider_options"
|
||||||
|
require "devops-client/options/flavor_options"
|
||||||
require "devops-client/options/common_options"
|
require "devops-client/options/common_options"
|
||||||
|
require "devops-client/options/group_options"
|
||||||
require "devops-client/options/deploy_options"
|
require "devops-client/options/deploy_options"
|
||||||
require "devops-client/options/key_options"
|
require "devops-client/options/key_options"
|
||||||
require "devops-client/options/user_options"
|
require "devops-client/options/user_options"
|
||||||
|
require "devops-client/options/tag_options"
|
||||||
require "devops-client/options/script_options"
|
require "devops-client/options/script_options"
|
||||||
require "devops-client/options/filter_options"
|
require "devops-client/options/filter_options"
|
||||||
require "devops-client/options/chef_options"
|
require "devops-client/options/network_options"
|
||||||
require "devops-client/options/role_options"
|
require "devops-client/options/bootstrap_templates_options"
|
||||||
require "devops-client/options/stack_template_options"
|
|
||||||
require "devops-client/options/stack_options"
|
|
||||||
|
|
||||||
class Main < CommonOptions
|
class Main < CommonOptions
|
||||||
|
|
||||||
COMMAND_NAME = ""
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def info
|
def info
|
||||||
o = nil
|
o = nil
|
||||||
classes = [
|
|
||||||
ChefOptions,
|
|
||||||
DeployOptions,
|
|
||||||
FilterOptions,
|
|
||||||
ImageOptions,
|
|
||||||
KeyOptions,
|
|
||||||
ProjectOptions,
|
|
||||||
EnvironmentOptions,
|
|
||||||
CategoryOptions,
|
|
||||||
ProviderOptions,
|
|
||||||
ScriptOptions,
|
|
||||||
ServerOptions,
|
|
||||||
UserOptions,
|
|
||||||
RoleOptions,
|
|
||||||
StackTemplateOptions,
|
|
||||||
StackOptions
|
|
||||||
]
|
|
||||||
options do |opts, options|
|
options do |opts, options|
|
||||||
classes.each {|cl| opts.banner << cl.new(ARGV, default_options).error_banner}
|
opts.banner << BootstrapTemplatesOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << DeployOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << FilterOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << FlavorOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << GroupOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << ImageOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << KeyOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << NetworkOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << ProjectOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << ProviderOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << ScriptOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << ServerOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << TagOptions.new(ARGV, default_options).error_banner
|
||||||
|
opts.banner << UserOptions.new(ARGV, default_options).error_banner
|
||||||
o = opts
|
o = opts
|
||||||
end
|
end
|
||||||
puts(o.banner + "\n")
|
puts(o.banner + "\n")
|
||||||
|
|||||||
20
devops-client/lib/devops-client/options/network_options.rb
Normal file
20
devops-client/lib/devops-client/options/network_options.rb
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
require "optparse"
|
||||||
|
require "devops-client/options/common_options"
|
||||||
|
|
||||||
|
class NetworkOptions < CommonOptions
|
||||||
|
|
||||||
|
commands :list
|
||||||
|
|
||||||
|
def initialize args, def_options
|
||||||
|
super(args, def_options)
|
||||||
|
self.header = I18n.t("headers.network")
|
||||||
|
self.banner_header = "network"
|
||||||
|
self.list_params = ["PROVIDER"]
|
||||||
|
end
|
||||||
|
|
||||||
|
extend_options_method :list_options do |options|
|
||||||
|
options[:given_provider] = args[2] if args[2]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
@ -3,26 +3,27 @@ require "set"
|
|||||||
|
|
||||||
class ProjectOptions < CommonOptions
|
class ProjectOptions < CommonOptions
|
||||||
|
|
||||||
commands :create, :delete, :list, {:set => [:run_list]}, :show, :update, {:user => [:add, :delete]}, :archive, :unarchive
|
commands :create, :delete, :deploy, :list, {:multi => [:create]}, :servers, :stacks, {:set => [:run_list]}, :show, :test, :update, {:user => [:add, :delete]}, :delete_servers
|
||||||
|
|
||||||
COMMAND_NAME = "project"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.project")
|
self.header = I18n.t("headers.project")
|
||||||
|
self.banner_header = "project"
|
||||||
id = "PROJECT_ID"
|
id = "PROJECT_ID"
|
||||||
env = "ENVIRONMENT"
|
env = "DEPLOY_ENV"
|
||||||
cat = "CATEGORY"
|
|
||||||
self.list_params = []
|
|
||||||
self.show_params = [id]
|
self.show_params = [id]
|
||||||
self.archive_params = [id]
|
|
||||||
self.unarchive_params = [id]
|
|
||||||
self.create_params = [id]
|
self.create_params = [id]
|
||||||
self.delete_params = [id]
|
self.delete_params = [id, "[#{env}]"]
|
||||||
self.set_run_list_params = [id, "[RUN_LIST...]"]
|
self.deploy_params = [id, "[#{env}]"]
|
||||||
|
self.set_run_list_params = [id, env, "[(recipe[mycookbook::myrecipe])|(role[myrole]) ...]"]
|
||||||
|
self.servers_params = [id, "[#{env}]"]
|
||||||
|
self.stacks_params = [id, "[#{env}]"]
|
||||||
|
self.multi_create_params = [id]
|
||||||
self.update_params = [id, "FILE"]
|
self.update_params = [id, "FILE"]
|
||||||
self.user_add_params = [id, "USER_NAME..."]
|
self.user_add_params = [id, "USER_NAME", "[USER_NAME ...]"]
|
||||||
self.user_delete_params = [id, "USER_NAME..."]
|
self.user_delete_params = [id, "USER_NAME", "[USER_NAME ...]"]
|
||||||
|
self.test_params = [id, env]
|
||||||
|
self.delete_servers_params = [id, "[#{env}]"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_options
|
def create_options
|
||||||
@ -30,22 +31,31 @@ class ProjectOptions < CommonOptions
|
|||||||
parser.banner << self.create_banner
|
parser.banner << self.create_banner
|
||||||
parser.resource_name = :project
|
parser.resource_name = :project
|
||||||
|
|
||||||
|
parser.recognize_option_value(:groups, variable: 'GROUP_1,GROUP_2...') do |groups|
|
||||||
|
options[:groups] = groups.split(",")
|
||||||
|
end
|
||||||
|
|
||||||
parser.recognize_option_value(:file) do |file|
|
parser.recognize_option_value(:file) do |file|
|
||||||
abort("File '#{file}' does not exist") unless File.exist?(file)
|
abort("File '#{file}' does not exist") unless File.exist?(file)
|
||||||
options[:file] = file
|
options[:file] = file
|
||||||
end
|
end
|
||||||
|
|
||||||
parser.recognize_option_value(:description) do |description|
|
parser.recognize_option_value(:subnets, variable: 'SUBNET_1,SUBNET_2...') do |subnets|
|
||||||
options[:description] = description
|
options[:subnets] = subnets.split(",")
|
||||||
end
|
end
|
||||||
|
|
||||||
parser.recognize_option_value(:project_users, variable: 'USER_1,USER_2...') do |users|
|
parser.recognize_option_value(:users, variable: 'USER_1,USER_2...') do |users|
|
||||||
options[:users] = Set.new(users.split(",")).to_a
|
options[:users] = Set.new(users.split(","))
|
||||||
end
|
end
|
||||||
|
|
||||||
parser.recognize_option_value(:run_list, variable: 'ROLE_1,ROLE_2...') do |run_list|
|
parser.recognize_option_value(:deploy_env, option_key: :identifier)
|
||||||
options[:run_list] = Set.new(run_list.split(",")).to_a
|
parser.recognize_option_value(:flavor)
|
||||||
end
|
parser.recognize_option_value(:image)
|
||||||
|
parser.recognize_option_value(:run_list)
|
||||||
|
parser.recognize_option_value(:provider)
|
||||||
|
parser.recognize_option_value(:no_expires, type: :switch, switch_value: true, default: false)
|
||||||
|
parser.recognize_option_value(:expires)
|
||||||
|
|
||||||
|
|
||||||
# TODO:
|
# TODO:
|
||||||
# support short options names
|
# support short options names
|
||||||
@ -59,4 +69,36 @@ class ProjectOptions < CommonOptions
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user_add_options
|
||||||
|
self.options do |parser, options|
|
||||||
|
parser.banner << self.user_add_banner
|
||||||
|
|
||||||
|
parser.recognize_option_value(:deploy_env, resource_name: :project, command_name: 'user_add')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_delete_options
|
||||||
|
self.options do |parser, options|
|
||||||
|
parser.banner << self.user_delete_banner
|
||||||
|
|
||||||
|
parser.recognize_option_value(:deploy_env, resource_name: :project, command_name: 'user_delete')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def deploy_options
|
||||||
|
options do |parser, options|
|
||||||
|
parser.banner << self.deploy_banner
|
||||||
|
|
||||||
|
parser.recognize_option_value(:servers, resource_name: :project, command_name: 'deploy') do |servers|
|
||||||
|
options[:servers] = servers.split(",")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_servers_options
|
||||||
|
self.options do |parser, options|
|
||||||
|
parser.recognize_option_value(:dry_run, resource_name: :project, type: :switch, default: false, switch_value: true, command_name: 'delete_servers')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -3,35 +3,14 @@ require "devops-client/options/common_options"
|
|||||||
|
|
||||||
class ProviderOptions < CommonOptions
|
class ProviderOptions < CommonOptions
|
||||||
|
|
||||||
commands :list, :accounts, {:account => [:create, :delete]}, :flavors, :images, :networks, :security_groups, :vpc
|
commands :list, :accounts
|
||||||
|
|
||||||
COMMAND_NAME = "provider"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.provider")
|
self.header = I18n.t("headers.provider")
|
||||||
|
self.banner_header = "provider"
|
||||||
self.list_params = []
|
self.list_params = []
|
||||||
self.accounts_params = %w(PROVIDER)
|
self.accounts_params = %w(PROVIDER)
|
||||||
self.account_create_params = %w(PROVIDER ACCOUNT)
|
|
||||||
self.account_delete_params = %w(PROVIDER ACCOUNT)
|
|
||||||
self.flavors_params = %w(PROVIDER ACCOUNT)
|
|
||||||
self.images_params = %w(PROVIDER ACCOUNT)
|
|
||||||
self.networks_params = %w(PROVIDER ACCOUNT)
|
|
||||||
self.security_groups_params = %w(PROVIDER ACCOUNT [VPC_ID])
|
|
||||||
self.vpc_params = %w(PROVIDER ACCOUNT)
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_create_options
|
|
||||||
self.options do |parser, options|
|
|
||||||
parser.banner << self.account_create_banner
|
|
||||||
parser.resource_name = "provider.account"
|
|
||||||
|
|
||||||
parser.recognize_option_value(:description)
|
|
||||||
parser.recognize_option_value(:ssh_key)
|
|
||||||
parser.recognize_option_value(:use_iam_profile, type: :switch, switch_value: true, default: false)
|
|
||||||
parser.recognize_option_value(:access_key_id)
|
|
||||||
parser.recognize_option_value(:secret_access_key)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,28 +0,0 @@
|
|||||||
require "devops-client/options/common_options"
|
|
||||||
|
|
||||||
class RoleOptions < CommonOptions
|
|
||||||
commands :list, :policies, :create, :delete, :show
|
|
||||||
|
|
||||||
COMMAND_NAME = "role"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
|
||||||
super(args, def_options)
|
|
||||||
self.header = I18n.t("headers.role")
|
|
||||||
self.policies_params = []
|
|
||||||
self.create_params = ["ROLE_NAME"]
|
|
||||||
self.delete_params = ["ROLE_NAME"]
|
|
||||||
self.show_params = ["ROLE_NAME"]
|
|
||||||
self.list_params = []
|
|
||||||
end
|
|
||||||
|
|
||||||
=begin
|
|
||||||
def create_options
|
|
||||||
self.options do |parser, options|
|
|
||||||
parser.banner << self.create_banner
|
|
||||||
|
|
||||||
parser.recognize_option_value(:new_password, resource_name: :user)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
=end
|
|
||||||
|
|
||||||
end
|
|
||||||
@ -4,11 +4,10 @@ class ScriptOptions < CommonOptions
|
|||||||
|
|
||||||
commands :list, :add, :delete, :run, :command
|
commands :list, :add, :delete, :run, :command
|
||||||
|
|
||||||
COMMAND_NAME = "script"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.script")
|
self.header = I18n.t("headers.script")
|
||||||
|
self.banner_header = "script"
|
||||||
sname = "SCRIPT_NAME"
|
sname = "SCRIPT_NAME"
|
||||||
self.add_params = [sname, "FILE"]
|
self.add_params = [sname, "FILE"]
|
||||||
self.delete_params = [sname]
|
self.delete_params = [sname]
|
||||||
|
|||||||
@ -2,26 +2,23 @@ require "devops-client/options/common_options"
|
|||||||
|
|
||||||
class ServerOptions < CommonOptions
|
class ServerOptions < CommonOptions
|
||||||
|
|
||||||
commands :add, :bootstrap, :create, :delete, :list, :pause, :reserve, :show, :unpause, :unreserve, :unbootstrap, :delete_list, :add_and_bootstrap_list
|
commands :add, :bootstrap, :create, :delete, :list, :pause, :reserve, :show, :unpause, :unreserve, :delete_list, :add_and_bootstrap_list
|
||||||
|
|
||||||
COMMAND_NAME = "server"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.server")
|
self.header = I18n.t("headers.server")
|
||||||
self.list_params = ["[PROVIDER]"]
|
self.banner_header = "server"
|
||||||
self.create_params = ["PROJECT", "ENVIRONMENT", "CATEGORY"]
|
self.list_params = ["[chef|ec2|openstack|static]"]
|
||||||
server_id = ["SERVER_ID"]
|
self.create_params = ["PROJECT_ID", "DEPLOY_ENV"]
|
||||||
self.delete_list_params = ["SERVER_ID..."]
|
node_params = ["NODE_NAME"]
|
||||||
self.delete_params = server_id
|
self.delete_params = node_params
|
||||||
self.show_params = server_id
|
self.show_params = node_params
|
||||||
self.pause_params = server_id
|
self.pause_params = node_params
|
||||||
self.unpause_params = server_id
|
self.unpause_params = node_params
|
||||||
self.reserve_params = server_id
|
self.reserve_params = node_params
|
||||||
self.unreserve_params = server_id
|
self.unreserve_params = node_params
|
||||||
self.bootstrap_params = server_id
|
self.bootstrap_params = ["INSTANCE_ID"]
|
||||||
self.unbootstrap_params = server_id
|
self.add_params = ["PROJECT_ID", "DEPLOY_ENV", "IP", "SSH_USER", "KEY_ID"]
|
||||||
self.add_params = ["PROJECT", "ENVIRONMENT", "CATEGORY", "IP", "SSH_USER", "KEY_ID", "NAME"]
|
|
||||||
self.add_and_bootstrap_list_params = ["PROJECT_ID", "DEPLOY_ENV", "SSH_USER", "KEY_ID", "IPS_FILE"]
|
self.add_and_bootstrap_list_params = ["PROJECT_ID", "DEPLOY_ENV", "SSH_USER", "KEY_ID", "IPS_FILE"]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -31,6 +28,13 @@ class ServerOptions < CommonOptions
|
|||||||
parser.resource_name = :server
|
parser.resource_name = :server
|
||||||
parser.command_name = :delete
|
parser.command_name = :delete
|
||||||
|
|
||||||
|
parser.recognize_option_value(:instance,
|
||||||
|
type: :switch,
|
||||||
|
default: 'node',
|
||||||
|
switch_value: 'instance',
|
||||||
|
option_key: :key
|
||||||
|
)
|
||||||
|
|
||||||
parser.recognize_option_value(:no_ask,
|
parser.recognize_option_value(:no_ask,
|
||||||
type: :switch,
|
type: :switch,
|
||||||
default: false,
|
default: false,
|
||||||
@ -39,6 +43,66 @@ class ServerOptions < CommonOptions
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def pause_options
|
||||||
|
options do |parser, options|
|
||||||
|
parser.banner << self.delete_banner
|
||||||
|
|
||||||
|
parser.recognize_option_value(:instance,
|
||||||
|
resource_name: :server,
|
||||||
|
command_name: :pause,
|
||||||
|
type: :switch,
|
||||||
|
default: 'node',
|
||||||
|
switch_value: 'instance',
|
||||||
|
option_key: :key
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def unpause_options
|
||||||
|
options do |parser, options|
|
||||||
|
parser.banner << self.delete_banner
|
||||||
|
|
||||||
|
parser.recognize_option_value(:instance,
|
||||||
|
resource_name: :server,
|
||||||
|
command_name: :unpause,
|
||||||
|
type: :switch,
|
||||||
|
default: 'node',
|
||||||
|
switch_value: 'instance',
|
||||||
|
option_key: :key
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def reserve_options
|
||||||
|
options do |parser, options|
|
||||||
|
parser.banner << self.delete_banner
|
||||||
|
|
||||||
|
parser.recognize_option_value(:instance,
|
||||||
|
resource_name: :server,
|
||||||
|
command_name: :reserve,
|
||||||
|
type: :switch,
|
||||||
|
default: 'node',
|
||||||
|
switch_value: 'instance',
|
||||||
|
option_key: :key
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def unreserve_options
|
||||||
|
options do |parser, options|
|
||||||
|
parser.banner << self.delete_banner
|
||||||
|
|
||||||
|
parser.recognize_option_value(:instance,
|
||||||
|
resource_name: :server,
|
||||||
|
command_name: :unreserve,
|
||||||
|
type: :switch,
|
||||||
|
default: 'node',
|
||||||
|
switch_value: 'instance',
|
||||||
|
option_key: :key
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def create_options
|
def create_options
|
||||||
options do |parser, options|
|
options do |parser, options|
|
||||||
parser.banner << self.create_banner
|
parser.banner << self.create_banner
|
||||||
@ -53,22 +117,15 @@ class ServerOptions < CommonOptions
|
|||||||
)
|
)
|
||||||
|
|
||||||
parser.recognize_option_value(:name, short: '-N')
|
parser.recognize_option_value(:name, short: '-N')
|
||||||
parser.recognize_option_value('skip_rollback',
|
parser.recognize_option_value(:force, short: '-f')
|
||||||
type: :switch,
|
parser.recognize_option_value(:key)
|
||||||
switch_value: true,
|
|
||||||
option_key: :skip_rollback,
|
|
||||||
i18n_scope: 'create'
|
|
||||||
)
|
|
||||||
parser.recognize_option_value(:ssh_key)
|
|
||||||
|
|
||||||
=begin
|
|
||||||
parser.recognize_option_value(:groups,
|
parser.recognize_option_value(:groups,
|
||||||
short: '-G',
|
short: '-G',
|
||||||
variable: 'GROUP_1,GROUP_2...'
|
variable: 'GROUP_1,GROUP_2...'
|
||||||
) do |groups|
|
) do |groups|
|
||||||
options[:groups] = groups.split(",")
|
options[:groups] = groups.split(",")
|
||||||
end
|
end
|
||||||
=end
|
|
||||||
|
|
||||||
parser.recognize_option_value(:private_ip, i18n_scope: 'create')
|
parser.recognize_option_value(:private_ip, i18n_scope: 'create')
|
||||||
|
|
||||||
@ -85,7 +142,7 @@ class ServerOptions < CommonOptions
|
|||||||
parser.resource_name = :server
|
parser.resource_name = :server
|
||||||
parser.command_name = :bootstrap
|
parser.command_name = :bootstrap
|
||||||
|
|
||||||
parser.recognize_option_value(:cm_name, short: '-N')
|
parser.recognize_option_value(:name, short: '-N')
|
||||||
parser.recognize_option_value(:bootstrap_template)
|
parser.recognize_option_value(:bootstrap_template)
|
||||||
parser.recognize_option_value(:run_list) do |list|
|
parser.recognize_option_value(:run_list) do |list|
|
||||||
options[:run_list] = list.split(",")
|
options[:run_list] = list.split(",")
|
||||||
@ -111,4 +168,12 @@ class ServerOptions < CommonOptions
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete_banner
|
||||||
|
self.banner_header + " delete NODE_NAME [NODE_NAME ...]\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_list_banner
|
||||||
|
self.banner_header + " delete_list INSTANCE_ID [INSTANCE_ID ...]\n"
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -4,14 +4,12 @@ class StackOptions < CommonOptions
|
|||||||
|
|
||||||
commands :create, :delete, :list, :show, :sync, :deploy, :reserve, :unreserve, :change_stack_template
|
commands :create, :delete, :list, :show, :sync, :deploy, :reserve, :unreserve, :change_stack_template
|
||||||
|
|
||||||
COMMAND_NAME = "stack"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.stack")
|
self.header = I18n.t("headers.stack")
|
||||||
self.list_params = ["[provider]"]
|
self.banner_header = "stack"
|
||||||
|
self.list_params = ["[provider]", "[ec2|openstack]"]
|
||||||
self.show_params = ["STACK"]
|
self.show_params = ["STACK"]
|
||||||
self.create_params = %w(PROJECT ENVIRONMENT CATEGORY)
|
|
||||||
self.delete_params = ["STACK"]
|
self.delete_params = ["STACK"]
|
||||||
self.sync_params = ["STACK"]
|
self.sync_params = ["STACK"]
|
||||||
self.deploy_params = ["STACK"]
|
self.deploy_params = ["STACK"]
|
||||||
@ -24,7 +22,11 @@ class StackOptions < CommonOptions
|
|||||||
parser.banner << self.create_banner
|
parser.banner << self.create_banner
|
||||||
parser.resource_name = :stack
|
parser.resource_name = :stack
|
||||||
|
|
||||||
|
parser.recognize_option_value(:provider)
|
||||||
parser.recognize_option_value(:id)
|
parser.recognize_option_value(:id)
|
||||||
|
parser.recognize_option_value(:project)
|
||||||
|
parser.recognize_option_value(:deploy_env)
|
||||||
|
parser.recognize_option_value(:stack_template)
|
||||||
parser.recognize_option_value(:parameters_file)
|
parser.recognize_option_value(:parameters_file)
|
||||||
parser.recognize_option_value(:tags_file)
|
parser.recognize_option_value(:tags_file)
|
||||||
parser.recognize_option_value(:run_list)
|
parser.recognize_option_value(:run_list)
|
||||||
|
|||||||
@ -2,17 +2,17 @@ require "devops-client/options/common_options"
|
|||||||
|
|
||||||
class StackTemplateOptions < CommonOptions
|
class StackTemplateOptions < CommonOptions
|
||||||
|
|
||||||
commands :create, :delete, :list, :show
|
commands :create, :delete, :list, :show, :update_url, :update_available_parameters
|
||||||
|
|
||||||
COMMAND_NAME = "stack_template"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.stack_template")
|
self.header = I18n.t("headers.stack_template")
|
||||||
self.banner_header = "stack_template"
|
self.banner_header = "stack_template"
|
||||||
self.list_params = ["[provider]"]
|
self.list_params = ["[provider]", "[ec2|openstack]"]
|
||||||
self.show_params = ["STACK_TEMPLATE"]
|
self.show_params = ["STACK_TEMPLATE"]
|
||||||
self.delete_params = ["STACK_TEMPLATE"]
|
self.delete_params = ["STACK_TEMPLATE"]
|
||||||
|
self.update_url_params = ["STACK_TEMPLATE"]
|
||||||
|
self.update_available_parameters_params = ["STACK_TEMPLATE"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_options
|
def create_options
|
||||||
@ -21,9 +21,17 @@ class StackTemplateOptions < CommonOptions
|
|||||||
parser.resource_name = :stack_template
|
parser.resource_name = :stack_template
|
||||||
|
|
||||||
parser.recognize_option_value(:provider, default: nil)
|
parser.recognize_option_value(:provider, default: nil)
|
||||||
parser.recognize_option_value(:provider_account, default: nil)
|
|
||||||
parser.recognize_option_value(:id)
|
parser.recognize_option_value(:id)
|
||||||
parser.recognize_option_value(:template_file)
|
parser.recognize_option_value(:template_file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
extend_options_method :list_options do |options|
|
||||||
|
if args[2] == "provider" and args[3]
|
||||||
|
options[:given_provider] = args[3]
|
||||||
|
elsif args[2]
|
||||||
|
options[:given_provider] = args[2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
14
devops-client/lib/devops-client/options/tag_options.rb
Normal file
14
devops-client/lib/devops-client/options/tag_options.rb
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
require "devops-client/options/common_options"
|
||||||
|
|
||||||
|
class TagOptions < CommonOptions
|
||||||
|
commands :create, :delete, :list
|
||||||
|
|
||||||
|
def initialize args, def_options
|
||||||
|
super(args, def_options)
|
||||||
|
self.header = I18n.t("headers.tag")
|
||||||
|
self.banner_header = "tag"
|
||||||
|
self.create_params = ["NODE_NAME", "TAG_NAME", "[TAG_NAME ...]"]
|
||||||
|
self.delete_params = ["NODE_NAME", "TAG_NAME", "[TAG_NAME ...]"]
|
||||||
|
self.list_params = ["NODE_NAME"]
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,20 +1,17 @@
|
|||||||
require "devops-client/options/common_options"
|
require "devops-client/options/common_options"
|
||||||
|
|
||||||
class UserOptions < CommonOptions
|
class UserOptions < CommonOptions
|
||||||
commands :create, :delete, :list, :password, :email, role: [:add, :delete]
|
commands :create, :delete, :grant, :list, :password, :email
|
||||||
|
|
||||||
COMMAND_NAME = "user"
|
|
||||||
|
|
||||||
def initialize args, def_options
|
def initialize args, def_options
|
||||||
super(args, def_options)
|
super(args, def_options)
|
||||||
self.header = I18n.t("headers.user")
|
self.header = I18n.t("headers.user")
|
||||||
self.list_params = []
|
self.banner_header = "user"
|
||||||
self.create_params = ["USER_NAME", "EMAIL"]
|
self.create_params = ["USER_NAME", "EMAIL"]
|
||||||
self.delete_params = ["USER_NAME"]
|
self.delete_params = ["USER_NAME"]
|
||||||
self.password_params = ["USER_NAME"]
|
self.password_params = ["USER_NAME"]
|
||||||
self.email_params = ["USER_NAME", "EMAIL"]
|
self.email_params = ["USER_NAME", "EMAIL"]
|
||||||
self.role_add_params = ["USER_NAME"]
|
self.grant_params = ["USER_NAME", "[COMMAND]", "[PRIVILEGES]"]
|
||||||
self.role_delete_params = ["USER_NAME"]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_options
|
def create_options
|
||||||
|
|||||||
@ -50,18 +50,19 @@ module Output
|
|||||||
headers.unshift(I18n.t("output.table_header.number"))
|
headers.unshift(I18n.t("output.table_header.number"))
|
||||||
rows.each_with_index {|row, i| row.unshift(i + 1)}
|
rows.each_with_index {|row, i| row.unshift(i + 1)}
|
||||||
end
|
end
|
||||||
Terminal::Table.new do |t|
|
table = Terminal::Table.new do |t|
|
||||||
titles = ["#{I18n.t("output.table_header.api_version")}: #{self.options[:api]}",
|
titles = ["#{I18n.t("output.table_header.api_version")}: #{self.options[:api]}",
|
||||||
"#{title}"
|
"#{title}"
|
||||||
]
|
]
|
||||||
t.title = titles.join( "\n" )
|
t.title = titles.join( "\n" )
|
||||||
t.headings = headers
|
t.headings = headers
|
||||||
t.add_row rows[0] if rows[0]
|
t.add_row rows[0]
|
||||||
(rows[1..-1] || []).each do |r|
|
rows[1..-1].each do |r|
|
||||||
t.add_separator if separator
|
t.add_separator if separator
|
||||||
t.add_row r
|
t.add_row r
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
table
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_csv headers, rows, with_num=true, separator=":"
|
def create_csv headers, rows, with_num=true, separator=":"
|
||||||
@ -71,16 +72,7 @@ module Output
|
|||||||
end
|
end
|
||||||
c = CSV.new("", {col_sep: separator, headers: true})
|
c = CSV.new("", {col_sep: separator, headers: true})
|
||||||
c << headers
|
c << headers
|
||||||
rows.each do |r|
|
rows.each{|r| c << r}
|
||||||
row = r.map do |cell|
|
|
||||||
if cell.is_a?(Array)
|
|
||||||
cell.join(',')
|
|
||||||
else
|
|
||||||
cell.to_s
|
|
||||||
end
|
|
||||||
end
|
|
||||||
c << row
|
|
||||||
end
|
|
||||||
c.string
|
c.string
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -93,27 +85,12 @@ module Output
|
|||||||
[headers, rows]
|
[headers, rows]
|
||||||
end
|
end
|
||||||
|
|
||||||
def headers_and_rows_for_array(records, field)
|
|
||||||
headers = [ I18n.t("output.table_header.#{field}") ]
|
|
||||||
rows = records.map{|record| [ record ] }
|
|
||||||
[headers, rows]
|
|
||||||
end
|
|
||||||
|
|
||||||
def time_to_s value
|
|
||||||
return "null" if value.nil?
|
|
||||||
Time.at(value).to_s
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def shrink_cells_if_width_exceeded(rows)
|
def shrink_cells_if_width_exceeded(rows)
|
||||||
rows.each do |row|
|
rows.each do |row|
|
||||||
row.each_with_index do |cell, i|
|
row.each_with_index do |cell, i|
|
||||||
if cell.is_a?(String)
|
row[i] = split_to_parts_of_size(cell, MAX_CELL_WIDTH)
|
||||||
row[i] = split_to_parts_of_size(cell, MAX_CELL_WIDTH)
|
|
||||||
elsif cell.is_a?(Array)
|
|
||||||
row[i] = cell.join("\n")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -0,0 +1,29 @@
|
|||||||
|
require "devops-client/output/base"
|
||||||
|
|
||||||
|
module Output
|
||||||
|
class BootstrapTemplates < Base
|
||||||
|
|
||||||
|
def table
|
||||||
|
headers, rows = create(@data)
|
||||||
|
create_table(headers, rows, I18n.t("output.title.bootstrap_template.list"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def csv
|
||||||
|
headers, rows = create(@data)
|
||||||
|
create_csv(headers, rows)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def create list
|
||||||
|
abort I18n.t("output.not_found.bootstrap_template.list") if list.nil? or list.empty?
|
||||||
|
headers = [ I18n.t("output.table_header.name") ]
|
||||||
|
rows = []
|
||||||
|
list.each do |l|
|
||||||
|
rows.push [ l ]
|
||||||
|
end
|
||||||
|
return headers, rows
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
require "devops-client/output/base"
|
|
||||||
|
|
||||||
module Output
|
|
||||||
class Category < Base
|
|
||||||
|
|
||||||
def table
|
|
||||||
title = nil
|
|
||||||
with_separator = false
|
|
||||||
headers, rows = case options[:current_command]
|
|
||||||
when :show
|
|
||||||
title = I18n.t("output.title.category.show", env: options[:env], project: options[:project], cat: options[:cat])
|
|
||||||
with_separator = true
|
|
||||||
create_show(@data)
|
|
||||||
when :servers_list
|
|
||||||
title = I18n.t("output.title.environment.servers", env: options[:env], project: options[:project])
|
|
||||||
create_servers(@data)
|
|
||||||
when :stacks
|
|
||||||
title = I18n.t("output.title.environment.stacks", env: options[:env], project: options[:project])
|
|
||||||
create_stacks(@data)
|
|
||||||
else
|
|
||||||
title = I18n.t("output.title.category.list", project: options[:project])
|
|
||||||
create_list(@data)
|
|
||||||
end
|
|
||||||
create_table(headers, rows, title, with_num?, with_separator)
|
|
||||||
end
|
|
||||||
|
|
||||||
def csv
|
|
||||||
with_num = true
|
|
||||||
headers, rows = case @additional_options[:current_command]
|
|
||||||
when :list
|
|
||||||
create_list(@data)
|
|
||||||
when :show
|
|
||||||
with_num = false
|
|
||||||
create_show(@data)
|
|
||||||
when :servers
|
|
||||||
create_servers(@data)
|
|
||||||
when :test
|
|
||||||
create_test(@data)
|
|
||||||
end
|
|
||||||
create_csv(headers, rows, with_num?)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def create_list list
|
|
||||||
abort(I18n.t("output.not_found.category.list")) if list.empty?
|
|
||||||
rows = list.map {|l| [l["id"]]}
|
|
||||||
headers = [ I18n.t("output.table_header.id") ]
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_show show
|
|
||||||
provider = show["provider"]
|
|
||||||
cm_tool = show["cm_tool"]
|
|
||||||
row = [
|
|
||||||
show["id"],
|
|
||||||
provider["name"],
|
|
||||||
provider["account"],
|
|
||||||
provider["flavor"],
|
|
||||||
provider["image"],
|
|
||||||
provider["security_groups"],
|
|
||||||
provider["vpc_id"],
|
|
||||||
provider["subnet"],
|
|
||||||
cm_tool["name"],
|
|
||||||
cm_tool["bootstrap_template"]
|
|
||||||
]
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.provider"),
|
|
||||||
I18n.t("output.table_header.provider_account"),
|
|
||||||
I18n.t("output.table_header.flavor"),
|
|
||||||
I18n.t("output.table_header.image"),
|
|
||||||
I18n.t("output.table_header.security_groups"),
|
|
||||||
I18n.t("output.table_header.vpc_id"),
|
|
||||||
I18n.t("output.table_header.subnet"),
|
|
||||||
I18n.t("output.table_header.cm_tool"),
|
|
||||||
I18n.t("output.table_header.bootstrap_template")
|
|
||||||
]
|
|
||||||
return headers, [row]
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_servers servers
|
|
||||||
abort(I18n.t("output.not_found.category.servers", env: options[:env], project: options[:project])) if servers.empty?
|
|
||||||
fields_to_output = %w(id name project environment category cm_name remote_user provider)
|
|
||||||
headers_and_rows(servers, fields_to_output)
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_stacks(stacks)
|
|
||||||
abort(I18n.t("output.not_found.environment.stacks", env: options[:env], project: options[:project])) if stacks.empty?
|
|
||||||
|
|
||||||
fields_to_output = %w(id deploy_env stack_template cloud_stack_id stack_status provider)
|
|
||||||
|
|
||||||
headers_and_rows(stacks, fields_to_output)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
require "devops-client/output/base"
|
|
||||||
|
|
||||||
module Output
|
|
||||||
class Chef < Base
|
|
||||||
|
|
||||||
def table
|
|
||||||
headers, rows, title = nil, nil, nil
|
|
||||||
case options[:current_command]
|
|
||||||
when :bootstrap_templates
|
|
||||||
headers, rows = create_bootstrap_templates
|
|
||||||
title = "output.title.chef.bootstrap_templates"
|
|
||||||
when :tags_list
|
|
||||||
headers, rows = create_tags_list
|
|
||||||
title = "output.title.chef.tags_list"
|
|
||||||
end
|
|
||||||
create_table(headers, rows, I18n.t(title))
|
|
||||||
end
|
|
||||||
|
|
||||||
def csv
|
|
||||||
headers, rows = nil, nil
|
|
||||||
case options[:current_command]
|
|
||||||
when :bootstrap_templates
|
|
||||||
headers, rows = create_bootstrap_templates
|
|
||||||
when :tags_list
|
|
||||||
headers, rows = create_tags_list
|
|
||||||
end
|
|
||||||
|
|
||||||
create_csv(headers, rows)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def create_bootstrap_templates
|
|
||||||
abort I18n.t("output.not_found.chef.bootstrap_template") if @data.empty?
|
|
||||||
headers_and_rows_for_array(@data, "name")
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_tags_list
|
|
||||||
abort I18n.t("output.not_found.chef.tags_list") if @data.empty?
|
|
||||||
headers_and_rows_for_array(@data, "name")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@ -1,106 +0,0 @@
|
|||||||
require "devops-client/output/base"
|
|
||||||
|
|
||||||
module Output
|
|
||||||
class Environment < Base
|
|
||||||
|
|
||||||
def table
|
|
||||||
title = nil
|
|
||||||
with_separator = false
|
|
||||||
headers, rows = case options[:current_command]
|
|
||||||
when :show
|
|
||||||
title = I18n.t("output.title.environment.show", id: options[:env], project: options[:project])
|
|
||||||
with_separator = true
|
|
||||||
create_show(@data)
|
|
||||||
when :servers
|
|
||||||
title = I18n.t("output.title.environment.servers", env: options[:env], project: options[:project])
|
|
||||||
create_servers(@data)
|
|
||||||
when :stacks
|
|
||||||
title = I18n.t("output.title.environment.stacks", env: options[:env], project: options[:project])
|
|
||||||
create_stacks(@data)
|
|
||||||
when :test
|
|
||||||
title = I18n.t("output.title.project.test", :project => ARGV[2], :env => ARGV[3])
|
|
||||||
create_test(@data)
|
|
||||||
else
|
|
||||||
title = I18n.t("output.title.environment.list", project: options[:project])
|
|
||||||
create_list(@data)
|
|
||||||
end
|
|
||||||
create_table(headers, rows, title, with_num?, with_separator)
|
|
||||||
end
|
|
||||||
|
|
||||||
def csv
|
|
||||||
with_num = true
|
|
||||||
headers, rows = case @additional_options[:current_command]
|
|
||||||
when :list
|
|
||||||
create_list(@data)
|
|
||||||
when :show
|
|
||||||
with_num = false
|
|
||||||
create_show(@data)
|
|
||||||
when :servers
|
|
||||||
create_servers(@data)
|
|
||||||
when :test
|
|
||||||
create_test(@data)
|
|
||||||
end
|
|
||||||
create_csv(headers, rows, with_num?)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def create_list list
|
|
||||||
abort(I18n.t("output.not_found.environment.list")) if list.empty?
|
|
||||||
rows = list.map {|l| [l["id"]]}
|
|
||||||
headers = [ I18n.t("output.table_header.id") ]
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_show show
|
|
||||||
row = [
|
|
||||||
show["id"],
|
|
||||||
show["categories"].map{|cat| cat["id"]},
|
|
||||||
show["users"],
|
|
||||||
show["run_list"],
|
|
||||||
show["expires"]
|
|
||||||
]
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.categories"),
|
|
||||||
I18n.t("output.table_header.users"),
|
|
||||||
I18n.t("output.table_header.run_list"),
|
|
||||||
I18n.t("output.table_header.expires")
|
|
||||||
]
|
|
||||||
return headers, [row]
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_servers servers
|
|
||||||
abort(I18n.t("output.not_found.servers.servers", env: options[:env], project: options[:project])) if servers.empty?
|
|
||||||
fields_to_output = %w(id name project environment category cm_name remote_user provider)
|
|
||||||
headers_and_rows(servers, fields_to_output)
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_test test
|
|
||||||
rows = []
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.server"),
|
|
||||||
I18n.t("output.table_header.node_name"),
|
|
||||||
I18n.t("output.table_header.creation"),
|
|
||||||
I18n.t("output.table_header.bootstrap"),
|
|
||||||
I18n.t("output.table_header.deletion")
|
|
||||||
]
|
|
||||||
test["servers"].each do |s|
|
|
||||||
rows.push [ s["id"],
|
|
||||||
s["chef_node_name"],
|
|
||||||
"#{s["create"]["status"]}\n#{s["create"]["time"]}",
|
|
||||||
"#{s["bootstrap"]["status"]}\n#{s["bootstrap"]["time"]}",
|
|
||||||
"#{s["delete"]["status"]}\n#{s["delete"]["time"]}" ]
|
|
||||||
end
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_stacks(stacks)
|
|
||||||
abort(I18n.t("output.not_found.environment.stacks", env: options[:env], project: options[:project])) if stacks.empty?
|
|
||||||
|
|
||||||
fields_to_output = %w(id deploy_env stack_template cloud_stack_id stack_status provider)
|
|
||||||
|
|
||||||
headers_and_rows(stacks, fields_to_output)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -15,8 +15,13 @@ module Output
|
|||||||
|
|
||||||
private
|
private
|
||||||
def create list
|
def create list
|
||||||
abort(I18n.t("output.not_found.filter.list")) if @data.empty?
|
abort(I18n.t("output.not_found.filter.list")) if list.nil? or list.empty?
|
||||||
headers_and_rows_for_array(@data, "image_id")
|
headers = [ I18n.t("output.table_header.image_id") ]
|
||||||
|
rows = []
|
||||||
|
list.each do |l|
|
||||||
|
rows.push [ l ]
|
||||||
|
end
|
||||||
|
return headers, rows
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
48
devops-client/lib/devops-client/output/flavors.rb
Normal file
48
devops-client/lib/devops-client/output/flavors.rb
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
require "devops-client/output/base"
|
||||||
|
require "devops-client/output/concerns/has_provider"
|
||||||
|
|
||||||
|
module Output
|
||||||
|
class Flavors < Base
|
||||||
|
include Concerns::HasProvider
|
||||||
|
|
||||||
|
def table
|
||||||
|
headers, rows = create(@data, @options[:given_provider])
|
||||||
|
create_table(headers, rows, I18n.t("output.title.flavor.list"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def csv
|
||||||
|
headers, rows = create(@data, @options[:given_provider])
|
||||||
|
create_csv(headers, rows)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def create list, provider
|
||||||
|
abort(I18n.t("output.not_found.flavor.list")) if list.nil? or list.empty?
|
||||||
|
headers = nil
|
||||||
|
rows = []
|
||||||
|
if provider == "openstack"
|
||||||
|
headers = [
|
||||||
|
I18n.t("output.table_header.id"),
|
||||||
|
I18n.t("output.table_header.virtual_cpus"),
|
||||||
|
I18n.t("output.table_header.disk"),
|
||||||
|
I18n.t("output.table_header.ram")
|
||||||
|
]
|
||||||
|
list.each do |l|
|
||||||
|
rows << [ l["id"], l["v_cpus"], l["disk"], l["ram"] ]
|
||||||
|
end
|
||||||
|
elsif provider == "ec2"
|
||||||
|
headers = [
|
||||||
|
I18n.t("output.table_header.name"),
|
||||||
|
I18n.t("output.table_header.id"),
|
||||||
|
I18n.t("output.table_header.virtual_cpus"),
|
||||||
|
I18n.t("output.table_header.disk"),
|
||||||
|
I18n.t("output.table_header.ram")
|
||||||
|
]
|
||||||
|
list.each do |l|
|
||||||
|
rows << [ l["name"], l["id"], l["cores"], l["disk"], l["ram"] ]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return headers, rows
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
43
devops-client/lib/devops-client/output/groups.rb
Normal file
43
devops-client/lib/devops-client/output/groups.rb
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
require "devops-client/output/base"
|
||||||
|
|
||||||
|
module Output
|
||||||
|
class Groups < Base
|
||||||
|
|
||||||
|
def table
|
||||||
|
headers, rows = create(@data)
|
||||||
|
create_table(headers, rows, I18n.t("output.title.group.list"), true, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
def csv
|
||||||
|
headers, rows = create(@data)
|
||||||
|
create_csv(headers, rows)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def create list
|
||||||
|
abort(I18n.t("output.not_found.group.list")) if list.nil? or list.empty?
|
||||||
|
headers = [
|
||||||
|
I18n.t("output.table_header.name"),
|
||||||
|
I18n.t("output.table_header.protocol"),
|
||||||
|
I18n.t("output.table_header.from"),
|
||||||
|
I18n.t("output.table_header.to"),
|
||||||
|
I18n.t("output.table_header.cidr"),
|
||||||
|
I18n.t("output.table_header.description")
|
||||||
|
]
|
||||||
|
rows = []
|
||||||
|
list.each do |name, v|
|
||||||
|
next if v.nil? or v.empty?
|
||||||
|
p, f, t, c = [], [], [], []
|
||||||
|
v["rules"].map do |l|
|
||||||
|
p.push l["protocol"]
|
||||||
|
f.push l["from"]
|
||||||
|
t.push l["to"]
|
||||||
|
c.push l["cidr"]
|
||||||
|
end
|
||||||
|
rows.push [ name, p.join("\n"), f.join("\n"), t.join("\n"), c.join("\n"), v["description"] ]
|
||||||
|
end
|
||||||
|
return headers, rows
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -39,26 +39,26 @@ module Output
|
|||||||
I18n.t("output.table_header.status")
|
I18n.t("output.table_header.status")
|
||||||
]
|
]
|
||||||
else
|
else
|
||||||
list.each {|l| rows.push [ l["id"], l["name"], l["remote_user"], l["provider"], time_to_s(l["created_at"]) ] }
|
list.each {|l| rows.push [ l["id"], l["name"], l["bootstrap_template"], l["remote_user"], l["provider"] ] }
|
||||||
[
|
[
|
||||||
I18n.t("output.table_header.id"),
|
I18n.t("output.table_header.id"),
|
||||||
I18n.t("output.table_header.name"),
|
I18n.t("output.table_header.name"),
|
||||||
|
I18n.t("output.table_header.template"),
|
||||||
I18n.t("output.table_header.remote_user"),
|
I18n.t("output.table_header.remote_user"),
|
||||||
I18n.t("output.table_header.provider"),
|
I18n.t("output.table_header.provider")
|
||||||
I18n.t("output.table_header.created_at")
|
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
return headers, rows
|
return headers, rows
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_show
|
def create_show
|
||||||
rows = [ [ @data["id"], @data["name"], @data["remote_user"], @data["provider"], time_to_s(@data["created_at"]) ] ]
|
rows = [ [ @data["id"], @data["name"], @data["bootstrap_template"], @data["remote_user"], @data["provider"] ] ]
|
||||||
headers = [
|
headers = [
|
||||||
I18n.t("output.table_header.id"),
|
I18n.t("output.table_header.id"),
|
||||||
I18n.t("output.table_header.name"),
|
I18n.t("output.table_header.name"),
|
||||||
|
I18n.t("output.table_header.template"),
|
||||||
I18n.t("output.table_header.remote_user"),
|
I18n.t("output.table_header.remote_user"),
|
||||||
I18n.t("output.table_header.provider"),
|
I18n.t("output.table_header.provider")
|
||||||
I18n.t("output.table_header.created_at")
|
|
||||||
]
|
]
|
||||||
return headers, rows
|
return headers, rows
|
||||||
end
|
end
|
||||||
|
|||||||
@ -18,8 +18,8 @@ module Output
|
|||||||
def create list
|
def create list
|
||||||
abort(I18n.t("output.not_found.key.list")) if list.nil? or list.empty?
|
abort(I18n.t("output.not_found.key.list")) if list.nil? or list.empty?
|
||||||
rows = []
|
rows = []
|
||||||
list.each {|l| rows.push [ l["id"], l["filename"], time_to_s(l["created_at"]) ] }
|
list.each {|l| rows.push [ l["id"], l["scope"] ] }
|
||||||
return [ I18n.t("output.table_header.id"), I18n.t("output.table_header.filename"), I18n.t("output.table_header.created_at") ], rows
|
return [ I18n.t("output.table_header.id"), I18n.t("output.table_header.scope") ], rows
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
48
devops-client/lib/devops-client/output/network.rb
Normal file
48
devops-client/lib/devops-client/output/network.rb
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
require "devops-client/output/base"
|
||||||
|
require "devops-client/output/concerns/has_provider"
|
||||||
|
|
||||||
|
module Output
|
||||||
|
class Network < Base
|
||||||
|
include Concerns::HasProvider
|
||||||
|
|
||||||
|
|
||||||
|
def table
|
||||||
|
headers, rows = create(@data, @options[:given_provider])
|
||||||
|
create_table(headers, rows, I18n.t("output.title.network.list"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def csv
|
||||||
|
headers, rows = create(@data, @options[:given_provider])
|
||||||
|
create_csv(headers, rows)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def create list, provider
|
||||||
|
headers = nil
|
||||||
|
rows = []
|
||||||
|
if provider == "openstack"
|
||||||
|
abort(I18n.t("output.not_found.network.list")) if list.nil? or list.empty?
|
||||||
|
headers = [ I18n.t("output.table_header.name"), I18n.t("output.table_header.cidr") ]
|
||||||
|
list.each do |l|
|
||||||
|
rows.push [ l["name"], l["cidr"] ]
|
||||||
|
end
|
||||||
|
elsif provider == "ec2"
|
||||||
|
if list.nil? or list.empty?
|
||||||
|
puts(I18n.t("output.not_found.network.list"))
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
headers = [
|
||||||
|
I18n.t("output.table_header.subnet"),
|
||||||
|
I18n.t("output.table_header.vpc_id"),
|
||||||
|
I18n.t("output.table_header.cidr"),
|
||||||
|
I18n.t("output.table_header.zone")
|
||||||
|
]
|
||||||
|
list.each do |l|
|
||||||
|
rows.push [ l["subnetId"], l["vpcId"], l["cidr"], l["zone"] ]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return headers, rows
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@ -9,11 +9,11 @@ module Output
|
|||||||
def table
|
def table
|
||||||
title = nil
|
title = nil
|
||||||
with_separator = false
|
with_separator = false
|
||||||
headers, rows = case options[:current_command]
|
headers, rows = case options[:output_type]
|
||||||
when :show
|
when :show
|
||||||
title = I18n.t("output.title.project.show", :name => @data["id"])
|
title = I18n.t("output.title.project.show", :name => @data["name"])
|
||||||
with_separator = true
|
with_separator = true
|
||||||
create_show
|
create_show(@data)
|
||||||
when :servers
|
when :servers
|
||||||
title = ARGV[2]
|
title = ARGV[2]
|
||||||
title += " " + ARGV[3] unless ARGV[3].nil?
|
title += " " + ARGV[3] unless ARGV[3].nil?
|
||||||
@ -29,7 +29,7 @@ module Output
|
|||||||
create_test(@data)
|
create_test(@data)
|
||||||
else
|
else
|
||||||
title = I18n.t("output.title.project.list")
|
title = I18n.t("output.title.project.list")
|
||||||
create_list
|
create_list(@data)
|
||||||
end
|
end
|
||||||
create_table(headers, rows, title, with_num?, with_separator)
|
create_table(headers, rows, title, with_num?, with_separator)
|
||||||
end
|
end
|
||||||
@ -38,10 +38,10 @@ module Output
|
|||||||
with_num = true
|
with_num = true
|
||||||
headers, rows = case @additional_options[:output_type]
|
headers, rows = case @additional_options[:output_type]
|
||||||
when :list
|
when :list
|
||||||
create_list
|
create_list(@data)
|
||||||
when :show
|
when :show
|
||||||
with_num = false
|
with_num = false
|
||||||
create_show
|
create_show(@data)
|
||||||
when :servers
|
when :servers
|
||||||
create_servers(@data)
|
create_servers(@data)
|
||||||
when :test
|
when :test
|
||||||
@ -51,25 +51,57 @@ module Output
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def create_list
|
def create_list list
|
||||||
abort(I18n.t("output.not_found.project.list")) if @data.empty?
|
abort(I18n.t("output.not_found.project.list")) if list.empty?
|
||||||
rows = @data.map {|l| [l["id"]]}
|
rows = list.map {|l| [l["name"]]}
|
||||||
headers = [ I18n.t("output.table_header.id") ]
|
headers = [ I18n.t("output.table_header.id") ]
|
||||||
return headers, rows
|
return headers, rows
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_show
|
def create_show show
|
||||||
rows = []
|
rows = []
|
||||||
rows = [ [@data["id"], @data["description"], @data["environments"].map{|e| e["id"]}, @data["owner"], @data["project_users"], @data["run_list"], time_to_s(@data["created_at"])] ]
|
if show["type"] == "multi"
|
||||||
headers = [
|
show["deploy_envs"].each do |de|
|
||||||
I18n.t("output.table_header.id"),
|
subprojects = []
|
||||||
I18n.t("output.table_header.description"),
|
nodes = []
|
||||||
I18n.t("output.table_header.environments"),
|
de["servers"].each do |s|
|
||||||
I18n.t("output.table_header.owner"),
|
s["subprojects"].each do |sp|
|
||||||
I18n.t("output.table_header.users"),
|
subprojects.push "#{sp["name"]} - #{sp["env"]}"
|
||||||
I18n.t("output.table_header.run_list"),
|
nodes.push sp["node"]
|
||||||
I18n.t("output.table_header.created_at")
|
end
|
||||||
]
|
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_with_index do |de, i|
|
||||||
|
rows.push [
|
||||||
|
show["name"],
|
||||||
|
de["identifier"],
|
||||||
|
de["image"],
|
||||||
|
de["flavor"],
|
||||||
|
(de["run_list"] || []).join("\n"),
|
||||||
|
(de["groups"] || []).join("\n"),
|
||||||
|
(de["subnets"] || []).join("\n"),
|
||||||
|
(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"),
|
||||||
|
I18n.t("output.table_header.flavor"),
|
||||||
|
I18n.t("output.table_header.run_list"),
|
||||||
|
I18n.t("output.table_header.groups"),
|
||||||
|
I18n.t("output.table_header.subnets"),
|
||||||
|
I18n.t("output.table_header.users")
|
||||||
|
]
|
||||||
|
end
|
||||||
return headers, rows
|
return headers, rows
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -4,48 +4,23 @@ module Output
|
|||||||
class Provider < Base
|
class Provider < Base
|
||||||
|
|
||||||
def table
|
def table
|
||||||
case options[:current_command]
|
case options[:output_type]
|
||||||
when :list
|
when :list
|
||||||
headers, rows = create_list
|
headers, rows = create_list
|
||||||
title = I18n.t("output.title.provider.list")
|
title = I18n.t("output.title.provider.list")
|
||||||
when :accounts
|
when :accounts
|
||||||
headers, rows = create_accounts(options[:provider])
|
headers, rows = create_accounts
|
||||||
title = I18n.t("output.title.provider.accounts", provider: options[:provider])
|
title = I18n.t("output.title.provider.accounts", provider: options[:provider])
|
||||||
when :flavors
|
|
||||||
headers, rows = create_flavors(options[:provider])
|
|
||||||
title = I18n.t("output.title.provider.flavors", provider: options[:provider], account: options[:account])
|
|
||||||
when :images
|
|
||||||
headers, rows = create_images(options[:provider])
|
|
||||||
title = I18n.t("output.title.provider.images", provider: options[:provider], account: options[:account])
|
|
||||||
when :security_groups
|
|
||||||
headers, rows = create_security_groups(options[:provider])
|
|
||||||
title = I18n.t("output.title.provider.security_groups", provider: options[:provider], account: options[:account])
|
|
||||||
when :vpc
|
|
||||||
headers, rows = create_vpc
|
|
||||||
title = I18n.t("output.title.provider.vpcs", provider: options[:provider], account: options[:account])
|
|
||||||
when :networks
|
|
||||||
headers, rows = create_networks(options[:provider])
|
|
||||||
title = I18n.t("output.title.provider.networks", provider: options[:provider], account: options[:account])
|
|
||||||
end
|
end
|
||||||
create_table(headers, rows, title)
|
create_table(headers, rows, title)
|
||||||
end
|
end
|
||||||
|
|
||||||
def csv
|
def csv
|
||||||
case options[:current_command]
|
case options[:output_type]
|
||||||
when :list
|
when :list
|
||||||
headers, rows = create_list
|
headers, rows = create_list
|
||||||
when :accounts
|
when :accounts
|
||||||
headers, rows = create_accounts
|
headers, rows = create_accounts
|
||||||
when :flavors
|
|
||||||
headers, rows = create_flavors(options[:provider])
|
|
||||||
when :images
|
|
||||||
headers, rows = create_images(options[:provider])
|
|
||||||
when :security_groups
|
|
||||||
headers, rows = create_security_groups(options[:provider])
|
|
||||||
when :vpc
|
|
||||||
headers, rows = create_vpc
|
|
||||||
when :networks
|
|
||||||
headers, rows = create_networks(options[:provider])
|
|
||||||
end
|
end
|
||||||
create_csv(headers, rows, with_num?)
|
create_csv(headers, rows, with_num?)
|
||||||
end
|
end
|
||||||
@ -55,131 +30,28 @@ module Output
|
|||||||
def create_list
|
def create_list
|
||||||
abort(I18n.t("output.not_found.provider.list")) if @data.empty?
|
abort(I18n.t("output.not_found.provider.list")) if @data.empty?
|
||||||
headers = [ I18n.t("output.table_header.provider") ]
|
headers = [ I18n.t("output.table_header.provider") ]
|
||||||
rows = @data.map {|l| [ l ]}
|
rows = []
|
||||||
|
@data.each do |l|
|
||||||
|
rows.push [ l ]
|
||||||
|
end
|
||||||
return headers, rows
|
return headers, rows
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_accounts provider
|
def create_accounts
|
||||||
headers = [
|
headers = [
|
||||||
I18n.t("output.table_header.id"),
|
I18n.t("output.table_header.id"),
|
||||||
I18n.t("output.table_header.description"),
|
I18n.t("output.table_header.description"),
|
||||||
I18n.t("output.table_header.ssh_key")
|
I18n.t("output.table_header.ssh_key")
|
||||||
]
|
]
|
||||||
keys = %w(account_name description ssh_key)
|
|
||||||
case provider
|
|
||||||
when Providers::Aws
|
|
||||||
headers.push I18n.t("output.table_header.use_iam_profile")
|
|
||||||
keys.push "use_iam_profile"
|
|
||||||
when Providers::Openstack
|
|
||||||
when Providers::Static
|
|
||||||
end
|
|
||||||
headers.push I18n.t("output.table_header.created_at")
|
|
||||||
rows = @data.map do |account|
|
rows = @data.map do |account|
|
||||||
keys.map{|key| account[key]}.push(time_to_s(account["created_at"]))
|
[
|
||||||
|
account['account_name'],
|
||||||
|
account['description'],
|
||||||
|
account['ssh_key']
|
||||||
|
]
|
||||||
end
|
end
|
||||||
[headers, rows]
|
[headers, rows]
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_flavors provider
|
|
||||||
abort(I18n.t("output.not_found.flavor.list")) if @data.nil? or @data.empty?
|
|
||||||
headers = nil
|
|
||||||
rows = []
|
|
||||||
case provider
|
|
||||||
when Providers::Aws
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.name"),
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.virtual_cpus"),
|
|
||||||
I18n.t("output.table_header.disk"),
|
|
||||||
I18n.t("output.table_header.ram")
|
|
||||||
]
|
|
||||||
@data.each do |l|
|
|
||||||
rows << [ l["name"], l["id"], l["cores"], l["disk"], l["ram"] ]
|
|
||||||
end
|
|
||||||
when Providers::Openstack
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.virtual_cpus"),
|
|
||||||
I18n.t("output.table_header.disk"),
|
|
||||||
I18n.t("output.table_header.ram")
|
|
||||||
]
|
|
||||||
@data.each do |l|
|
|
||||||
rows << [ l["id"], l["v_cpus"], l["disk"], l["ram"] ]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_networks provider
|
|
||||||
headers = nil
|
|
||||||
rows = []
|
|
||||||
case provider
|
|
||||||
when Providers::Openstack
|
|
||||||
abort(I18n.t("output.not_found.network.list")) if @data.empty?
|
|
||||||
headers = [ I18n.t("output.table_header.name"), I18n.t("output.table_header.cidr") ]
|
|
||||||
@data.each do |l|
|
|
||||||
rows.push [ l["name"], l["cidr"] ]
|
|
||||||
end
|
|
||||||
when Providers::Aws
|
|
||||||
if @data.empty?
|
|
||||||
puts(I18n.t("output.not_found.network.list"))
|
|
||||||
return nil, nil
|
|
||||||
end
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.subnet"),
|
|
||||||
I18n.t("output.table_header.vpc_id"),
|
|
||||||
I18n.t("output.table_header.cidr"),
|
|
||||||
I18n.t("output.table_header.zone")
|
|
||||||
]
|
|
||||||
@data.each do |l|
|
|
||||||
rows.push [ l["subnetId"], l["vpcId"], l["cidr"], l["zone"] ]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return headers, rows
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_images provider
|
|
||||||
abort(I18n.t("output.not_found.image.list")) if @data.empty?
|
|
||||||
rows = []
|
|
||||||
@data.each {|l| rows.push [ l["name"], l["id"], l["status"] ]}
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.name"),
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.status")
|
|
||||||
]
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_security_groups provider
|
|
||||||
abort(I18n.t("output.not_found.security_groups.list")) if @data.empty?
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.name"),
|
|
||||||
I18n.t("output.table_header.protocol"),
|
|
||||||
I18n.t("output.table_header.from"),
|
|
||||||
I18n.t("output.table_header.to"),
|
|
||||||
I18n.t("output.table_header.cidr"),
|
|
||||||
I18n.t("output.table_header.description")
|
|
||||||
]
|
|
||||||
rows = []
|
|
||||||
@data.each do |name, v|
|
|
||||||
next if v.nil? or v.empty?
|
|
||||||
p, f, t, c = [], [], [], []
|
|
||||||
v["rules"].map do |l|
|
|
||||||
p.push l["protocol"]
|
|
||||||
f.push l["from"]
|
|
||||||
t.push l["to"]
|
|
||||||
c.push l["cidr"]
|
|
||||||
end
|
|
||||||
rows.push [ name, p.join("\n"), f.join("\n"), t.join("\n"), c.join("\n"), v["description"] ]
|
|
||||||
end
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_vpc
|
|
||||||
abort(I18n.t("output.not_found.vpc.list")) if @data.empty?
|
|
||||||
headers_and_rows(@data, %w(vpc_id cidr))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,75 +0,0 @@
|
|||||||
require "devops-client/output/base"
|
|
||||||
|
|
||||||
module Output
|
|
||||||
class Role < Base
|
|
||||||
|
|
||||||
def table
|
|
||||||
title, headers, rows = nil, nil, nil
|
|
||||||
case options[:current_command]
|
|
||||||
when :list
|
|
||||||
headers, rows = prepare_list
|
|
||||||
title = "output.title.role.list"
|
|
||||||
when :show
|
|
||||||
headers, rows = prepare_show
|
|
||||||
title = "output.title.role.show"
|
|
||||||
when :policies
|
|
||||||
headers, rows = prepare_policies
|
|
||||||
title = "output.title.role.policies"
|
|
||||||
end
|
|
||||||
|
|
||||||
create_table headers, rows, I18n.t(title)
|
|
||||||
end
|
|
||||||
|
|
||||||
def csv
|
|
||||||
headers, rows = nil, nil
|
|
||||||
case options[:current_command]
|
|
||||||
when :list
|
|
||||||
headers, rows = prepare_list
|
|
||||||
when :show
|
|
||||||
headers, rows = prepare_show
|
|
||||||
when :policies
|
|
||||||
headers, rows = prepare_policies
|
|
||||||
end
|
|
||||||
create_csv headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def prepare_list
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.name"),
|
|
||||||
I18n.t("output.table_header.description"),
|
|
||||||
I18n.t("output.table_header.policies"),
|
|
||||||
I18n.t("output.table_header.created_at")
|
|
||||||
]
|
|
||||||
rows = @data.map do |role|
|
|
||||||
[ role["id"], role["name"], role["description"], role["policies"], time_to_s(role["created_at"]) ]
|
|
||||||
end
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def prepare_show
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.name"),
|
|
||||||
I18n.t("output.table_header.description"),
|
|
||||||
I18n.t("output.table_header.policies"),
|
|
||||||
I18n.t("output.table_header.created_at")
|
|
||||||
]
|
|
||||||
rows = [[ @data["id"], @data["name"], @data["description"], @data["policies"], time_to_s(@data["created_at"]) ]]
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
|
|
||||||
def prepare_policies
|
|
||||||
headers = [
|
|
||||||
I18n.t("output.table_header.id"),
|
|
||||||
I18n.t("output.table_header.description"),
|
|
||||||
I18n.t("output.table_header.dependencies")
|
|
||||||
]
|
|
||||||
rows = @data.map do |policy|
|
|
||||||
[ policy["id"], policy["description"], policy["dependencies"] ]
|
|
||||||
end
|
|
||||||
return headers, rows
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -18,7 +18,7 @@ module Output
|
|||||||
end
|
end
|
||||||
create_list
|
create_list
|
||||||
else
|
else
|
||||||
title = I18n.t("output.title.server.show", :name => options[:server])
|
title = I18n.t("output.title.server.show", :name => @data["chef_node_name"])
|
||||||
create_show
|
create_show
|
||||||
end
|
end
|
||||||
create_table headers, rows, title
|
create_table headers, rows, title
|
||||||
@ -73,11 +73,11 @@ module Output
|
|||||||
I18n.t("output.table_header.created_at")
|
I18n.t("output.table_header.created_at")
|
||||||
]
|
]
|
||||||
else
|
else
|
||||||
keys = ["id", "name"]
|
keys = ["id", "chef_node_name"]
|
||||||
title = "Servers"
|
title = "Servers"
|
||||||
[
|
[
|
||||||
I18n.t("output.table_header.instance_id"),
|
I18n.t("output.table_header.instance_id"),
|
||||||
I18n.t("output.table_header.name")
|
I18n.t("output.table_header.node_name")
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
list.each do |l|
|
list.each do |l|
|
||||||
@ -92,20 +92,18 @@ module Output
|
|||||||
rows = []
|
rows = []
|
||||||
headers = [
|
headers = [
|
||||||
I18n.t("output.table_header.instance_id"),
|
I18n.t("output.table_header.instance_id"),
|
||||||
I18n.t("output.table_header.name"),
|
I18n.t("output.table_header.node_name"),
|
||||||
I18n.t("output.table_header.project"),
|
I18n.t("output.table_header.project"),
|
||||||
I18n.t("output.table_header.environment"),
|
I18n.t("output.table_header.deploy_env"),
|
||||||
I18n.t("output.table_header.category"),
|
|
||||||
I18n.t("output.table_header.provider"),
|
I18n.t("output.table_header.provider"),
|
||||||
I18n.t("output.table_header.remote_user"),
|
I18n.t("output.table_header.remote_user"),
|
||||||
I18n.t("output.table_header.private_ip"),
|
I18n.t("output.table_header.private_ip"),
|
||||||
I18n.t("output.table_header.created_by"),
|
I18n.t("output.table_header.created_at"),
|
||||||
I18n.t("output.table_header.created_at")
|
I18n.t("output.table_header.created_by")
|
||||||
]
|
]
|
||||||
keys = ["id", "name", "project", "environment", "category", "provider", "remote_user", "private_ip", "created_by"]
|
keys = ["id", "chef_node_name", "project", "deploy_env", "provider", "remote_user", "private_ip", "created_at", "created_by"]
|
||||||
row = []
|
row = []
|
||||||
keys.each{|k| row.push @data[k]}
|
keys.each{|k| row.push @data[k]}
|
||||||
row.push time_to_s(@data["created_at"])
|
|
||||||
rows.push row
|
rows.push row
|
||||||
return headers, rows
|
return headers, rows
|
||||||
end
|
end
|
||||||
|
|||||||
28
devops-client/lib/devops-client/output/tag.rb
Normal file
28
devops-client/lib/devops-client/output/tag.rb
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
require "devops-client/output/base"
|
||||||
|
|
||||||
|
module Output
|
||||||
|
class Tag < Base
|
||||||
|
|
||||||
|
def table
|
||||||
|
headers, rows = create(@data)
|
||||||
|
create_table(headers, rows, I18n.t("output.title.tag.list"))
|
||||||
|
end
|
||||||
|
|
||||||
|
def csv
|
||||||
|
headers, rows = create(@data)
|
||||||
|
create_csv(headers, rows)
|
||||||
|
end
|
||||||
|
|
||||||
|
def json
|
||||||
|
JSON.pretty_generate @data
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def create list
|
||||||
|
abort(I18n.t("output.not_found.tag.list")) if list.empty?
|
||||||
|
headers = [I18n.t("output.table_header.tag")]
|
||||||
|
rows = list.map {|l| [ l ]}
|
||||||
|
return headers, rows
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -4,39 +4,24 @@ module Output
|
|||||||
class User < Base
|
class User < Base
|
||||||
|
|
||||||
def table
|
def table
|
||||||
title, headers, rows = nil, nil, nil
|
title, headers = nil, nil
|
||||||
with_num = options[:with_num] || true
|
rows, with_num = create_subheader, false
|
||||||
|
rows += create_rows
|
||||||
|
headers = [
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
{:value => I18n.t("output.table_header.privileges"), :colspan => 12, :alignment => :center }
|
||||||
|
]
|
||||||
|
|
||||||
case options[:current_command]
|
create_table headers, rows, I18n.t("output.title.users.list"), with_num, true
|
||||||
when :list
|
|
||||||
headers, rows = prepare_list
|
|
||||||
title = "output.title.users.list"
|
|
||||||
when :show
|
|
||||||
end
|
|
||||||
|
|
||||||
create_table headers, rows, I18n.t(title), with_num, true
|
|
||||||
end
|
|
||||||
|
|
||||||
def csv
|
|
||||||
headers, rows = nil, nil
|
|
||||||
case options[:current_command]
|
|
||||||
when :list
|
|
||||||
headers, rows = prepare_list
|
|
||||||
when :show
|
|
||||||
end
|
|
||||||
create_csv headers, rows
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def prepare_list
|
def csv
|
||||||
headers = [
|
rows = create_rows(@data)
|
||||||
I18n.t("output.table_header.id"),
|
headers = create_subheader
|
||||||
I18n.t("output.table_header.email"),
|
create_csv headers, rows
|
||||||
I18n.t("output.table_header.roles"),
|
|
||||||
I18n.t("output.table_header.created_at")
|
|
||||||
]
|
|
||||||
rows = @data.map{|u| [ u["id"], u["email"], u["roles"], time_to_s(u["created_at"]) ] }
|
|
||||||
[headers, rows]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_subheader
|
def create_subheader
|
||||||
|
|||||||
@ -1,21 +1,21 @@
|
|||||||
module Providers
|
module Providers
|
||||||
Aws = 'aws'
|
Ec2 = 'ec2'
|
||||||
Openstack = 'openstack'
|
Openstack = 'openstack'
|
||||||
Static = 'static'
|
Static = 'static'
|
||||||
|
|
||||||
def self.available
|
def self.available
|
||||||
[Aws, Openstack, Static]
|
[Ec2, Openstack, Static]
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.functionalities
|
def self.functionalities
|
||||||
{
|
{
|
||||||
images: [Aws, Openstack],
|
images: [Ec2, Openstack],
|
||||||
stack_templates: [Aws, Openstack],
|
stack_templates: [Ec2, Openstack],
|
||||||
stacks: [Aws, Openstack]
|
stacks: [Ec2, Openstack]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.has_functionality?(provider, functionality)
|
def self.has_functionality?(provider, functionality)
|
||||||
functionalities.fetch(functionality).include?(provider.to_s)
|
functionalities.fetch(functionality).include?(provider.to_s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1,3 +1,3 @@
|
|||||||
module DevopsClient
|
module DevopsClient
|
||||||
VERSION = "3.0.1"
|
VERSION = "2.1.34"
|
||||||
end
|
end
|
||||||
|
|||||||
@ -24,127 +24,95 @@ en:
|
|||||||
warn: "WARN: %{msg}"
|
warn: "WARN: %{msg}"
|
||||||
error: "ERROR: %{msg}"
|
error: "ERROR: %{msg}"
|
||||||
headers:
|
headers:
|
||||||
chef: "Chef options"
|
flavor: "Flavor"
|
||||||
bootstrap_templates: Bootstrap templates
|
template: "Bootstrap template"
|
||||||
|
bootstrap_template: "Bootstrap template"
|
||||||
deploy: "Deploy"
|
deploy: "Deploy"
|
||||||
filters: "Filters"
|
filters: "Filters"
|
||||||
|
group: "Security groups"
|
||||||
image: "Image"
|
image: "Image"
|
||||||
key: "Key"
|
key: "Key"
|
||||||
|
network: "Network"
|
||||||
project: "Project"
|
project: "Project"
|
||||||
environment: "Project environment"
|
project_env: "Project environment"
|
||||||
category: "Environment category"
|
deploy_env: "Deploy environment"
|
||||||
provider: "Provider"
|
provider: "Provider"
|
||||||
provider_account: "Provider account"
|
|
||||||
server: "Server"
|
server: "Server"
|
||||||
script: "Script"
|
script: "Script"
|
||||||
|
tag: "Tag"
|
||||||
user: "User"
|
user: "User"
|
||||||
stack: "Stack"
|
stack: "Stack"
|
||||||
stack_template: "Stack template"
|
stack_template: "Stack template"
|
||||||
env: "Environment"
|
env: "Deploy environment"
|
||||||
role: "Role"
|
|
||||||
category_type: Category type
|
|
||||||
handler:
|
handler:
|
||||||
role:
|
flavor:
|
||||||
create:
|
list:
|
||||||
description: "Role description"
|
empty: "Flavors list is empty"
|
||||||
policies: "Role policies"
|
env:
|
||||||
question:
|
|
||||||
create: "Create role"
|
|
||||||
delete: "Delete role '%{role}'"
|
|
||||||
all_policies: "Set all policies for a role"
|
|
||||||
provider:
|
|
||||||
vpc:
|
|
||||||
invalid_provider: "Operation available for 'aws' provider only"
|
|
||||||
list:
|
list:
|
||||||
empty: "VPCs list is empty"
|
empty: "Project environment list is empty"
|
||||||
account:
|
|
||||||
create:
|
|
||||||
description: "Description"
|
|
||||||
ssh_key: "SSH key"
|
|
||||||
aws:
|
|
||||||
use_iam_profile: "Use IAM profile"
|
|
||||||
secret_access_key: "Secret access key"
|
|
||||||
access_key_id: "Access key id"
|
|
||||||
question:
|
|
||||||
delete: "Are you sure to delete account '%{account}'"
|
|
||||||
create: "Create provider account"
|
|
||||||
tags:
|
|
||||||
question:
|
|
||||||
delete: "Are you sure to delete tag(s) '%{name}' from node '%{node}'?"
|
|
||||||
flavor:
|
|
||||||
list:
|
|
||||||
empty: "Flavors list is empty"
|
|
||||||
image:
|
image:
|
||||||
question:
|
question:
|
||||||
delete: "Are you sure to delete image '%{name}'?"
|
delete: "Are you sure to delete image '%{name}'?"
|
||||||
create: "Create image"
|
create: "Create image?"
|
||||||
create:
|
create:
|
||||||
ssh_user: "The ssh username"
|
ssh_user: "The ssh username"
|
||||||
template: "Bootstrap template or empty value"
|
template: "Bootstrap template or empty value"
|
||||||
template_empty: "No bootatrap template found, it will be used default template"
|
template_empty: "No bootatrap template found, it will be used default template"
|
||||||
filter:
|
filter:
|
||||||
question:
|
question:
|
||||||
delete: "Are you sure to delete image filter(s) '%{name}'"
|
delete: "Are you sure to delete image filter(s) '%{name}'?"
|
||||||
key:
|
key:
|
||||||
question:
|
question:
|
||||||
delete: "Are you sure to delete key '%{name}'"
|
delete: "Are you sure to delete key '%{name}'?"
|
||||||
create: "Create key"
|
|
||||||
project:
|
project:
|
||||||
list:
|
list:
|
||||||
empty: "Project list is empty"
|
empty: "Project list is empty"
|
||||||
question:
|
question:
|
||||||
delete: "Are you sure to delete project '%{name}'"
|
delete: "Are you sure to delete project '%{name}'?"
|
||||||
create: "Create project"
|
create: "Create project?"
|
||||||
update: "Update project"
|
update: "Update project?"
|
||||||
add_env: "Add environment"
|
add_env: "Add environment?"
|
||||||
update_with_new_envs: "Add these envs to project"
|
update_with_new_envs: "Add these envs to project?"
|
||||||
set_stack_template: "Set stack template"
|
set_stack_template: "Set stack template?"
|
||||||
run_list:
|
|
||||||
empty: "Set empty run_list"
|
|
||||||
parameter:
|
parameter:
|
||||||
run_list:
|
run_list:
|
||||||
empty: "WARN: run list is empty, continue?"
|
empty: "WARN: run list is empty, continue?"
|
||||||
exist: "Project '%{project}' already exist"
|
exist: "Project '%{project}' already exist"
|
||||||
create:
|
create:
|
||||||
description: "Project description"
|
|
||||||
invalid_json: "Invalid JSON in file '%{file}'"
|
invalid_json: "Invalid JSON in file '%{file}'"
|
||||||
users: "project users"
|
env: "Deploy environment identifier"
|
||||||
question:
|
env_exist: "Deploy environment '%{env}' already exist"
|
||||||
users_choose: "Would you like to choose users (y) or type manually (n)"
|
flavor:
|
||||||
|
not_found: "No such flavor"
|
||||||
|
subnet:
|
||||||
|
ec2: "Subnet (or Enter)"
|
||||||
|
openstack: "Subnets"
|
||||||
|
user: "Users, you will be added automatically"
|
||||||
run_list:
|
run_list:
|
||||||
invalid: "ERROR: invalid run list elements: %{list}"
|
invalid: "ERROR: invalid run list elements: %{list}"
|
||||||
environment:
|
invalid_subcommand: "Invalid subcommand for '%{cmd}': '%{scmd}'"
|
||||||
create:
|
|
||||||
id_exists: "Environment with identifier '%{env}' already exists"
|
|
||||||
question:
|
|
||||||
delete: "Are you sure to delete environment '%{env}' from project '%{name}'"
|
|
||||||
create: "Create environment"
|
|
||||||
category:
|
|
||||||
question:
|
|
||||||
delete: "Are you sure to delete category '%{cat}' from environment '%{env}' from project '%{project}'"
|
|
||||||
create: "Create category"
|
|
||||||
create:
|
|
||||||
chef_env: "Chef env: "
|
|
||||||
script:
|
script:
|
||||||
question:
|
question:
|
||||||
delete: "Are you sure to delete script '%{name}'"
|
delete: "Are you sure to delete script '%{name}'?"
|
||||||
|
tag:
|
||||||
|
question:
|
||||||
|
delete: "Are you sure to delete tag(s) '%{name}' from node '%{node}'?"
|
||||||
user:
|
user:
|
||||||
question:
|
question:
|
||||||
create: "Create user"
|
delete: "Are you sure to delete user '%{name}'?"
|
||||||
delete: "Are you sure to delete user '%{name}'"
|
|
||||||
password_for: "Password for %{user}:"
|
password_for: "Password for %{user}:"
|
||||||
server:
|
server:
|
||||||
question:
|
question:
|
||||||
unbootstrap: "Are you sure to unbootstrap server '%{id}'"
|
delete: "Are you sure to delete server '%{name}'?"
|
||||||
delete: "Are you sure to delete server '%{id}'"
|
delete_list: "Are you sure to delete these servers: %{ids}?"
|
||||||
delete_list: "Are you sure to delete these servers: %{ids}"
|
|
||||||
stack_template:
|
stack_template:
|
||||||
create:
|
create:
|
||||||
id: "Id: "
|
id: "Id: "
|
||||||
template_file: "Path to file with template body: "
|
template_file: "Path to file with template body: "
|
||||||
question:
|
question:
|
||||||
create: "Are you sure to create stack template"
|
create: "Are you sure to create stack template?"
|
||||||
delete: "Are you sure to delete stack template '%{name}'"
|
delete: "Are you sure to delete stack template '%{name}'?"
|
||||||
stack:
|
stack:
|
||||||
create:
|
create:
|
||||||
id: "Id: "
|
id: "Id: "
|
||||||
@ -153,12 +121,12 @@ en:
|
|||||||
run_list: "Run list: "
|
run_list: "Run list: "
|
||||||
tags_file: "Path to file with tags in JSON (or Enter): "
|
tags_file: "Path to file with tags in JSON (or Enter): "
|
||||||
question:
|
question:
|
||||||
create: "Are you sure to create stack"
|
create: "Are you sure to create stack?"
|
||||||
delete: "Are you sure to delete stack '%{name}'"
|
delete: "Are you sure to delete stack '%{name}'?"
|
||||||
message:
|
message:
|
||||||
choose_list_default: "Choose %{name} (comma separated), like 1,2,3 or empty for default value '%{default}'"
|
choose_list_default: "Choose %{name} (comma separated), like 1,2,3 or empty for default value '%{default}': "
|
||||||
choose_list: "Choose %{name} (comma separated), like 1,2,3"
|
choose_list: "Choose %{name} (comma separated), like 1,2,3: "
|
||||||
choose: "Choose %{name}"
|
choose: "Choose '%{name}': "
|
||||||
error:
|
error:
|
||||||
parameter:
|
parameter:
|
||||||
undefined: "ERROR: parameter '%{name}' is undefined"
|
undefined: "ERROR: parameter '%{name}' is undefined"
|
||||||
@ -169,26 +137,6 @@ en:
|
|||||||
invalid: "Invalid number"
|
invalid: "Invalid number"
|
||||||
list:
|
list:
|
||||||
empty: "%{name} list is empty"
|
empty: "%{name} list is empty"
|
||||||
choose:
|
|
||||||
flavor: flavor
|
|
||||||
image: image
|
|
||||||
vpc: VPC
|
|
||||||
network: network
|
|
||||||
networks: networks
|
|
||||||
security_groups: "security groups"
|
|
||||||
ssh_key: "SSH key"
|
|
||||||
input:
|
|
||||||
run_list:
|
|
||||||
label: "Run list, like recipe[mycookbook::myrecipe],role[myrole]"
|
|
||||||
invalid: "Invalid run list '%{list}'"
|
|
||||||
user:
|
|
||||||
label: "Users"
|
|
||||||
list: "users list"
|
|
||||||
question:
|
|
||||||
choose: "Choose"
|
|
||||||
message:
|
|
||||||
input_list_default: "Input %{cmd} (comma separated) or empty for default value '%{default}': "
|
|
||||||
input_list: "Input %{cmd} (comma separated): "
|
|
||||||
output:
|
output:
|
||||||
table_header:
|
table_header:
|
||||||
api_version: "API version"
|
api_version: "API version"
|
||||||
@ -196,8 +144,6 @@ en:
|
|||||||
id: "Id"
|
id: "Id"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
provider: "Provider"
|
provider: "Provider"
|
||||||
provider_account: "Provider account"
|
|
||||||
use_iam_profile: "IAM profile"
|
|
||||||
remote_user: "Remote user"
|
remote_user: "Remote user"
|
||||||
disk: "Disk"
|
disk: "Disk"
|
||||||
virtual_cpus: "Virtual CPUs"
|
virtual_cpus: "Virtual CPUs"
|
||||||
@ -209,22 +155,20 @@ en:
|
|||||||
cidr: "CIDR"
|
cidr: "CIDR"
|
||||||
description: "Description"
|
description: "Description"
|
||||||
status: "Status"
|
status: "Status"
|
||||||
filename: "Filename"
|
template: "Bootstrap template"
|
||||||
|
scope: "Scope"
|
||||||
subnet: "Subnet"
|
subnet: "Subnet"
|
||||||
vpc_id: "VPC Id"
|
vpc_id: "VPC Id"
|
||||||
zone: "Zone"
|
zone: "Zone"
|
||||||
environments: "Environments"
|
deploy_env: "Environment"
|
||||||
environment: "Environment"
|
|
||||||
categories: "Categories"
|
|
||||||
category: "Category"
|
|
||||||
expires: "Expires in"
|
|
||||||
node_name: "Node name"
|
node_name: "Node name"
|
||||||
image: "Image"
|
image: "Image"
|
||||||
flavor: "Flavor"
|
flavor: "Flavor"
|
||||||
security_groups: "Security groups"
|
group: "Group"
|
||||||
key: "Keys"
|
key: "Keys"
|
||||||
templates: "Templates"
|
templates: "Templates"
|
||||||
run_list: "Run list"
|
run_list: "Run list"
|
||||||
|
groups: "Security groups"
|
||||||
subnets: "Subnets"
|
subnets: "Subnets"
|
||||||
users: "Users"
|
users: "Users"
|
||||||
server: "Server"
|
server: "Server"
|
||||||
@ -255,44 +199,31 @@ en:
|
|||||||
cloud_stack_id: "Cloud Stack id"
|
cloud_stack_id: "Cloud Stack id"
|
||||||
stack_status: Stack status
|
stack_status: Stack status
|
||||||
ssh_key: SSH key
|
ssh_key: SSH key
|
||||||
policies: Policies
|
|
||||||
dependencies: Dependencies
|
|
||||||
roles: Roles
|
|
||||||
owner: Owner
|
|
||||||
cm_tool: CM
|
|
||||||
bootstrap_template: Bootstrap template
|
|
||||||
title:
|
title:
|
||||||
chef:
|
flavor:
|
||||||
bootstrap_templates: "Bootstrap templates"
|
list: "Flavors"
|
||||||
tags: "Tags"
|
bootstrap_template:
|
||||||
|
list: "Bootstrap templates"
|
||||||
filter:
|
filter:
|
||||||
list: "Filters"
|
list: "Filters"
|
||||||
|
group:
|
||||||
|
list: "Security groups"
|
||||||
image:
|
image:
|
||||||
list: "Images"
|
list: "Images"
|
||||||
show: "Image '%{id}' information"
|
show: "Image '%{id}' information"
|
||||||
key:
|
key:
|
||||||
list: "Keys"
|
list: "Keys"
|
||||||
|
network:
|
||||||
|
list: "Networks"
|
||||||
project:
|
project:
|
||||||
list: "Projects"
|
list: "Projects"
|
||||||
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"
|
envs: "Project '%{name}' deploy envs"
|
||||||
environment:
|
|
||||||
list: "Project '%{project}' environments"
|
|
||||||
show: "Project '%{project}' environment '%{id}' information"
|
|
||||||
servers: "Servers for project '%{project}' and environment '%{env}'"
|
|
||||||
stacks: "Stacks for project '%{project}' and environment '%{env}'"
|
|
||||||
category:
|
|
||||||
list: Categories
|
|
||||||
show: "Information about category '%{cat}' of project '%{project}' and environment '%{env}'"
|
|
||||||
provider:
|
provider:
|
||||||
list: "Providers"
|
list: "Providers"
|
||||||
accounts: "Provider %{provider} accounts"
|
accounts: "Provider %{provider} accounts"
|
||||||
flavors: "Flavors"
|
|
||||||
networks: "Networks"
|
|
||||||
security_groups: "Security groups"
|
|
||||||
vpcs: "VPCs"
|
|
||||||
script:
|
script:
|
||||||
list: "Scripts"
|
list: "Scripts"
|
||||||
server:
|
server:
|
||||||
@ -301,6 +232,8 @@ en:
|
|||||||
ec2: "Ec2 servers"
|
ec2: "Ec2 servers"
|
||||||
openstack: "Openstack servers"
|
openstack: "Openstack servers"
|
||||||
show: "Server '%{name}'"
|
show: "Server '%{name}'"
|
||||||
|
tag:
|
||||||
|
list: "Tags"
|
||||||
users:
|
users:
|
||||||
list: "Users"
|
list: "Users"
|
||||||
stack_template:
|
stack_template:
|
||||||
@ -309,38 +242,33 @@ en:
|
|||||||
stack:
|
stack:
|
||||||
list: "Stacks"
|
list: "Stacks"
|
||||||
show: "Stack"
|
show: "Stack"
|
||||||
role:
|
|
||||||
list: "Roles"
|
|
||||||
policies: "Roles policies"
|
|
||||||
not_found:
|
not_found:
|
||||||
chef:
|
flavor:
|
||||||
bootstrap_template: "No bootstrap templates found"
|
list: "No flavor found"
|
||||||
tags: "No tags found"
|
bootstrap_template:
|
||||||
|
list: "No bootstrap templates found"
|
||||||
filter:
|
filter:
|
||||||
list: "No filters found"
|
list: "No filters found"
|
||||||
|
group:
|
||||||
|
list: "No security groups found"
|
||||||
image:
|
image:
|
||||||
list: "No images found"
|
list: "No images found"
|
||||||
key:
|
key:
|
||||||
list: "No keys found"
|
list: "No keys found"
|
||||||
|
network:
|
||||||
|
list: "No networks found"
|
||||||
project:
|
project:
|
||||||
list: "No project found"
|
list: "No project found"
|
||||||
servers: "No servers for project '%{name}' found"
|
servers: "No servers for project '%{name}' found"
|
||||||
stacks: "No stacks for project '%{name}' found"
|
stacks: "No stacks for project '%{name}' found"
|
||||||
environment:
|
|
||||||
list: "No environments found"
|
|
||||||
category:
|
|
||||||
list: "No categories found"
|
|
||||||
servers: "No servers found"
|
|
||||||
provider:
|
provider:
|
||||||
list: "Empty providers list"
|
list: "Empty providers list"
|
||||||
flavors: "No flavor found"
|
|
||||||
network: "No networks found"
|
|
||||||
security_group: "No security groups found"
|
|
||||||
image: "No images found"
|
|
||||||
script:
|
script:
|
||||||
list: "No scripts uploaded"
|
list: "No scripts uploaded"
|
||||||
server:
|
server:
|
||||||
list: "No servers found"
|
list: "No servers found"
|
||||||
|
tag:
|
||||||
|
list: "No tags found"
|
||||||
user:
|
user:
|
||||||
list: "No users found"
|
list: "No users found"
|
||||||
stack_template:
|
stack_template:
|
||||||
@ -432,9 +360,9 @@ en:
|
|||||||
instance: Unreserve server by instance id
|
instance: Unreserve server by instance id
|
||||||
create:
|
create:
|
||||||
without_bootstrap: 'Run server without bootsraping phase'
|
without_bootstrap: 'Run server without bootsraping phase'
|
||||||
name: Set server name
|
name: Set node name
|
||||||
groups: The security groups for this server
|
groups: The security groups for this server
|
||||||
skip_rollback: Cancel rollback operation on error
|
force: Cancel rollback operation on error
|
||||||
key: User another key for server
|
key: User another key for server
|
||||||
private_ip: Private ip for this server
|
private_ip: Private ip for this server
|
||||||
bootstrap:
|
bootstrap:
|
||||||
@ -455,16 +383,7 @@ en:
|
|||||||
without_bootstrap: Skip bootsraping phase on created instances
|
without_bootstrap: Skip bootsraping phase on created instances
|
||||||
stack_template:
|
stack_template:
|
||||||
provider: Stack template provider
|
provider: Stack template provider
|
||||||
provider_account: Provider account
|
|
||||||
id: Stack template id
|
id: Stack template id
|
||||||
template_file: Stack template file
|
template_file: Stack template file
|
||||||
user:
|
user:
|
||||||
new_password: New user password
|
new_password: New user password
|
||||||
provider:
|
|
||||||
account:
|
|
||||||
description: "Account description"
|
|
||||||
ssh_key: "Key id"
|
|
||||||
use_iam_profile: "Use IAM profile (aws only)"
|
|
||||||
access_key_id: "Access key id (aws only)"
|
|
||||||
secret_access_key: "Secret access key (aws only)"
|
|
||||||
|
|
||||||
|
|||||||
@ -25,113 +25,84 @@ ru:
|
|||||||
warn: "Предупреждение: %{msg}"
|
warn: "Предупреждение: %{msg}"
|
||||||
error: "Ошибка: %{msg}"
|
error: "Ошибка: %{msg}"
|
||||||
headers:
|
headers:
|
||||||
chef: "Опции Chef"
|
flavor: "Конфигурация"
|
||||||
bootstrap_templates: "Шаблоны"
|
|
||||||
deploy: "Деплой"
|
deploy: "Деплой"
|
||||||
|
template: "Шаблон загрузки"
|
||||||
filters: "Фильтры"
|
filters: "Фильтры"
|
||||||
|
group: "Группы безопасности"
|
||||||
image: "Образ"
|
image: "Образ"
|
||||||
key: "SSH ключ"
|
key: "Ключ"
|
||||||
|
network: "Сеть"
|
||||||
project: "Проект"
|
project: "Проект"
|
||||||
environment: "Окружение проект"
|
project_env: "Окружение проект"
|
||||||
category: "Категория Окружения"
|
|
||||||
provider: "Провайдер"
|
provider: "Провайдер"
|
||||||
provider_account: "Аккаунт провайдера"
|
|
||||||
server: "Сервер"
|
server: "Сервер"
|
||||||
script: "Скрипт"
|
script: "Скрипт"
|
||||||
|
tag: "Тег"
|
||||||
user: "Пользователь"
|
user: "Пользователь"
|
||||||
role: "Роль"
|
|
||||||
handler:
|
handler:
|
||||||
role:
|
flavor:
|
||||||
create:
|
list:
|
||||||
description: "Описание роли"
|
empty: "Список конфигураций пуст"
|
||||||
policies: "Политики роли"
|
|
||||||
question:
|
|
||||||
create: "Создать роль"
|
|
||||||
delete: "Удалить роль '%{role}'"
|
|
||||||
all_policies: "Установить все политики для роли"
|
|
||||||
provider:
|
|
||||||
vpc:
|
|
||||||
invalid_provider: "Операция доступна только для провайдера 'aws'"
|
|
||||||
list:
|
|
||||||
empty: "Список VPC пуст"
|
|
||||||
account:
|
|
||||||
create:
|
|
||||||
description: "Описание"
|
|
||||||
ssh_key: "SSH ключ"
|
|
||||||
aws:
|
|
||||||
use_iam_profile: "Использовать профайл IAM"
|
|
||||||
secret_access_key: "Ключ доступа"
|
|
||||||
access_key_id: "Идентификатор ключа доступа"
|
|
||||||
question:
|
|
||||||
delete: "Вы уверен, что хотите удалить аккаунт '%{account}'"
|
|
||||||
create: "Создать аккаунт для провайдера"
|
|
||||||
tags:
|
|
||||||
question:
|
|
||||||
delete: "Вы уверены, что хотите удалить тэг(и) '%{name}' из ноды '%{node}'?"
|
|
||||||
flavor:
|
|
||||||
list:
|
|
||||||
empty: "Список конфигураций пуст"
|
|
||||||
image:
|
image:
|
||||||
question:
|
question:
|
||||||
delete: "Вы уверены, что хотите удалить образ '%{name}'"
|
delete: "Вы уверены, что хотите удалить образ '%{name}'?"
|
||||||
create: "Создать образ"
|
create: "Создать образ?"
|
||||||
create:
|
create:
|
||||||
ssh_user: "Имя пользоватлея ssh"
|
ssh_user: "Имя пользоватлея ssh"
|
||||||
|
template: "Шаблон загрузки или пустое значение"
|
||||||
|
template_empty: "Нет ни одного шаблона загрузки, будет использован шаблон по умолчанию"
|
||||||
filter:
|
filter:
|
||||||
question:
|
question:
|
||||||
delete: "Вы уверены, что хотите удалить фильтр(ы) образа '%{name}'"
|
delete: "Вы уверены, что хотите удалить фильтр(ы) образа '%{name}'?"
|
||||||
key:
|
key:
|
||||||
question:
|
question:
|
||||||
delete: "Вы уверены, что хотите удалить ключ '%{name}'"
|
delete: "Вы уверены, что хотите удалить ключ '%{name}'?"
|
||||||
create: "Создать ключ"
|
|
||||||
project:
|
project:
|
||||||
list:
|
list:
|
||||||
empty: "Список проектов пуст"
|
empty: "Список проектов пуст"
|
||||||
|
env:
|
||||||
|
list:
|
||||||
|
empty: "Список окружений проекта пуст"
|
||||||
question:
|
question:
|
||||||
delete: "Вы уверены, что хотите удалить проект '%{name}'"
|
delete: "Вы уверены, что хотите удалить проект '%{name}'?"
|
||||||
create: "Создать проект"
|
create: "Создать проект?"
|
||||||
update: "Обновить проект"
|
update: "Обновить проект?"
|
||||||
add_env: "Добавить окружение"
|
add_env: "Добавить окружение?"
|
||||||
run_list:
|
|
||||||
empty: "Сделать run_list пустым"
|
|
||||||
parameter:
|
parameter:
|
||||||
run_list:
|
run_list:
|
||||||
empty: "Предупреждение: список запуска пуст, продолжить"
|
empty: "Предупреждение: список запуска пуст, продолжить?"
|
||||||
exist: "Проект '%{project}' уже существует"
|
exist: "Проект '%{project}' уже существует"
|
||||||
create:
|
create:
|
||||||
question:
|
|
||||||
users_choose: "Вы хотите выбрать пользователей"
|
|
||||||
description: "Описание проекта"
|
|
||||||
invalid_json: "Неверный JSON в файле '%{file}'"
|
invalid_json: "Неверный JSON в файле '%{file}'"
|
||||||
users: "пользователи проекта"
|
env: "Идентификатор окружения"
|
||||||
|
env_exist: "Окружение '%{env}' уже существует"
|
||||||
|
flavor:
|
||||||
|
not_found: "Конфигурация не надена"
|
||||||
|
subnet:
|
||||||
|
ec2: "Подсеть (или Enter)"
|
||||||
|
openstack: "Подсети"
|
||||||
|
user: "Пользователи, Вы будете добалены автоматически"
|
||||||
run_list:
|
run_list:
|
||||||
invalid: "ОШИБКА: неверные элементы run_list: %{list}"
|
invalid: "ОШИБКА: неверные элементы run_list: %{list}"
|
||||||
environment:
|
invalid_subcommand: "Неверная подкомманда для '%{cmd}': '%{scmd}'"
|
||||||
create:
|
|
||||||
id_exists: "Окружение с идентификатором '%{env}' уже существует"
|
|
||||||
question:
|
|
||||||
delete: "Вы уверены, что хотите удалить окружение '%{env}' из проекта '%{name}'"
|
|
||||||
create: "Создать окружение"
|
|
||||||
category:
|
|
||||||
question:
|
|
||||||
delete: "Вы уверены, что хотите удалить категорию '%{cat}' из окружения '%{env}' проекта '%{name}'"
|
|
||||||
create: "Создать категорию"
|
|
||||||
script:
|
script:
|
||||||
question:
|
question:
|
||||||
delete: "Вы уверены, что хотите удалить скрипт '%{name}'"
|
delete: "Вы уверены, что хотите удалить скрипт '%{name}'?"
|
||||||
|
tag:
|
||||||
|
question:
|
||||||
|
delete: "Вы уверены, что хотите удалить тэг(и) '%{name}' из ноды '%{node}'?"
|
||||||
user:
|
user:
|
||||||
question:
|
question:
|
||||||
create: "Создать пользователя"
|
delete: "Вы уверены, что хотите удалить пользователя '%{name}'?"
|
||||||
delete: "Вы уверены, что хотите удалить пользователя '%{name}'"
|
|
||||||
password_for: "Пароль для %{user}:"
|
password_for: "Пароль для %{user}:"
|
||||||
server:
|
server:
|
||||||
question:
|
question:
|
||||||
delete: "Вы уверены, что хотите удалить сервер '%{id}'"
|
delete: "Вы уверены, что хотите удалить сервер '%{name}'?"
|
||||||
unbootstrap: "Вы уверены, что хотите удалить конфигурацию сервера '%{id}'"
|
|
||||||
message:
|
message:
|
||||||
choose_list_default: "Выберите значения из списка (разделенные запятой), например 1,2,3 или оставте пустым для значеия по умолчанию '%{default}'"
|
choose_list_default: "Выберите значения из списка (разделенные запятой), например 1,2,3 или оставте пустым для значеия по умолчанию '%{default}': "
|
||||||
choose_list: "Выберите значения из списка (разделенные запятой), например 1,2,3"
|
choose_list: "Выберите значения из списка (разделенные запятой), например 1,2,3: "
|
||||||
choose: "Выберите %{name}"
|
choose: "Выберите '%{name}': "
|
||||||
error:
|
error:
|
||||||
parameter:
|
parameter:
|
||||||
undefined: "Ошибка: параметр '%{name}' не указан"
|
undefined: "Ошибка: параметр '%{name}' не указан"
|
||||||
@ -142,26 +113,6 @@ ru:
|
|||||||
invalid: "Неверный номер"
|
invalid: "Неверный номер"
|
||||||
list:
|
list:
|
||||||
empty: "%{name} список пуст"
|
empty: "%{name} список пуст"
|
||||||
choose:
|
|
||||||
flavor: конфигурацию
|
|
||||||
image: образ
|
|
||||||
vpc: VPC
|
|
||||||
network: подсеть
|
|
||||||
networks: подсети
|
|
||||||
security_groups: "группы безопасности"
|
|
||||||
ssh_key: "SSH ключ"
|
|
||||||
input:
|
|
||||||
run_list:
|
|
||||||
label: "Список запуска, например, recipe[mycookbook::myrecipe],role[myrole]"
|
|
||||||
invalid: "Неверный список запуска"
|
|
||||||
user:
|
|
||||||
label: "Пользователи"
|
|
||||||
list: "список пользователей"
|
|
||||||
question:
|
|
||||||
choose: "Выбрать"
|
|
||||||
message:
|
|
||||||
input_list_default: "Введите %{cmd} (разделенные запятой) или оставьте пустым для значения по умолчанию '%{default}': "
|
|
||||||
input_list: "Введите %{cmd} (разделенные запятой): "
|
|
||||||
output:
|
output:
|
||||||
table_header:
|
table_header:
|
||||||
api_version: "Версия API"
|
api_version: "Версия API"
|
||||||
@ -169,8 +120,6 @@ ru:
|
|||||||
id: "Id"
|
id: "Id"
|
||||||
name: "Имя"
|
name: "Имя"
|
||||||
provider: "Провайдер"
|
provider: "Провайдер"
|
||||||
provider_account: "Аккаунт провайдера"
|
|
||||||
use_iam_profile: "IAM профиль"
|
|
||||||
remote_user: "Пользователь"
|
remote_user: "Пользователь"
|
||||||
disk: "Диск"
|
disk: "Диск"
|
||||||
virtual_cpus: "Виртуальные ЦПУ"
|
virtual_cpus: "Виртуальные ЦПУ"
|
||||||
@ -182,14 +131,12 @@ ru:
|
|||||||
cidr: "CIDR"
|
cidr: "CIDR"
|
||||||
description: "Описание"
|
description: "Описание"
|
||||||
status: "Статус"
|
status: "Статус"
|
||||||
filename: "Имя файла"
|
template: "Шаблон"
|
||||||
|
scope: "Область"
|
||||||
subnet: "Подсеть"
|
subnet: "Подсеть"
|
||||||
vpc_id: "VPC Id"
|
vpc_id: "VPC Id"
|
||||||
zone: "Зона"
|
zone: "Зона"
|
||||||
environments: "Окружения"
|
deploy_env: "Окружение"
|
||||||
environment: "Окружение"
|
|
||||||
category: "Категория"
|
|
||||||
expires: "Время жизни"
|
|
||||||
node_name: "Имя ноды"
|
node_name: "Имя ноды"
|
||||||
image: "Образ"
|
image: "Образ"
|
||||||
flavor: "Конфигурация"
|
flavor: "Конфигурация"
|
||||||
@ -197,7 +144,7 @@ ru:
|
|||||||
key: "Ключи"
|
key: "Ключи"
|
||||||
templates: "Шаблоны"
|
templates: "Шаблоны"
|
||||||
run_list: "Список запуска"
|
run_list: "Список запуска"
|
||||||
security_groups: "Группы безоп."
|
groups: "Группы безоп."
|
||||||
subnets: "Подсети"
|
subnets: "Подсети"
|
||||||
users: "Пользователи"
|
users: "Пользователи"
|
||||||
server: "Сервер"
|
server: "Сервер"
|
||||||
@ -221,43 +168,29 @@ ru:
|
|||||||
keypair: "Ключ"
|
keypair: "Ключ"
|
||||||
created_at: "Создан"
|
created_at: "Создан"
|
||||||
created_by: "Создал"
|
created_by: "Создал"
|
||||||
policies: Политики
|
|
||||||
dependencies: Зависимости
|
|
||||||
roles: Роли
|
|
||||||
owner: Владелец
|
|
||||||
cm_tool: УК
|
|
||||||
bootstrap_template: Шаблон конфигурации
|
|
||||||
title:
|
title:
|
||||||
chef:
|
flavor:
|
||||||
bootstrap_templates: "Шаблоны"
|
list: "Конфигурации"
|
||||||
tags: "Теги"
|
bootstrap_template:
|
||||||
|
list: "Шаблоны"
|
||||||
filter:
|
filter:
|
||||||
list: "Фильтры"
|
list: "Фильтры"
|
||||||
|
group:
|
||||||
|
list: "Группы безопасности"
|
||||||
image:
|
image:
|
||||||
list: "Образы"
|
list: "Образы"
|
||||||
show: "Информация об образе '%{id}'"
|
show: "Информация об образе '%{id}'"
|
||||||
key:
|
key:
|
||||||
list: "Ключи"
|
list: "Ключи"
|
||||||
|
network:
|
||||||
|
list: "Сети"
|
||||||
project:
|
project:
|
||||||
list: "Проекты"
|
list: "Проекты"
|
||||||
show: "Информация о проекте '%{name}'"
|
show: "Информация о проекте '%{name}'"
|
||||||
servers: "Сервера проекта '%{title}'"
|
servers: "Сервера проекта '%{title}'"
|
||||||
test: "Тестирование проекта: %{project} - %{env}"
|
test: "Тестирование проекта: %{project} - %{env}"
|
||||||
environment:
|
|
||||||
list: "Окружения проекта '%{project}'"
|
|
||||||
show: "Информация об окружении '%{id}' проекта '%{project}'"
|
|
||||||
servers: "Сервера для проекта '%{project}' и окружения '%{env}'"
|
|
||||||
stacks: "Стеки для проекта '%{project}' и окружения '%{env}'"
|
|
||||||
category:
|
|
||||||
list: Категории
|
|
||||||
show: "Информация о категории '%{cat}' проекта '%{project}' и окружения '%{env}'"
|
|
||||||
provider:
|
provider:
|
||||||
list: "Провайдеры"
|
list: "Провайдеры"
|
||||||
flavors: "Конфигурации"
|
|
||||||
security_groups: "Группы безопасности"
|
|
||||||
network: "Сети"
|
|
||||||
images: "Образы"
|
|
||||||
vpcs: "VPCs"
|
|
||||||
script:
|
script:
|
||||||
list: "Скрипты"
|
list: "Скрипты"
|
||||||
server:
|
server:
|
||||||
@ -266,36 +199,36 @@ ru:
|
|||||||
ec2: "Сервера Ec2"
|
ec2: "Сервера Ec2"
|
||||||
openstack: "Сервера Openstack"
|
openstack: "Сервера Openstack"
|
||||||
show: "Сервер '%{name}'"
|
show: "Сервер '%{name}'"
|
||||||
|
tag:
|
||||||
|
list: "Теги"
|
||||||
users:
|
users:
|
||||||
list: "Пользователи"
|
list: "Пользователи"
|
||||||
role:
|
|
||||||
list: "Роли"
|
|
||||||
policies: "Политики ролей"
|
|
||||||
not_found:
|
not_found:
|
||||||
chef:
|
flavor:
|
||||||
bootstrap_template: "Ни одного шаблона не найдено"
|
list: "Ни одной конфигурации не найдено"
|
||||||
tags: "Ни одного тега не найдено"
|
bootstrap_template:
|
||||||
|
list: "Ни одного шаблона не найдено"
|
||||||
filter:
|
filter:
|
||||||
list: "Ни одного фильтра не найдено"
|
list: "Ни одного фильтра не найдено"
|
||||||
|
group:
|
||||||
|
list: "Ни одной группы безопасности не найдено"
|
||||||
image:
|
image:
|
||||||
list: "Ни одного образа не найдено"
|
list: "Ни одного образа не найдено"
|
||||||
key:
|
key:
|
||||||
list: "Ни одного ключа не найдено"
|
list: "Ни одного ключа не найдено"
|
||||||
|
network:
|
||||||
|
list: "Ни одной сети не найдено"
|
||||||
project:
|
project:
|
||||||
list: "Ни одного проекта не найдено"
|
list: "Ни одного проекта не найдено"
|
||||||
servers: "Ни одного сервера для проекта '%{name}' не найдено"
|
servers: "Ни одного сервера для проекта '%{name}' не найдено"
|
||||||
environment:
|
|
||||||
list: "Ни одного окружения не найдено"
|
|
||||||
provider:
|
provider:
|
||||||
list: "Ни одного провайдера не найдено"
|
list: "Ни одного провайдера не найдено"
|
||||||
flavors: "Ни одной конфигурации не найдено"
|
|
||||||
security_groups: "Ни одной группы безопасности не найдено"
|
|
||||||
network: "Ни одной сети не найдено"
|
|
||||||
images: "Ни одного образа не найдено"
|
|
||||||
script:
|
script:
|
||||||
list: "Не загружено ни одного скрипта"
|
list: "Не загружено ни одного скрипта"
|
||||||
server:
|
server:
|
||||||
list: "Ни одного сервера не найдено"
|
list: "Ни одного сервера не найдено"
|
||||||
|
tag:
|
||||||
|
list: "Ни одного тега не найдено"
|
||||||
user:
|
user:
|
||||||
list: "Ни одного пользователя не найдено"
|
list: "Ни одного пользователя не найдено"
|
||||||
options:
|
options:
|
||||||
@ -337,7 +270,3 @@ ru:
|
|||||||
script:
|
script:
|
||||||
run:
|
run:
|
||||||
params: "Аргументы скрипта (список разделенный запятой)"
|
params: "Аргументы скрипта (список разделенный запятой)"
|
||||||
description:
|
|
||||||
provider:
|
|
||||||
images:
|
|
||||||
all: "Показать все образы без фильтра"
|
|
||||||
|
|||||||
@ -4,24 +4,20 @@ source 'https://rubygems.org'
|
|||||||
|
|
||||||
gem "thin", "~>1.5.1"
|
gem "thin", "~>1.5.1"
|
||||||
gem "mime-types", "~>1.25.1"
|
gem "mime-types", "~>1.25.1"
|
||||||
gem "sinatra", '~> 1.4.5'
|
gem "sinatra", "1.4.5"
|
||||||
gem "sinatra-contrib"#, "1.4.1"
|
gem "sinatra-contrib"#, "1.4.1"
|
||||||
gem "sinatra-websocket"#, "~>0.3.0"
|
gem "sinatra-websocket"#, "~>0.3.0"
|
||||||
gem "fog", "~>1.30"
|
gem "fog", "~>1.20"
|
||||||
gem "mixlib-shellout"
|
gem "mixlib-shellout"
|
||||||
gem "chef", ">=12"
|
gem "chef", ">=12"
|
||||||
gem "mongo", '~> 2.1'
|
gem "mongo", '1.12.3'
|
||||||
gem "bson_ext"
|
gem "bson_ext"
|
||||||
gem "multi_json", "1.7.8"
|
gem "multi_json", "1.7.8"
|
||||||
gem "sidekiq", "4.1.0"
|
gem "sidekiq", "3.2.6"
|
||||||
gem 'rake', '10.2.0'
|
gem 'rake', '10.2.0'
|
||||||
gem 'rack-accept-media-types'
|
gem 'rack-accept-media-types'
|
||||||
gem 'rack', '1.5.2'
|
gem 'rack', '1.5.2'
|
||||||
gem 'hooks'
|
gem 'hooks'
|
||||||
gem 'mongoid', '~> 5.0.0'
|
|
||||||
gem 'net-scp', '1.2.1'
|
|
||||||
gem 'net-ssh', '3.0.2' # with version 3.1.1 scp.upload method does not work
|
|
||||||
gem 'swagger-blocks', '1.3.3'
|
|
||||||
|
|
||||||
#gem "devops-nibr", :path => "../../devops-nibr"
|
#gem "devops-nibr", :path => "../../devops-nibr"
|
||||||
|
|
||||||
@ -34,7 +30,6 @@ group :test do
|
|||||||
gem 'factory_girl', '~>4.5'
|
gem 'factory_girl', '~>4.5'
|
||||||
gem 'activesupport'
|
gem 'activesupport'
|
||||||
gem 'rspec_junit_formatter'
|
gem 'rspec_junit_formatter'
|
||||||
gem 'database_cleaner', '~> 1.5'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
group :devepoment do
|
group :devepoment do
|
||||||
|
|||||||
@ -1,105 +1,91 @@
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
CFPropertyList (2.3.2)
|
CFPropertyList (2.3.1)
|
||||||
activemodel (4.2.6)
|
activesupport (4.2.4)
|
||||||
activesupport (= 4.2.6)
|
|
||||||
builder (~> 3.1)
|
|
||||||
activesupport (4.2.6)
|
|
||||||
i18n (~> 0.7)
|
i18n (~> 0.7)
|
||||||
json (~> 1.7, >= 1.7.7)
|
json (~> 1.7, >= 1.7.7)
|
||||||
minitest (~> 5.1)
|
minitest (~> 5.1)
|
||||||
thread_safe (~> 0.3, >= 0.3.4)
|
thread_safe (~> 0.3, >= 0.3.4)
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 1.1)
|
||||||
addressable (2.4.0)
|
addressable (2.3.8)
|
||||||
backports (3.6.8)
|
backports (3.6.4)
|
||||||
bson (4.1.0)
|
bson (1.12.3)
|
||||||
bson_ext (1.5.1)
|
bson_ext (1.12.3)
|
||||||
|
bson (~> 1.12.3)
|
||||||
builder (3.2.2)
|
builder (3.2.2)
|
||||||
byebug (8.2.4)
|
byebug (5.0.0)
|
||||||
chef (12.9.38)
|
columnize (= 0.9.0)
|
||||||
bundler (>= 1.10)
|
celluloid (0.15.2)
|
||||||
chef-config (= 12.9.38)
|
timers (~> 1.1.0)
|
||||||
chef-zero (~> 4.5)
|
chef (12.1.2)
|
||||||
|
chef-zero (~> 4.0)
|
||||||
diff-lcs (~> 1.2, >= 1.2.4)
|
diff-lcs (~> 1.2, >= 1.2.4)
|
||||||
erubis (~> 2.7)
|
erubis (~> 2.7)
|
||||||
ffi-yajl (~> 2.2)
|
ffi-yajl (~> 1.2)
|
||||||
highline (~> 1.6, >= 1.6.9)
|
highline (~> 1.6, >= 1.6.9)
|
||||||
mixlib-authentication (~> 1.4)
|
mixlib-authentication (~> 1.3)
|
||||||
mixlib-cli (~> 1.4)
|
mixlib-cli (~> 1.4)
|
||||||
|
mixlib-config (~> 2.0)
|
||||||
mixlib-log (~> 1.3)
|
mixlib-log (~> 1.3)
|
||||||
mixlib-shellout (~> 2.0)
|
mixlib-shellout (>= 2.0.0.rc.0, < 3.0)
|
||||||
net-sftp (~> 2.1, >= 2.1.2)
|
net-ssh (~> 2.6)
|
||||||
net-ssh (>= 2.9, < 4.0)
|
|
||||||
net-ssh-multi (~> 1.1)
|
net-ssh-multi (~> 1.1)
|
||||||
ohai (>= 8.6.0.alpha.1, < 9)
|
ohai (~> 8.0)
|
||||||
plist (~> 3.2)
|
plist (~> 3.1.0)
|
||||||
proxifier (~> 1.0)
|
pry (~> 0.9)
|
||||||
rspec-core (~> 3.4)
|
rspec-core (~> 3.2)
|
||||||
rspec-expectations (~> 3.4)
|
rspec-expectations (~> 3.2)
|
||||||
rspec-mocks (~> 3.4)
|
rspec-mocks (~> 3.2)
|
||||||
rspec_junit_formatter (~> 0.2.0)
|
rspec_junit_formatter (~> 0.2.0)
|
||||||
serverspec (~> 2.7)
|
serverspec (~> 2.7)
|
||||||
specinfra (~> 2.10)
|
specinfra (~> 2.10)
|
||||||
syslog-logger (~> 1.6)
|
chef-zero (4.2.3)
|
||||||
uuidtools (~> 2.1.5)
|
ffi-yajl (>= 1.1, < 3.0)
|
||||||
chef-config (12.9.38)
|
hashie (~> 2.0)
|
||||||
fuzzyurl (~> 0.8.0)
|
|
||||||
mixlib-config (~> 2.0)
|
|
||||||
mixlib-shellout (~> 2.0)
|
|
||||||
chef-zero (4.6.1)
|
|
||||||
ffi-yajl (~> 2.2)
|
|
||||||
hashie (>= 2.0, < 4.0)
|
|
||||||
mixlib-log (~> 1.3)
|
mixlib-log (~> 1.3)
|
||||||
rack
|
rack
|
||||||
uuidtools (~> 2.1)
|
uuidtools (~> 2.1)
|
||||||
coderay (1.1.1)
|
coderay (1.1.0)
|
||||||
concurrent-ruby (1.0.1)
|
columnize (0.9.0)
|
||||||
connection_pool (2.2.0)
|
connection_pool (2.2.0)
|
||||||
cucumber (2.3.3)
|
cucumber (2.0.0)
|
||||||
builder (>= 2.1.2)
|
builder (>= 2.1.2)
|
||||||
cucumber-core (~> 1.4.0)
|
cucumber-core (~> 1.1.3)
|
||||||
cucumber-wire (~> 0.0.1)
|
|
||||||
diff-lcs (>= 1.1.3)
|
diff-lcs (>= 1.1.3)
|
||||||
gherkin (~> 3.2.0)
|
gherkin (~> 2.12)
|
||||||
multi_json (>= 1.7.5, < 2.0)
|
multi_json (>= 1.7.5, < 2.0)
|
||||||
multi_test (>= 0.1.2)
|
multi_test (>= 0.1.2)
|
||||||
cucumber-core (1.4.0)
|
cucumber-core (1.1.3)
|
||||||
gherkin (~> 3.2.0)
|
gherkin (~> 2.12.0)
|
||||||
cucumber-wire (0.0.1)
|
|
||||||
daemons (1.2.3)
|
daemons (1.2.3)
|
||||||
database_cleaner (1.5.1)
|
|
||||||
diff-lcs (1.2.5)
|
diff-lcs (1.2.5)
|
||||||
docile (1.1.5)
|
docile (1.1.5)
|
||||||
em-websocket (0.3.8)
|
em-websocket (0.3.8)
|
||||||
addressable (>= 2.1.1)
|
addressable (>= 2.1.1)
|
||||||
eventmachine (>= 0.12.9)
|
eventmachine (>= 0.12.9)
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
eventmachine (1.2.0.1)
|
eventmachine (1.0.7)
|
||||||
excon (0.49.0)
|
excon (0.45.3)
|
||||||
factory_girl (4.7.0)
|
factory_girl (4.5.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
ffi (1.9.10)
|
ffi (1.9.9)
|
||||||
ffi-yajl (2.2.3)
|
ffi-yajl (1.4.0)
|
||||||
|
ffi (~> 1.5)
|
||||||
libyajl2 (~> 1.2)
|
libyajl2 (~> 1.2)
|
||||||
fission (0.5.0)
|
fission (0.5.0)
|
||||||
CFPropertyList (~> 2.2)
|
CFPropertyList (~> 2.2)
|
||||||
fog (1.38.0)
|
fog (1.31.0)
|
||||||
fog-aliyun (>= 0.1.0)
|
|
||||||
fog-atmos
|
fog-atmos
|
||||||
fog-aws (>= 0.6.0)
|
fog-aws (~> 0.0)
|
||||||
fog-brightbox (~> 0.4)
|
fog-brightbox (~> 0.4)
|
||||||
fog-cloudatcost (~> 0.1.0)
|
fog-core (~> 1.30)
|
||||||
fog-core (~> 1.32)
|
fog-ecloud
|
||||||
fog-dynect (~> 0.0.2)
|
fog-google (>= 0.0.2)
|
||||||
fog-ecloud (~> 0.1)
|
|
||||||
fog-google (<= 0.1.0)
|
|
||||||
fog-json
|
fog-json
|
||||||
fog-local
|
fog-local
|
||||||
fog-openstack
|
|
||||||
fog-powerdns (>= 0.1.1)
|
fog-powerdns (>= 0.1.1)
|
||||||
fog-profitbricks
|
fog-profitbricks
|
||||||
fog-rackspace
|
|
||||||
fog-radosgw (>= 0.0.2)
|
fog-radosgw (>= 0.0.2)
|
||||||
fog-riakcs
|
fog-riakcs
|
||||||
fog-sakuracloud (>= 0.0.4)
|
fog-sakuracloud (>= 0.0.4)
|
||||||
@ -109,71 +95,49 @@ GEM
|
|||||||
fog-terremark
|
fog-terremark
|
||||||
fog-vmfusion
|
fog-vmfusion
|
||||||
fog-voxel
|
fog-voxel
|
||||||
fog-vsphere (>= 0.4.0)
|
|
||||||
fog-xenserver
|
|
||||||
fog-xml (~> 0.1.1)
|
fog-xml (~> 0.1.1)
|
||||||
ipaddress (~> 0.5)
|
ipaddress (~> 0.5)
|
||||||
fog-aliyun (0.1.0)
|
nokogiri (~> 1.5, >= 1.5.11)
|
||||||
fog-core (~> 1.27)
|
|
||||||
fog-json (~> 1.0)
|
|
||||||
ipaddress (~> 0.8)
|
|
||||||
xml-simple (~> 1.1)
|
|
||||||
fog-atmos (0.1.0)
|
fog-atmos (0.1.0)
|
||||||
fog-core
|
fog-core
|
||||||
fog-xml
|
fog-xml
|
||||||
fog-aws (0.9.2)
|
fog-aws (0.6.0)
|
||||||
fog-core (~> 1.27)
|
fog-core (~> 1.27)
|
||||||
fog-json (~> 1.0)
|
fog-json (~> 1.0)
|
||||||
fog-xml (~> 0.1)
|
fog-xml (~> 0.1)
|
||||||
ipaddress (~> 0.8)
|
ipaddress (~> 0.8)
|
||||||
fog-brightbox (0.10.1)
|
fog-brightbox (0.7.2)
|
||||||
fog-core (~> 1.22)
|
fog-core (~> 1.22)
|
||||||
fog-json
|
fog-json
|
||||||
inflecto (~> 0.0.2)
|
inflecto (~> 0.0.2)
|
||||||
fog-cloudatcost (0.1.2)
|
fog-core (1.31.1)
|
||||||
fog-core (~> 1.36)
|
|
||||||
fog-json (~> 1.0)
|
|
||||||
fog-xml (~> 0.1)
|
|
||||||
ipaddress (~> 0.8)
|
|
||||||
fog-core (1.37.0)
|
|
||||||
builder
|
builder
|
||||||
excon (~> 0.45)
|
excon (~> 0.45)
|
||||||
formatador (~> 0.2)
|
formatador (~> 0.2)
|
||||||
fog-dynect (0.0.3)
|
mime-types
|
||||||
fog-core
|
net-scp (~> 1.1)
|
||||||
fog-json
|
net-ssh (>= 2.1.3)
|
||||||
fog-xml
|
|
||||||
fog-ecloud (0.3.0)
|
fog-ecloud (0.3.0)
|
||||||
fog-core
|
fog-core
|
||||||
fog-xml
|
fog-xml
|
||||||
fog-google (0.1.0)
|
fog-google (0.0.6)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-xml
|
fog-xml
|
||||||
fog-json (1.0.1)
|
fog-json (1.0.1)
|
||||||
fog-core (~> 1.0)
|
fog-core (~> 1.0)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
fog-local (0.3.0)
|
fog-local (0.2.1)
|
||||||
fog-core (~> 1.27)
|
fog-core (~> 1.27)
|
||||||
fog-openstack (0.1.2)
|
|
||||||
fog-core (>= 1.35)
|
|
||||||
fog-json (>= 1.0)
|
|
||||||
fog-xml (>= 0.1)
|
|
||||||
ipaddress (>= 0.8)
|
|
||||||
fog-powerdns (0.1.1)
|
fog-powerdns (0.1.1)
|
||||||
fog-core (~> 1.27)
|
fog-core (~> 1.27)
|
||||||
fog-json (~> 1.0)
|
fog-json (~> 1.0)
|
||||||
fog-xml (~> 0.1)
|
fog-xml (~> 0.1)
|
||||||
fog-profitbricks (0.0.5)
|
fog-profitbricks (0.0.3)
|
||||||
fog-core
|
fog-core
|
||||||
fog-xml
|
fog-xml
|
||||||
nokogiri
|
nokogiri
|
||||||
fog-rackspace (0.1.1)
|
fog-radosgw (0.0.4)
|
||||||
fog-core (>= 1.35)
|
|
||||||
fog-json (>= 1.0)
|
|
||||||
fog-xml (>= 0.1)
|
|
||||||
ipaddress (>= 0.8)
|
|
||||||
fog-radosgw (0.0.5)
|
|
||||||
fog-core (>= 1.21.0)
|
fog-core (>= 1.21.0)
|
||||||
fog-json
|
fog-json
|
||||||
fog-xml (>= 0.0.1)
|
fog-xml (>= 0.0.1)
|
||||||
@ -181,13 +145,13 @@ GEM
|
|||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-xml
|
fog-xml
|
||||||
fog-sakuracloud (1.7.5)
|
fog-sakuracloud (1.0.1)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-serverlove (0.1.2)
|
fog-serverlove (0.1.2)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-softlayer (1.1.0)
|
fog-softlayer (0.4.7)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-storm_on_demand (0.1.1)
|
fog-storm_on_demand (0.1.1)
|
||||||
@ -202,18 +166,12 @@ GEM
|
|||||||
fog-voxel (0.1.0)
|
fog-voxel (0.1.0)
|
||||||
fog-core
|
fog-core
|
||||||
fog-xml
|
fog-xml
|
||||||
fog-vsphere (0.6.3)
|
|
||||||
fog-core
|
|
||||||
rbvmomi (~> 1.8)
|
|
||||||
fog-xenserver (0.2.3)
|
|
||||||
fog-core
|
|
||||||
fog-xml
|
|
||||||
fog-xml (0.1.2)
|
fog-xml (0.1.2)
|
||||||
fog-core
|
fog-core
|
||||||
nokogiri (~> 1.5, >= 1.5.11)
|
nokogiri (~> 1.5, >= 1.5.11)
|
||||||
formatador (0.2.5)
|
formatador (0.2.5)
|
||||||
fuzzyurl (0.8.0)
|
gherkin (2.12.2)
|
||||||
gherkin (3.2.0)
|
multi_json (~> 1.3)
|
||||||
guard (2.13.0)
|
guard (2.13.0)
|
||||||
formatador (>= 0.2.4)
|
formatador (>= 0.2.4)
|
||||||
listen (>= 2.7, <= 4.0)
|
listen (>= 2.7, <= 4.0)
|
||||||
@ -224,80 +182,69 @@ GEM
|
|||||||
shellany (~> 0.0)
|
shellany (~> 0.0)
|
||||||
thor (>= 0.18.1)
|
thor (>= 0.18.1)
|
||||||
guard-compat (1.2.1)
|
guard-compat (1.2.1)
|
||||||
guard-rspec (4.6.5)
|
guard-rspec (4.6.4)
|
||||||
guard (~> 2.1)
|
guard (~> 2.1)
|
||||||
guard-compat (~> 1.1)
|
guard-compat (~> 1.1)
|
||||||
rspec (>= 2.99.0, < 4.0)
|
rspec (>= 2.99.0, < 4.0)
|
||||||
hashie (3.4.3)
|
hashie (2.1.2)
|
||||||
highline (1.7.8)
|
highline (1.7.2)
|
||||||
hooks (0.4.1)
|
hooks (0.4.0)
|
||||||
uber (~> 0.0.14)
|
uber (~> 0.0.4)
|
||||||
httpclient (2.7.1)
|
httpclient (2.6.0.1)
|
||||||
i18n (0.7.0)
|
i18n (0.7.0)
|
||||||
inflecto (0.0.2)
|
inflecto (0.0.2)
|
||||||
ipaddress (0.8.3)
|
ipaddress (0.8.0)
|
||||||
json (1.8.3)
|
json (1.8.3)
|
||||||
libyajl2 (1.2.0)
|
libyajl2 (1.2.0)
|
||||||
listen (3.0.6)
|
listen (3.0.4)
|
||||||
rb-fsevent (>= 0.9.3)
|
rb-fsevent (>= 0.9.3)
|
||||||
rb-inotify (>= 0.9.7)
|
rb-inotify (>= 0.9)
|
||||||
lumberjack (1.0.10)
|
lumberjack (1.0.9)
|
||||||
method_source (0.8.2)
|
method_source (0.8.2)
|
||||||
mime-types (1.25.1)
|
mime-types (1.25.1)
|
||||||
mini_portile2 (2.0.0)
|
mini_portile (0.6.2)
|
||||||
minitest (5.8.4)
|
minitest (5.8.2)
|
||||||
mixlib-authentication (1.4.0)
|
mixlib-authentication (1.3.0)
|
||||||
mixlib-log
|
mixlib-log
|
||||||
rspec-core (~> 3.2)
|
|
||||||
rspec-expectations (~> 3.2)
|
|
||||||
rspec-mocks (~> 3.2)
|
|
||||||
mixlib-cli (1.5.0)
|
mixlib-cli (1.5.0)
|
||||||
mixlib-config (2.2.1)
|
mixlib-config (2.2.1)
|
||||||
mixlib-log (1.6.0)
|
mixlib-log (1.6.0)
|
||||||
mixlib-shellout (2.2.6)
|
mixlib-shellout (2.1.0)
|
||||||
mongo (2.2.4)
|
mongo (1.12.3)
|
||||||
bson (~> 4.0)
|
bson (= 1.12.3)
|
||||||
mongoid (5.0.2)
|
|
||||||
activemodel (~> 4.0)
|
|
||||||
mongo (~> 2.1)
|
|
||||||
origin (~> 2.1)
|
|
||||||
tzinfo (>= 0.3.37)
|
|
||||||
multi_json (1.7.8)
|
multi_json (1.7.8)
|
||||||
multi_test (0.1.2)
|
multi_test (0.1.2)
|
||||||
nenv (0.3.0)
|
nenv (0.2.0)
|
||||||
|
net-dhcp (1.3.2)
|
||||||
net-scp (1.2.1)
|
net-scp (1.2.1)
|
||||||
net-ssh (>= 2.6.5)
|
net-ssh (>= 2.6.5)
|
||||||
net-sftp (2.1.2)
|
net-ssh (2.9.2)
|
||||||
net-ssh (>= 2.6.5)
|
|
||||||
net-ssh (3.0.2)
|
|
||||||
net-ssh-gateway (1.2.0)
|
net-ssh-gateway (1.2.0)
|
||||||
net-ssh (>= 2.6.5)
|
net-ssh (>= 2.6.5)
|
||||||
net-ssh-multi (1.2.1)
|
net-ssh-multi (1.2.1)
|
||||||
net-ssh (>= 2.6.5)
|
net-ssh (>= 2.6.5)
|
||||||
net-ssh-gateway (>= 1.2.0)
|
net-ssh-gateway (>= 1.2.0)
|
||||||
net-telnet (0.1.1)
|
nokogiri (1.6.6.2)
|
||||||
nokogiri (1.6.7.2)
|
mini_portile (~> 0.6.0)
|
||||||
mini_portile2 (~> 2.0.0.rc2)
|
|
||||||
notiffany (0.0.8)
|
notiffany (0.0.8)
|
||||||
nenv (~> 0.1)
|
nenv (~> 0.1)
|
||||||
shellany (~> 0.0)
|
shellany (~> 0.0)
|
||||||
ohai (8.14.0)
|
ohai (8.0.1)
|
||||||
chef-config (>= 12.5.0.alpha.1, < 13)
|
|
||||||
ffi (~> 1.9)
|
ffi (~> 1.9)
|
||||||
ffi-yajl (~> 2.2)
|
ffi-yajl (~> 1.1)
|
||||||
ipaddress
|
ipaddress
|
||||||
|
mime-types (~> 1.16)
|
||||||
mixlib-cli
|
mixlib-cli
|
||||||
mixlib-config (~> 2.0)
|
mixlib-config (~> 2.0)
|
||||||
mixlib-log
|
mixlib-log
|
||||||
mixlib-shellout (~> 2.0)
|
mixlib-shellout (~> 2.0)
|
||||||
plist (~> 3.1)
|
net-dhcp
|
||||||
|
rake (~> 10.1)
|
||||||
systemu (~> 2.6.4)
|
systemu (~> 2.6.4)
|
||||||
wmi-lite (~> 1.0)
|
wmi-lite (~> 1.0)
|
||||||
origin (2.2.0)
|
plist (3.1.0)
|
||||||
plist (3.2.0)
|
power_assert (0.2.3)
|
||||||
power_assert (0.2.7)
|
pry (0.10.1)
|
||||||
proxifier (1.0.3)
|
|
||||||
pry (0.10.3)
|
|
||||||
coderay (~> 1.1.0)
|
coderay (~> 1.1.0)
|
||||||
method_source (~> 0.8.1)
|
method_source (~> 0.8.1)
|
||||||
slop (~> 3.4)
|
slop (~> 3.4)
|
||||||
@ -308,56 +255,55 @@ GEM
|
|||||||
rack-test (0.6.3)
|
rack-test (0.6.3)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
rake (10.2.0)
|
rake (10.2.0)
|
||||||
rb-fsevent (0.9.7)
|
rb-fsevent (0.9.6)
|
||||||
rb-inotify (0.9.7)
|
rb-inotify (0.9.5)
|
||||||
ffi (>= 0.5.0)
|
ffi (>= 0.5.0)
|
||||||
rbvmomi (1.8.2)
|
redis (3.2.1)
|
||||||
builder
|
redis-namespace (1.5.2)
|
||||||
nokogiri (>= 1.4.1)
|
redis (~> 3.0, >= 3.0.4)
|
||||||
trollop
|
rspec (3.3.0)
|
||||||
redis (3.2.2)
|
rspec-core (~> 3.3.0)
|
||||||
rspec (3.4.0)
|
rspec-expectations (~> 3.3.0)
|
||||||
rspec-core (~> 3.4.0)
|
rspec-mocks (~> 3.3.0)
|
||||||
rspec-expectations (~> 3.4.0)
|
rspec-core (3.3.1)
|
||||||
rspec-mocks (~> 3.4.0)
|
rspec-support (~> 3.3.0)
|
||||||
rspec-core (3.4.4)
|
rspec-expectations (3.3.0)
|
||||||
rspec-support (~> 3.4.0)
|
|
||||||
rspec-expectations (3.4.0)
|
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.4.0)
|
rspec-support (~> 3.3.0)
|
||||||
rspec-its (1.2.0)
|
rspec-its (1.2.0)
|
||||||
rspec-core (>= 3.0.0)
|
rspec-core (>= 3.0.0)
|
||||||
rspec-expectations (>= 3.0.0)
|
rspec-expectations (>= 3.0.0)
|
||||||
rspec-mocks (3.4.1)
|
rspec-mocks (3.3.1)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.4.0)
|
rspec-support (~> 3.3.0)
|
||||||
rspec-support (3.4.1)
|
rspec-support (3.3.0)
|
||||||
rspec_junit_formatter (0.2.3)
|
rspec_junit_formatter (0.2.3)
|
||||||
builder (< 4)
|
builder (< 4)
|
||||||
rspec-core (>= 2, < 4, != 2.12.0)
|
rspec-core (>= 2, < 4, != 2.12.0)
|
||||||
serverspec (2.31.1)
|
serverspec (2.19.0)
|
||||||
multi_json
|
multi_json
|
||||||
rspec (~> 3.0)
|
rspec (~> 3.0)
|
||||||
rspec-its
|
rspec-its
|
||||||
specinfra (~> 2.53)
|
specinfra (~> 2.35)
|
||||||
sfl (2.2)
|
|
||||||
shellany (0.0.1)
|
shellany (0.0.1)
|
||||||
sidekiq (4.1.0)
|
sidekiq (3.2.6)
|
||||||
concurrent-ruby (~> 1.0)
|
celluloid (= 0.15.2)
|
||||||
connection_pool (~> 2.2, >= 2.2.0)
|
connection_pool (>= 2.0.0)
|
||||||
redis (~> 3.2, >= 3.2.1)
|
json
|
||||||
simplecov (0.11.2)
|
redis (>= 3.0.6)
|
||||||
|
redis-namespace (>= 1.3.1)
|
||||||
|
simplecov (0.11.1)
|
||||||
docile (~> 1.1.0)
|
docile (~> 1.1.0)
|
||||||
json (~> 1.8)
|
json (~> 1.8)
|
||||||
simplecov-html (~> 0.10.0)
|
simplecov-html (~> 0.10.0)
|
||||||
simplecov-html (0.10.0)
|
simplecov-html (0.10.0)
|
||||||
simplecov-rcov (0.2.3)
|
simplecov-rcov (0.2.3)
|
||||||
simplecov (>= 0.4.1)
|
simplecov (>= 0.4.1)
|
||||||
sinatra (1.4.7)
|
sinatra (1.4.5)
|
||||||
rack (~> 1.5)
|
rack (~> 1.4)
|
||||||
rack-protection (~> 1.4)
|
rack-protection (~> 1.4)
|
||||||
tilt (>= 1.3, < 3)
|
tilt (~> 1.3, >= 1.3.4)
|
||||||
sinatra-contrib (1.4.7)
|
sinatra-contrib (1.4.4)
|
||||||
backports (>= 2.0)
|
backports (>= 2.0)
|
||||||
multi_json
|
multi_json
|
||||||
rack-protection
|
rack-protection
|
||||||
@ -369,15 +315,11 @@ GEM
|
|||||||
eventmachine
|
eventmachine
|
||||||
thin (>= 1.3.1, < 2.0.0)
|
thin (>= 1.3.1, < 2.0.0)
|
||||||
slop (3.6.0)
|
slop (3.6.0)
|
||||||
specinfra (2.56.1)
|
specinfra (2.36.6)
|
||||||
net-scp
|
net-scp
|
||||||
net-ssh (>= 2.7, < 4.0)
|
net-ssh
|
||||||
net-telnet
|
|
||||||
sfl
|
|
||||||
swagger-blocks (1.3.3)
|
|
||||||
syslog-logger (1.6.8)
|
|
||||||
systemu (2.6.5)
|
systemu (2.6.5)
|
||||||
test-unit (3.1.8)
|
test-unit (3.1.2)
|
||||||
power_assert
|
power_assert
|
||||||
thin (1.5.1)
|
thin (1.5.1)
|
||||||
daemons (>= 1.0.9)
|
daemons (>= 1.0.9)
|
||||||
@ -385,14 +327,13 @@ GEM
|
|||||||
rack (>= 1.0.0)
|
rack (>= 1.0.0)
|
||||||
thor (0.19.1)
|
thor (0.19.1)
|
||||||
thread_safe (0.3.5)
|
thread_safe (0.3.5)
|
||||||
tilt (2.0.2)
|
tilt (1.4.1)
|
||||||
trollop (2.1.2)
|
timers (1.1.0)
|
||||||
tzinfo (1.2.2)
|
tzinfo (1.2.2)
|
||||||
thread_safe (~> 0.1)
|
thread_safe (~> 0.1)
|
||||||
uber (0.0.15)
|
uber (0.0.13)
|
||||||
uuidtools (2.1.5)
|
uuidtools (2.1.5)
|
||||||
wmi-lite (1.0.0)
|
wmi-lite (1.0.0)
|
||||||
xml-simple (1.1.5)
|
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
@ -403,30 +344,28 @@ DEPENDENCIES
|
|||||||
byebug
|
byebug
|
||||||
chef (>= 12)
|
chef (>= 12)
|
||||||
cucumber
|
cucumber
|
||||||
database_cleaner (~> 1.5)
|
|
||||||
factory_girl (~> 4.5)
|
factory_girl (~> 4.5)
|
||||||
fog (~> 1.30)
|
fog (~> 1.20)
|
||||||
guard-rspec
|
guard-rspec
|
||||||
hooks
|
hooks
|
||||||
httpclient
|
httpclient
|
||||||
mime-types (~> 1.25.1)
|
mime-types (~> 1.25.1)
|
||||||
mixlib-shellout
|
mixlib-shellout
|
||||||
mongo (~> 2.1)
|
mongo (= 1.12.3)
|
||||||
mongoid (~> 5.0.0)
|
|
||||||
multi_json (= 1.7.8)
|
multi_json (= 1.7.8)
|
||||||
net-scp (= 1.2.1)
|
|
||||||
net-ssh (= 3.0.2)
|
|
||||||
rack (= 1.5.2)
|
rack (= 1.5.2)
|
||||||
rack-accept-media-types
|
rack-accept-media-types
|
||||||
rake (= 10.2.0)
|
rake (= 10.2.0)
|
||||||
rspec (~> 3.3)
|
rspec (~> 3.3)
|
||||||
rspec_junit_formatter
|
rspec_junit_formatter
|
||||||
sidekiq (= 4.1.0)
|
sidekiq (= 3.2.6)
|
||||||
simplecov
|
simplecov
|
||||||
simplecov-rcov
|
simplecov-rcov
|
||||||
sinatra (~> 1.4.5)
|
sinatra (= 1.4.5)
|
||||||
sinatra-contrib
|
sinatra-contrib
|
||||||
sinatra-websocket
|
sinatra-websocket
|
||||||
swagger-blocks (= 1.3.3)
|
|
||||||
test-unit
|
test-unit
|
||||||
thin (~> 1.5.1)
|
thin (~> 1.5.1)
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.11.2
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
||||||
# * 'just' rspec: 'rspec'
|
# * 'just' rspec: 'rspec'
|
||||||
|
|
||||||
guard :rspec, cmd: "rspec", cmd_additional_args: '--fail-fast --order defined' do
|
guard :rspec, cmd: "rspec" do
|
||||||
require "guard/rspec/dsl"
|
require "guard/rspec/dsl"
|
||||||
dsl = Guard::RSpec::Dsl.new(self)
|
dsl = Guard::RSpec::Dsl.new(self)
|
||||||
|
|
||||||
|
|||||||
18
devops-service/app/api2/handlers/bootstrap_templates.rb
Normal file
18
devops-service/app/api2/handlers/bootstrap_templates.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
require "commands/bootstrap_templates"
|
||||||
|
require "app/api2/parsers/bootstrap_template"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class BootstrapTemplates < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::BootstrapTemplateParser
|
||||||
|
|
||||||
|
include BootstrapTemplatesCommands
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@ -2,17 +2,17 @@ require "lib/executors/server_executor"
|
|||||||
require "commands/status"
|
require "commands/status"
|
||||||
require "workers/deploy_worker"
|
require "workers/deploy_worker"
|
||||||
require "exceptions/deploy_info_error"
|
require "exceptions/deploy_info_error"
|
||||||
require "app/api3/parsers/deploy"
|
require "app/api2/parsers/deploy"
|
||||||
require_relative "request_handler"
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Deploy < RequestHandler
|
class Deploy < RequestHandler
|
||||||
# extend DeployCommands
|
# extend DeployCommands
|
||||||
extend StatusCommands
|
extend StatusCommands
|
||||||
|
|
||||||
set_parser Devops::API3::Parser::DeployParser
|
set_parser Devops::API2_0::Parser::DeployParser
|
||||||
|
|
||||||
def deploy
|
def deploy
|
||||||
body = parser.deploy
|
body = parser.deploy
|
||||||
@ -25,7 +25,7 @@ module Devops
|
|||||||
@deploy_info_buf = {}
|
@deploy_info_buf = {}
|
||||||
servers(names).each do |s|
|
servers(names).each do |s|
|
||||||
project = begin
|
project = begin
|
||||||
Devops::Model::Project.check_user_authorization(s.project, s.environment, owner)
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner
|
||||||
rescue InvalidPrivileges, RecordNotFound => e
|
rescue InvalidPrivileges, RecordNotFound => e
|
||||||
DevopsLogger.logger.warn e.message
|
DevopsLogger.logger.warn e.message
|
||||||
next
|
next
|
||||||
@ -45,7 +45,7 @@ module Devops
|
|||||||
rescue DeployInfoError => e
|
rescue DeployInfoError => e
|
||||||
msg = "Can not get deploy info: " + e.message
|
msg = "Can not get deploy info: " + e.message
|
||||||
DevopsLogger.logger.error msg
|
DevopsLogger.logger.error msg
|
||||||
jid = "error_#{s.name}_#{Time.new.to_i}"
|
jid = "error_#{s.chef_node_name}_#{Time.new.to_i}"
|
||||||
file = File.jon(dir, jid)
|
file = File.jon(dir, jid)
|
||||||
File.open(file, "w") do |out|
|
File.open(file, "w") do |out|
|
||||||
out.write msg
|
out.write msg
|
||||||
@ -55,12 +55,12 @@ module Devops
|
|||||||
"_id" => jid,
|
"_id" => jid,
|
||||||
"created_by" => owner,
|
"created_by" => owner,
|
||||||
"project" => s.project,
|
"project" => s.project,
|
||||||
"environment" => s.environment,
|
"deploy_env" => s.deploy_env,
|
||||||
"type" => JobTask::DEPLOY_TYPE,
|
"type" => Report::DEPLOY_TYPE,
|
||||||
"status" => Worker::STATUS::FAILED
|
"status" => Worker::STATUS::FAILED
|
||||||
# "attributes" => attributes
|
# "attributes" => attributes
|
||||||
}
|
}
|
||||||
JobTask.create(o)
|
Devops::Db.connector.save_report(Report.new(o))
|
||||||
end
|
end
|
||||||
files.push(jid)
|
files.push(jid)
|
||||||
end
|
end
|
||||||
@ -77,8 +77,8 @@ module Devops
|
|||||||
@deploy_info_buf = {}
|
@deploy_info_buf = {}
|
||||||
servers(names).each do |s|
|
servers(names).each do |s|
|
||||||
project = begin
|
project = begin
|
||||||
Devops::Model::Project.check_user_authorization(s.project, s.environment, owner)
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner
|
||||||
rescue InvalidPrivileges, Devops::Exception::RecordNotFound => e
|
rescue InvalidPrivileges, RecordNotFound => e
|
||||||
out << e.message + "\n"
|
out << e.message + "\n"
|
||||||
status.push 2
|
status.push 2
|
||||||
next
|
next
|
||||||
@ -97,21 +97,21 @@ module Devops
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
status
|
status
|
||||||
rescue Devops::Exception::RecordNotFound => e
|
rescue RecordNotFound => e
|
||||||
out << e.message
|
out << e.message
|
||||||
[-10]
|
[-10]
|
||||||
end
|
end
|
||||||
|
|
||||||
def servers names
|
def servers names
|
||||||
servers = Devops::Model::Server.find(name: {'$in' => names}, reserved: true)
|
servers = Devops::Db.connector.servers(nil, nil, names, true)
|
||||||
raise Devops::Exception::RecordNotFound.new("No reserved servers found for names '#{names.join("', '")}'") if servers.empty?
|
raise RecordNotFound.new("No reserved servers found for names '#{names.join("', '")}'") if servers.empty?
|
||||||
servers.sort_by!{|s| names.index(s.name)}
|
servers.sort_by!{|s| names.index(s.chef_node_name)}
|
||||||
servers
|
servers
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_deploy_info server, project, build_number
|
def create_deploy_info server, project, build_number
|
||||||
deploy_env_model = project.environment(server.environment)
|
deploy_env_model = project.deploy_env(server.deploy_env)
|
||||||
buf_key = "#{server.project}_#{server.environment}"
|
buf_key = "#{server.project}_#{server.deploy_env}"
|
||||||
deploy_info = if @deploy_info_buf.key?(buf_key)
|
deploy_info = if @deploy_info_buf.key?(buf_key)
|
||||||
@deploy_info_buf[buf_key]
|
@deploy_info_buf[buf_key]
|
||||||
else
|
else
|
||||||
27
devops-service/app/api2/handlers/filter.rb
Normal file
27
devops-service/app/api2/handlers/filter.rb
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
require "app/api2/parsers/filter"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Filter < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::FilterParser
|
||||||
|
|
||||||
|
def available_images provider
|
||||||
|
Devops::Db.connector.available_images(provider)
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_images provider
|
||||||
|
Devops::Db.connector.add_available_images(parser.images, provider)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_images provider
|
||||||
|
Devops::Db.connector.delete_available_images(parser.images, provider)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
20
devops-service/app/api2/handlers/flavor.rb
Normal file
20
devops-service/app/api2/handlers/flavor.rb
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
require_relative "request_handler"
|
||||||
|
require "providers/provider_factory"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Flavor < RequestHandler
|
||||||
|
|
||||||
|
def flavors provider
|
||||||
|
flavors_with_account(provider, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def flavors_with_account provider, account
|
||||||
|
::Provider::ProviderFactory.get(provider, account).flavors
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
24
devops-service/app/api2/handlers/group.rb
Normal file
24
devops-service/app/api2/handlers/group.rb
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
require "app/api2/parsers/security_groups"
|
||||||
|
require "providers/provider_factory"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Group < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::SecurityGroupsParser
|
||||||
|
|
||||||
|
def groups provider
|
||||||
|
groups_with_account(provider, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def groups_with_account provider, account
|
||||||
|
available_keys = ["vpc-id"]
|
||||||
|
::Provider::ProviderFactory.get(provider, account).groups(parser.security_groups.select{|k,v| available_keys.include?(k)})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
58
devops-service/app/api2/handlers/image.rb
Normal file
58
devops-service/app/api2/handlers/image.rb
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
require "providers/provider_factory"
|
||||||
|
require "commands/image"
|
||||||
|
require "app/api2/parsers/image"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Image < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::ImageParser
|
||||||
|
|
||||||
|
extend ImageCommands
|
||||||
|
|
||||||
|
def images
|
||||||
|
Devops::Db.connector.images(parser.images)
|
||||||
|
end
|
||||||
|
|
||||||
|
def provider_images provider
|
||||||
|
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
|
||||||
|
|
||||||
|
def create_image
|
||||||
|
Devops::Db.connector.image_insert parser.image
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_image id
|
||||||
|
Devops::Db.connector.image id
|
||||||
|
obj = parser.image
|
||||||
|
obj.id = id
|
||||||
|
Devops::Db.connector.image_update obj
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_image id
|
||||||
|
projects = Devops::Db.connector.projects_by_image id
|
||||||
|
unless projects.empty?
|
||||||
|
ar = []
|
||||||
|
projects.each do |p|
|
||||||
|
ar += p.deploy_envs.select{|e| e.respond_to?(:image)}.select{|e| e.image == id}.map{|e| "#{p.id}.#{e.identifier}"}
|
||||||
|
end
|
||||||
|
raise DependencyError.new "Deleting is forbidden: Image is used in #{ar.join(", ")}"
|
||||||
|
end
|
||||||
|
|
||||||
|
Devops::Db.connector.image_delete id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
53
devops-service/app/api2/handlers/key.rb
Normal file
53
devops-service/app/api2/handlers/key.rb
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
require "db/mongo/models/key"
|
||||||
|
require "fileutils"
|
||||||
|
require "app/api2/parsers/key"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Key < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::KeyParser
|
||||||
|
|
||||||
|
def keys
|
||||||
|
# Devops::Db.connector.keys({}, {path: false})
|
||||||
|
Devops::Db.connector.keys({})
|
||||||
|
end
|
||||||
|
|
||||||
|
def create(keys_dir)
|
||||||
|
body = parser.create
|
||||||
|
fname = body["file_name"]
|
||||||
|
file_name = File.join(keys_dir, fname)
|
||||||
|
raise InvalidRecord.new("File '#{fname}' already exist") if File.exists?(file_name)
|
||||||
|
File.open(file_name, "w") do |f|
|
||||||
|
f.write(body["content"])
|
||||||
|
f.chmod(0400)
|
||||||
|
end
|
||||||
|
|
||||||
|
key = Devops::Model::Key.new({"path" => file_name, "id" => body["key_name"]})
|
||||||
|
Devops::Db.connector.key_insert key
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete key_id
|
||||||
|
mongo = Devops::Db.connector
|
||||||
|
servers = mongo.servers_by_key key_id
|
||||||
|
unless servers.empty?
|
||||||
|
s_str = servers.map{|s| s.id}.join(", ")
|
||||||
|
raise DependencyError.new "Deleting is forbidden: Key is used in servers: #{s_str}"
|
||||||
|
end
|
||||||
|
|
||||||
|
k = mongo.key key_id
|
||||||
|
begin
|
||||||
|
FileUtils.rm(k.path)
|
||||||
|
rescue
|
||||||
|
DevopsLogger.logger.error "Missing key file for #{key_id} - #{k.filename}"
|
||||||
|
end
|
||||||
|
mongo.key_delete key_id
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
25
devops-service/app/api2/handlers/network.rb
Normal file
25
devops-service/app/api2/handlers/network.rb
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
require "app/api2/parsers/network"
|
||||||
|
require "providers/provider_factory"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Network < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::NetworkParser
|
||||||
|
|
||||||
|
def networks provider
|
||||||
|
networks_with_account provider, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def networks_with_account provider, account
|
||||||
|
p = ::Provider::ProviderFactory.get(provider, account)
|
||||||
|
available_keys = ["vpc-id"]
|
||||||
|
p.networks_detail(parser.networks.select{|k,v| available_keys.include?(k)})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
332
devops-service/app/api2/handlers/project.rb
Normal file
332
devops-service/app/api2/handlers/project.rb
Normal file
@ -0,0 +1,332 @@
|
|||||||
|
require "commands/status"
|
||||||
|
require "db/mongo/models/project"
|
||||||
|
require "workers/project_test_worker"
|
||||||
|
require "app/api2/parsers/project"
|
||||||
|
require "lib/project/type/types_factory"
|
||||||
|
require "lib/executors/server_executor"
|
||||||
|
require "workers/delete_server_worker"
|
||||||
|
require_relative "../helpers/version_2.rb"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Project < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::ProjectParser
|
||||||
|
|
||||||
|
include Devops::API2_0::Helpers
|
||||||
|
|
||||||
|
extend StatusCommands
|
||||||
|
|
||||||
|
def project_types
|
||||||
|
Devops::TypesFactory.types_names
|
||||||
|
end
|
||||||
|
|
||||||
|
def projects
|
||||||
|
Devops::Db.connector.projects(nil, nil, parser.projects, parser.archived_projects)
|
||||||
|
end
|
||||||
|
|
||||||
|
def project id
|
||||||
|
Devops::Db.connector.project(id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def project_deploy_envs(id)
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
project.deploy_envs
|
||||||
|
end
|
||||||
|
|
||||||
|
def project_deploy_env(project_id, env)
|
||||||
|
project = Devops::Db.connector.project(project_id)
|
||||||
|
project.deploy_env(env)
|
||||||
|
end
|
||||||
|
|
||||||
|
def project_servers id
|
||||||
|
Devops::Db.connector.project(id)
|
||||||
|
Devops::Db.connector.servers(id, parser.project_servers)
|
||||||
|
end
|
||||||
|
|
||||||
|
def project_stacks id
|
||||||
|
# check if project exists
|
||||||
|
Devops::Db.connector.project(id)
|
||||||
|
options = {project: id}
|
||||||
|
deploy_env = parser.project_stacks
|
||||||
|
options[:deploy_env] = deploy_env if deploy_env
|
||||||
|
Devops::Db.connector.stacks(options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_project
|
||||||
|
p = parser.create_project
|
||||||
|
raise InvalidRecord.new("Project '#{p.id}' already exist") if Devops::Db.connector.is_project_exists?(p)
|
||||||
|
|
||||||
|
p.deploy_envs.each do |env|
|
||||||
|
env.add_users [parser.current_user]
|
||||||
|
end
|
||||||
|
res = p.create
|
||||||
|
info = if p.multi?
|
||||||
|
"Project '#{p.id}' with type 'multi' created"
|
||||||
|
else
|
||||||
|
"Project '#{p.id}' created."
|
||||||
|
end
|
||||||
|
# info << " " + res[:before] if res[:before]
|
||||||
|
# info << " " + res[:after] if res[:after]
|
||||||
|
info
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project_components id
|
||||||
|
body = parser.set_project_components
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
project.components = body["components"]
|
||||||
|
project.validate_components
|
||||||
|
Devops::Db.connector.project_update_field id, "components", body["components"]
|
||||||
|
"Updated project '#{project.id}' with components '#{body["components"].inspect}'"
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_deploy_env id
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
env = parser.add_deploy_env
|
||||||
|
env.add_users [parser.current_user]
|
||||||
|
env.validate!
|
||||||
|
begin
|
||||||
|
db_env = project.deploy_env(env.identifier)
|
||||||
|
raise InvalidRecord.new("Can not add new environment for project '#{id}'. Environment '#{env.identifier}' already exist")
|
||||||
|
rescue RecordNotFound => e
|
||||||
|
res = project.add_deploy_env env
|
||||||
|
return "Deploy environment '#{env.identifier}' has been added to project '#{project.id}'." + res, env
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_deploy_env_field id, deploy_env, field
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
db_env = project.deploy_env(deploy_env)
|
||||||
|
value = parser.update_deploy_env_field
|
||||||
|
if db_env.respond_to?(field + "=")
|
||||||
|
if field == "identifier"
|
||||||
|
Devops::Db.connector.change_servers_deploy_env(db_env.identifier, value)
|
||||||
|
Devops::Db.connector.change_stacks_deploy_env(db_env.identifier, value)
|
||||||
|
db_env.rename id, value
|
||||||
|
"Environment '#{deploy_env}' has been renamed to '#{value}'"
|
||||||
|
else
|
||||||
|
db_env.update_field(id, field, value)
|
||||||
|
"Environment's field '#{field}' has been updated"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
raise RecordNotFound.new("Field '#{field}' does not exist")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_deploy_env id, deploy_env
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
db_env = project.deploy_env(deploy_env)
|
||||||
|
env = parser.update_deploy_env
|
||||||
|
env.identifier = deploy_env if env.identifier.nil?
|
||||||
|
begin
|
||||||
|
unless env.identifier == deploy_env
|
||||||
|
servers = Devops::Db.connector.servers_by_project_and_deploy_env(id, deploy_env)
|
||||||
|
raise InvalidRecord.new("Environment '#{deploy_env}' can't be updated: it has #{servers.size} running servers.") unless servers.empty?
|
||||||
|
end
|
||||||
|
begin
|
||||||
|
project.deploy_env(env.identifier)
|
||||||
|
raise InvalidRecord.new("Environment '#{deploy_env}' can't be renamed to '#{env.identifier}', environment '#{env.identifier}' already exists") unless deploy_env == env.identifier
|
||||||
|
rescue RecordNotFound => e
|
||||||
|
end
|
||||||
|
env.validate!
|
||||||
|
project.delete_deploy_env(deploy_env)
|
||||||
|
project.add_deploy_env(env)
|
||||||
|
"Deploy environment '#{deploy_env}' has been updated in project '#{project.id}'"
|
||||||
|
rescue RecordNotFound => e
|
||||||
|
env.identifier = deploy_env
|
||||||
|
res = project.add_deploy_env env
|
||||||
|
"Deploy environment '#{env.identifier}' has been added to project '#{project.id}'." + res
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_deploy_env id, deploy_env
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
servers = Devops::Db.connector.servers_by_project_and_deploy_env(id, deploy_env)
|
||||||
|
raise InvalidRecord.new("Can not delete environment '#{deploy_env}', there are #{servers.size} servers on it") unless servers.empty?
|
||||||
|
project.delete_deploy_env(deploy_env)
|
||||||
|
"Deploy environment '#{deploy_env}' has been deleted from project '#{project.id}'."
|
||||||
|
end
|
||||||
|
|
||||||
|
# updates only run_list and description
|
||||||
|
def update_project id
|
||||||
|
body = parser.update
|
||||||
|
old_project = Devops::Db.connector.project id
|
||||||
|
Devops::Db.connector.project_update id, body
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: multi project
|
||||||
|
def update_project_users id
|
||||||
|
deploy_env, users = parser.project_users
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
Validators::Helpers::Users.new(users).validate!
|
||||||
|
project.add_authorized_user users, deploy_env
|
||||||
|
info = "Users '#{users.join("', '")}' has been added to '#{id}' project's authorized users."
|
||||||
|
info
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: multi project
|
||||||
|
def delete_project_users id
|
||||||
|
deploy_env, users = parser.project_users
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
project.remove_authorized_user users, deploy_env
|
||||||
|
"Users '#{users.join("', '")}' have been removed from '#{id}' project's authorized users"
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project_run_list id
|
||||||
|
list = parser.run_list
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
Devops::Db.connector.set_project_run_list id, list
|
||||||
|
"Updated project with run_list '#{list.inspect}'"
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project_env_run_list id, deploy_env
|
||||||
|
list = parser.run_list
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
env = project.deploy_env deploy_env
|
||||||
|
Devops::Db.connector.set_project_env_run_list id, deploy_env, list
|
||||||
|
"Updated environment '#{env.identifier}' with run_list '#{list.inspect}' in project '#{project.id}'"
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_project id
|
||||||
|
deploy_env = parser.delete
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
if deploy_env.nil?
|
||||||
|
servers = Devops::Db.connector.servers id
|
||||||
|
raise DependencyError.new "Deleting project #{id} is forbidden: Project has servers" unless servers.empty?
|
||||||
|
project.delete
|
||||||
|
"Project '#{id}' is deleted"
|
||||||
|
else
|
||||||
|
servers = Devops::Db.connector.servers id, deploy_env
|
||||||
|
raise DependencyError.new "Deleting deploy_env #{deploy_env} is forbidden: Project has servers" unless servers.empty?
|
||||||
|
project.delete_deploy_env(deploy_env)
|
||||||
|
"Project '#{id}'. Deploy environment '#{deploy_env}' has been deleted"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def deploy_project_stream out, id
|
||||||
|
# check if project exist
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
deploy_env, servers = parser.deploy
|
||||||
|
keys = {}
|
||||||
|
dbserver = Devops::Db.connector.servers(id, deploy_env, servers, true)
|
||||||
|
out << (dbservers.empty? ? "No reserved servers to deploy\n" : "Deploy servers: '#{dbservers.map{|s| s.chef_node_name}.join("', '")}'\n")
|
||||||
|
status = []
|
||||||
|
deploy_info_buf = {}
|
||||||
|
dbservers.each do |s|
|
||||||
|
begin
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
rescue InvalidPrivileges, RecordNotFound => e
|
||||||
|
out << e.message + "\n"
|
||||||
|
status.push 2
|
||||||
|
next
|
||||||
|
end
|
||||||
|
deploy_env_model = project.deploy_env(s.deploy_env)
|
||||||
|
deploy_info = if deploy_info_buf[s.deploy_env]
|
||||||
|
deploy_info_buf[s.deploy_env]
|
||||||
|
else
|
||||||
|
# мы не можем указать один build_number для всех окружений, поэтому nil
|
||||||
|
deploy_info_buf[s.deploy_env] = project.deploy_info(deploy_env_model, nil)
|
||||||
|
end
|
||||||
|
status.push(Devops::Executor::ServerExecutor.new(s, out, current_user: parser.current_user).deploy_server(deploy_info))
|
||||||
|
end
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
def deploy_project id
|
||||||
|
# check if project exist
|
||||||
|
project_model = Devops::Db.connector.project(id)
|
||||||
|
deploy_env, servers = parser.deploy
|
||||||
|
files = []
|
||||||
|
dbservers = Devops::Db.connector.servers(id, deploy_env, servers, true)
|
||||||
|
#out << (dbservers.empty? ? "No reserved servers to deploy\n" : "Deploy servers: '#{dbservers.map{|s| s.chef_node_name}.join("', '")}'\n")
|
||||||
|
deploy_info_buf = {}
|
||||||
|
dbservers.each do |s|
|
||||||
|
begin
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
rescue InvalidPrivileges, RecordNotFound => e
|
||||||
|
next
|
||||||
|
end
|
||||||
|
|
||||||
|
deploy_env_model = project_model.deploy_env(s.deploy_env)
|
||||||
|
deploy_info = if deploy_info_buf[s.deploy_env]
|
||||||
|
deploy_info_buf[s.deploy_env]
|
||||||
|
else
|
||||||
|
# мы не можем указать один build_number для всех окружений, поэтому nil
|
||||||
|
deploy_info_buf[s.deploy_env] = project_model.deploy_info(deploy_env_model, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
jid = Worker.start_async(DeployWorker,
|
||||||
|
server_attrs: s.to_hash,
|
||||||
|
owner: parser.current_user,
|
||||||
|
tags: [],
|
||||||
|
deploy_info: deploy_info
|
||||||
|
)
|
||||||
|
files.push jid
|
||||||
|
end
|
||||||
|
files
|
||||||
|
end
|
||||||
|
|
||||||
|
def archive_project id
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
Devops::Db.connector.archive_project(id)
|
||||||
|
msg = "Project '#{id}' has been archived"
|
||||||
|
DevopsLogger.logger.info msg
|
||||||
|
msg
|
||||||
|
end
|
||||||
|
|
||||||
|
def unarchive_project id
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
Devops::Db.connector.unarchive_project(id)
|
||||||
|
msg = "Project '#{id}' has been unarchived"
|
||||||
|
DevopsLogger.logger.info msg
|
||||||
|
msg
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_project id, deploy_env
|
||||||
|
project = Devops::Db.connector.project(id)
|
||||||
|
env = project.deploy_env deploy_env
|
||||||
|
DevopsLogger.logger.info "Test project '#{project.id}' and environment '#{env.identifier}'"
|
||||||
|
if env.provider == ::Provider::Static::PROVIDER
|
||||||
|
msg = "Can not test environment with provider '#{::Provider::Static::PROVIDER}'"
|
||||||
|
Logger.warn msg
|
||||||
|
raise InvalidRecord.new(msg)
|
||||||
|
end
|
||||||
|
|
||||||
|
jid = Worker.start_async(ProjectTestWorker,
|
||||||
|
project: project.id,
|
||||||
|
deploy_env: env.identifier,
|
||||||
|
user: @request.env['REMOTE_USER']
|
||||||
|
)
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
return [jid]
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_project_servers(project_id)
|
||||||
|
env_id, dry_run = parser.delete_project_servers
|
||||||
|
Devops::Db.connector.project(project_id)
|
||||||
|
servers = Devops::Db.connector.servers(project_id, env_id)
|
||||||
|
info = {to_delete: servers.map(&:id)}
|
||||||
|
if !dry_run
|
||||||
|
info.merge!(delete_chosen_servers!(servers))
|
||||||
|
end
|
||||||
|
info
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def delete_chosen_servers!(servers)
|
||||||
|
current_user = parser.current_user
|
||||||
|
reports = servers.map do |server|
|
||||||
|
Worker.start_async(DeleteServerWorker, 'server_id' => server.id, 'current_user' => current_user)
|
||||||
|
end
|
||||||
|
{reports: reports}
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
50
devops-service/app/api2/handlers/provider.rb
Normal file
50
devops-service/app/api2/handlers/provider.rb
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
require "app/api2/parsers/provider"
|
||||||
|
require "providers/provider_factory"
|
||||||
|
require_relative "request_handler"
|
||||||
|
require "db/mongo/models/provider_accounts/static_provider_account"
|
||||||
|
require "db/mongo/models/provider_accounts/openstack_provider_account"
|
||||||
|
require "db/mongo/models/provider_accounts/ec2_provider_account"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Provider < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::ProviderParser
|
||||||
|
|
||||||
|
def providers
|
||||||
|
::Provider::ProviderFactory.providers
|
||||||
|
end
|
||||||
|
|
||||||
|
def accounts provider
|
||||||
|
::Provider::ProviderFactory.get_accounts_factory(provider).accounts
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_fields provider
|
||||||
|
::Provider::ProviderFactory.get_account_class(provider).account_fields
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_account provider
|
||||||
|
account = ::Provider::ProviderFactory.get_accounts_factory(provider).create_account(parser.account)
|
||||||
|
account.validate_fields!
|
||||||
|
Devops::Db.connector.provider_account_insert(account)
|
||||||
|
::Provider::ProviderFactory.add_account(provider, account)
|
||||||
|
account.to_hash
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_account name, provider
|
||||||
|
account = Devops::Db.connector.provider_account(provider, name)
|
||||||
|
Devops::Db.connector.provider_account_delete(name)
|
||||||
|
::Provider::ProviderFactory.delete_account(provider, account)
|
||||||
|
account.to_hash
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_vpcs provider, name
|
||||||
|
Devops::Db.connector.provider_account(provider, name)
|
||||||
|
::Provider::ProviderFactory.get(provider, name).describe_vpcs
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,16 +1,13 @@
|
|||||||
require "lib/executors/server_executor"
|
require 'workers/stack_sync_worker'
|
||||||
require "app/api3/parsers/stack"
|
|
||||||
require 'db/mongo/models/stack/stack_factory'
|
|
||||||
require 'workers/stack_bootstrap_worker'
|
|
||||||
require_relative "request_handler"
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Stack < RequestHandler
|
class ProviderNotification < RequestHandler
|
||||||
|
|
||||||
def autoscaling_groups_change(group_id, provider_account)
|
def autoscaling_groups_change(group_id, provider_account)
|
||||||
provider = ::Provider::ProviderFactory.get('aws', provider_account)
|
provider = ::Provider::ProviderFactory.get('ec2', provider_account)
|
||||||
stack_id = provider.stack_id_of_autoscaling_group(group_id)
|
stack_id = provider.stack_id_of_autoscaling_group(group_id)
|
||||||
stack = ::Devops::Db.connector.stack_by_id(stack_id)
|
stack = ::Devops::Db.connector.stack_by_id(stack_id)
|
||||||
jid = Worker.start_async(StackSyncWorker, stack_name: stack.name)
|
jid = Worker.start_async(StackSyncWorker, stack_name: stack.name)
|
||||||
@ -22,3 +19,4 @@ module Devops
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
61
devops-service/app/api2/handlers/report.rb
Normal file
61
devops-service/app/api2/handlers/report.rb
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Report < RequestHandler
|
||||||
|
|
||||||
|
def options
|
||||||
|
params = @request.params
|
||||||
|
options = {}
|
||||||
|
["project", "deploy_env", "type", "created_by", "date_from", "date_to", "sort", "status", "chef_node_name", "max_number"].each do |k|
|
||||||
|
options[k] = params[k] unless params[k].nil?
|
||||||
|
end
|
||||||
|
#attributes_keys = params.keys.select{|k| k =~ /attributes\.*/}
|
||||||
|
#attributes_keys.each do |ak|
|
||||||
|
# options[ak] = params[ak]
|
||||||
|
#end
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def all
|
||||||
|
Devops::Db.connector.reports(options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def all_latest
|
||||||
|
Devops::Db.connector.latest_reports(options())
|
||||||
|
end
|
||||||
|
|
||||||
|
def attributes name
|
||||||
|
Devops::Db.connector.reports_attributes_values(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def report id
|
||||||
|
r = Devops::Db.connector.report(id)
|
||||||
|
file = r.file
|
||||||
|
raise RecordNotFound.new("Report '#{id}' does not exist") unless File.exists? file
|
||||||
|
return Rack::Utils.escape_html(File.read(file).encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')), completed?(id)
|
||||||
|
rescue RecordNotFound => e
|
||||||
|
if status(id) == Worker::STATUS::IN_QUEUE
|
||||||
|
return "Task '#{id}' has been queued", false
|
||||||
|
else
|
||||||
|
raise e
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def status id
|
||||||
|
Sidekiq.redis do |connection|
|
||||||
|
connection.hget("devops", id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def completed? id
|
||||||
|
r = self.status(id)
|
||||||
|
r == "completed" or r == "failed"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
26
devops-service/app/api2/handlers/request_handler.rb
Normal file
26
devops-service/app/api2/handlers/request_handler.rb
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class RequestHandler
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def set_parser parser
|
||||||
|
define_method("parser") do
|
||||||
|
@request_parser ||= parser.new(@request)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize request
|
||||||
|
@request = request
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def owner_from_request
|
||||||
|
@request.env['REMOTE_USER']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
103
devops-service/app/api2/handlers/script.rb
Normal file
103
devops-service/app/api2/handlers/script.rb
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
require "providers/provider_factory"
|
||||||
|
require "fileutils"
|
||||||
|
require "commands/status"
|
||||||
|
require "app/api2/parsers/script"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Script < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::ScriptParser
|
||||||
|
|
||||||
|
def scripts
|
||||||
|
res = []
|
||||||
|
Dir.foreach(DevopsConfig.config[:scripts_dir]) {|f| res.push(f) unless f.start_with?(".")}
|
||||||
|
end
|
||||||
|
|
||||||
|
def execute_command out, node_name
|
||||||
|
cmd = parse.execute_command
|
||||||
|
user = parser.current_user
|
||||||
|
s = ::Devops::Db.connector.server_by_chef_node_name node_name
|
||||||
|
::Devops::Db.connector.check_project_auth s.project, s.deploy_env, user
|
||||||
|
cert = ::Devops::Db.connector.key s.key
|
||||||
|
addr = "#{s.remote_user}@#{s.public_ip || s.private_ip}"
|
||||||
|
ssh_cmd = "ssh -i %s #{addr} '#{cmd}'"
|
||||||
|
out << ssh_cmd % File.basename(cert.path)
|
||||||
|
out << "\n"
|
||||||
|
IO.popen((ssh_cmd % cert.path) + " 2>&1") do |so|
|
||||||
|
while line = so.gets do
|
||||||
|
out << line
|
||||||
|
end
|
||||||
|
end
|
||||||
|
out << "\nDone"
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_script out, script_name
|
||||||
|
nodes, script_params = parser.run_script
|
||||||
|
file = File.join(DevopsConfig.config[:scripts_dir], script_name)
|
||||||
|
unless File.exists?(file)
|
||||||
|
out << "File '#{file_name}' does not exist\n"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
servers = ::Devops::Db.connector.servers_by_names(nodes)
|
||||||
|
if servers.empty?
|
||||||
|
out << "No servers found for names '#{nodes.join("', '")}'\n"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
user = @request.env['REMOTE_USER']
|
||||||
|
servers.each do |s|
|
||||||
|
::Devops::Db.connector.check_project_auth s.project, s.deploy_env, user
|
||||||
|
end
|
||||||
|
status = []
|
||||||
|
servers.each do |s|
|
||||||
|
cert = begin
|
||||||
|
::Devops::Db.connector.key s.key
|
||||||
|
rescue
|
||||||
|
out << "No key found for '#{s.chef_node_name}'"
|
||||||
|
status.push 2
|
||||||
|
next
|
||||||
|
end
|
||||||
|
ssh_cmd = "ssh -i #{cert.path} #{s.remote_user}@#{s.public_ip || s.private_ip} 'bash -s' < %s"
|
||||||
|
out << "\nRun script on '#{s.chef_node_name}'\n"
|
||||||
|
unless script_params.nil?
|
||||||
|
ssh_cmd += " " + script_params.join(" ")
|
||||||
|
end
|
||||||
|
out << (ssh_cmd % [file_name])
|
||||||
|
out << "\n"
|
||||||
|
|
||||||
|
begin
|
||||||
|
IO.popen( (ssh_cmd % [file]) + " 2>&1") do |so|
|
||||||
|
while line = so.gets do
|
||||||
|
out << line
|
||||||
|
end
|
||||||
|
so.close
|
||||||
|
status.push $?.to_i
|
||||||
|
end
|
||||||
|
rescue IOError => e
|
||||||
|
logger.error e.message
|
||||||
|
out << e.message
|
||||||
|
status.push 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_script file_name
|
||||||
|
file = File.join(Devops::Api2.settings.scripts_dir, file_name)
|
||||||
|
raise RecordNotFound.new("File '#{file_name}' already exist") if File.exists?(file)
|
||||||
|
File.open(file, "w") {|f| f.write(parser.create_script)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_script file_name
|
||||||
|
file = File.join(Devops::Api2.settings.scripts_dir, file_name)
|
||||||
|
raise RecordNotFound.new("File '#{file_name}' does not exist") unless File.exists?(file)
|
||||||
|
FileUtils.rm(file)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
382
devops-service/app/api2/handlers/server.rb
Normal file
382
devops-service/app/api2/handlers/server.rb
Normal file
@ -0,0 +1,382 @@
|
|||||||
|
require "uri"
|
||||||
|
|
||||||
|
require "commands/status"
|
||||||
|
require "commands/bootstrap_templates"
|
||||||
|
|
||||||
|
require "lib/executors/server_executor"
|
||||||
|
require "providers/provider_factory"
|
||||||
|
|
||||||
|
require "db/mongo/models/server"
|
||||||
|
|
||||||
|
require "workers/create_server_worker"
|
||||||
|
require "workers/bootstrap_worker"
|
||||||
|
require "workers/delete_server_worker"
|
||||||
|
require "app/api2/parsers/server"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class Server < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::ServerParser
|
||||||
|
|
||||||
|
extend StatusCommands
|
||||||
|
extend BootstrapTemplatesCommands
|
||||||
|
|
||||||
|
#scheduler = Rufus::Scheduler.new
|
||||||
|
|
||||||
|
def servers
|
||||||
|
reserved = parser.servers
|
||||||
|
Devops::Db.connector.servers(nil, nil, nil, reserved).map {|s| s.to_hash}
|
||||||
|
end
|
||||||
|
|
||||||
|
def chef_servers
|
||||||
|
KnifeFactory.instance.chef_node_list
|
||||||
|
end
|
||||||
|
|
||||||
|
def provider_servers provider
|
||||||
|
provider_servers_with_account provider, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def provider_servers_with_account provider, account
|
||||||
|
::Provider::ProviderFactory.get(provider, account).servers
|
||||||
|
end
|
||||||
|
|
||||||
|
def server id
|
||||||
|
get_server_by_key(id, parser.server)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete id
|
||||||
|
server = get_server_by_key(id, parser.instance_key)
|
||||||
|
current_user = parser.current_user
|
||||||
|
Devops::Db.connector.check_project_auth server.project, server.deploy_env, current_user
|
||||||
|
jid = Worker.start_async(DeleteServerWorker, 'server_id' => server.id, 'current_user' => current_user)
|
||||||
|
[jid]
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_list
|
||||||
|
server_ids = parser.delete_list.uniq
|
||||||
|
servers = server_ids.map { |id| Devops::Db.connector.server_by_instance_id(id) }
|
||||||
|
current_user = parser.current_user
|
||||||
|
check_servers_list_auth(servers, current_user)
|
||||||
|
server_ids.inject({}) do |hash, server_id|
|
||||||
|
hash[server_id] = Worker.start_async(DeleteServerWorker, 'server_id' => server_id, 'current_user' => current_user)
|
||||||
|
hash
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_server_stream out
|
||||||
|
status = []
|
||||||
|
prepare_create_server do |project, env, user, body|
|
||||||
|
e = Devops::Executor::ServerExecutor.new(nil, out)
|
||||||
|
e.project = project
|
||||||
|
e.deploy_env = env
|
||||||
|
body["created_by"] = user
|
||||||
|
res = e.create_server(body)
|
||||||
|
status.push res
|
||||||
|
end
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_server
|
||||||
|
body = parser.create
|
||||||
|
user = parser.current_user
|
||||||
|
|
||||||
|
check_if_server_attrs_are_valid(body, user)
|
||||||
|
jid = Worker.start_async(CreateServerWorker,
|
||||||
|
server_attrs: body,
|
||||||
|
owner: user
|
||||||
|
)
|
||||||
|
[jid]
|
||||||
|
end
|
||||||
|
|
||||||
|
def deploy node_name
|
||||||
|
call_deploy(node_name) do |options|
|
||||||
|
[ Worker.start_async(DeployWorker, @request, options) ]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def deploy_stream node_name, out
|
||||||
|
call_deploy(node_name) do |options|
|
||||||
|
Worker.start_sync(DeployWorker, @request, options, out)
|
||||||
|
end
|
||||||
|
rescue RecordNotFound => e
|
||||||
|
out << e.message
|
||||||
|
-10
|
||||||
|
end
|
||||||
|
|
||||||
|
def call_deploy node_name
|
||||||
|
body = parser.deploy
|
||||||
|
names = body["names"]
|
||||||
|
tags = body["tags"] || []
|
||||||
|
run_list = body["run_list"]
|
||||||
|
dir = DevopsConfig.config[:report_dir_v2]
|
||||||
|
owner = parser.current_user
|
||||||
|
s = Server.get_server_by_key(node_name, parser.instance_key)
|
||||||
|
project = Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner
|
||||||
|
deploy_info = create_deploy_info(s, project, body["build_number"])
|
||||||
|
deploy_info["run_list"] = run_list if run_list
|
||||||
|
|
||||||
|
yield({
|
||||||
|
server_attrs: s.to_hash,
|
||||||
|
owner: owner,
|
||||||
|
tags: tags,
|
||||||
|
deploy_info: deploy_info
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
def pause_server node_name
|
||||||
|
s = get_server_by_key(node_name, parser.instance_key)
|
||||||
|
## Authorization
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
provider = s.provider_instance
|
||||||
|
r = provider.pause_server s
|
||||||
|
if r.nil?
|
||||||
|
set_last_operation_and_save(s, Devops::Model::Server::OperationType::PAUSE)
|
||||||
|
|
||||||
|
"Server with instance ID '#{s.id}' and node name '#{node_name}' is paused"
|
||||||
|
else
|
||||||
|
raise ConflictException.new("Server with instance ID '#{s.id}' and node name '#{node_name}' can not be paused, It in state '#{r}'", 409)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def unpause_server node_name
|
||||||
|
s = get_server_by_key(node_name, parser.instance_key)
|
||||||
|
## Authorization
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
provider = s.provider_instance
|
||||||
|
r = provider.unpause_server s
|
||||||
|
if r.nil?
|
||||||
|
set_last_operation_and_save(s, Devops::Model::Server::OperationType::UNPAUSE)
|
||||||
|
|
||||||
|
"Server with instance ID '#{s.id}' and node name '#{node_name}' is unpaused"
|
||||||
|
else
|
||||||
|
raise ConflictException.new("Server with instance ID '#{s.id}' and node name '#{node_name}' can not be unpaused, It in state '#{r}'")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def reserve_server node_name
|
||||||
|
s = get_server_by_key(node_name, parser.instance_key)
|
||||||
|
user = parser.current_user
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, user
|
||||||
|
raise ConflictException.new("Server '#{node_name}' already reserved") unless s.reserved_by.nil?
|
||||||
|
s.reserved_by = user
|
||||||
|
set_last_operation_and_save(s, Devops::Model::Server::OperationType::RESERVE)
|
||||||
|
end
|
||||||
|
|
||||||
|
def unreserve_server node_name
|
||||||
|
s = get_server_by_key(node_name, parser.instance_key)
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
raise ConflictException.new("Server '#{node_name}' is not reserved") if s.reserved_by.nil?
|
||||||
|
s.reserved_by = nil
|
||||||
|
set_last_operation_and_save(s, Devops::Model::Server::OperationType::UNRESERVE)
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: check bootstrap template name
|
||||||
|
def bootstrap_server_stream out
|
||||||
|
options = prepare_bootstrap_server
|
||||||
|
s = options.delete(:server)
|
||||||
|
status = []
|
||||||
|
cert = Devops::Db.connector.key s.key
|
||||||
|
DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}"
|
||||||
|
#bootstrap s, out, cert.path, logger
|
||||||
|
options[:cert_path] = cert.path
|
||||||
|
executor = Devops::Executor::ServerExecutor.new(s, out, current_user: parser.current_user)
|
||||||
|
r = executor.two_phase_bootstrap(options)
|
||||||
|
str = nil
|
||||||
|
r = if check_server(s)
|
||||||
|
Devops::Db.connector.server_set_chef_node_name s
|
||||||
|
str = "Server with id '#{s.id}' is bootstraped"
|
||||||
|
DevopsLogger.logger.info str
|
||||||
|
0
|
||||||
|
else
|
||||||
|
str = "Server with id '#{s.id}' is not bootstraped"
|
||||||
|
DevopsLogger.logger.warn str
|
||||||
|
1
|
||||||
|
end
|
||||||
|
status.push r
|
||||||
|
out << str
|
||||||
|
out << "\n"
|
||||||
|
status
|
||||||
|
end
|
||||||
|
|
||||||
|
def bootstrap_server
|
||||||
|
attrs = prepare_bootstrap_server
|
||||||
|
server = attrs[:server]
|
||||||
|
bootstrap_template = attrs[:bootstrap_template]
|
||||||
|
|
||||||
|
jid = Worker.start_async(BootstrapWorker,
|
||||||
|
server_attrs: server.to_mongo_hash,
|
||||||
|
bootstrap_template: bootstrap_template,
|
||||||
|
owner: parser.current_user
|
||||||
|
)
|
||||||
|
|
||||||
|
[jid]
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_bootstrap_server
|
||||||
|
body = parser.bootstrap
|
||||||
|
id = body["instance_id"]
|
||||||
|
name = body["name"]
|
||||||
|
rl = body["run_list"]
|
||||||
|
t = body["bootstrap_template"]
|
||||||
|
s = Devops::Db.connector.server_by_instance_id(id)
|
||||||
|
res = {server: s}
|
||||||
|
|
||||||
|
p = Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
d = p.deploy_env(s.deploy_env)
|
||||||
|
|
||||||
|
provider = s.provider_instance
|
||||||
|
|
||||||
|
check_chef_node_name(name, provider, KnifeFactory.instance) unless name.nil?
|
||||||
|
unless t.nil?
|
||||||
|
templates = get_templates
|
||||||
|
halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t)
|
||||||
|
res[:bootstrap_template] = t
|
||||||
|
end
|
||||||
|
s.chef_node_name = name || provider.create_default_chef_node_name(s)
|
||||||
|
res[:run_list] = rl || d.run_list
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
|
||||||
|
def unbootstrap_server id
|
||||||
|
s = get_server_by_key(id, parser.instance_key)
|
||||||
|
### Authorization
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
Devops::Executor::ServerExecutor.new(s, "").unbootstrap
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_server
|
||||||
|
project, deploy_env, server_attrs = parser.add_server
|
||||||
|
Devops::Db.connector.check_project_auth project, deploy_env, parser.current_user
|
||||||
|
|
||||||
|
server = add_static_server(server_attrs)
|
||||||
|
"Server '#{server.id}' has been added"
|
||||||
|
end
|
||||||
|
|
||||||
|
# returns jobs ids
|
||||||
|
def add_and_bootstrap_servers
|
||||||
|
body, servers_attrs = parser.add_and_bootstrap_servers
|
||||||
|
Devops::Db.connector.check_project_auth body['project'], body['deploy_env'], parser.current_user
|
||||||
|
servers_attrs.map do |attrs|
|
||||||
|
server = add_static_server(attrs)
|
||||||
|
Worker.start_async(BootstrapWorker,
|
||||||
|
server_attrs: server.to_mongo_hash,
|
||||||
|
bootstrap_template: body['bootstrap_template'],
|
||||||
|
owner: parser.current_user
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_tags node_name
|
||||||
|
tags = parser.tags
|
||||||
|
prepare_tags do |id, provider|
|
||||||
|
provider.set_tags id, tags
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def unset_tags node_name
|
||||||
|
tags = parser.tags
|
||||||
|
prepare_tags do |id, provider|
|
||||||
|
provider.unset_tags id, tags
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_tags node_name
|
||||||
|
s = get_server_by_key(node_name, parser.instance_key)
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
provider = ::Provider::ProviderFactory.get(s.provider)
|
||||||
|
yield s.id, provider
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_run_list node_name
|
||||||
|
s = get_server_by_key(node_name, parser.instance_key)
|
||||||
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
|
||||||
|
Devops::Db.connector.set_server_run_list(s.id, parser.run_list)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_server_by_key id, key
|
||||||
|
mongo = Devops::Db.connector
|
||||||
|
key == "instance" ? mongo.server_by_instance_id(id) : mongo.server_by_chef_node_name(id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_chef_node_name name, provider, knife
|
||||||
|
Devops::Db.connector.server_by_chef_node_name(name)
|
||||||
|
raise InvalidRecord.new("Server with name '#{name}' already exist")
|
||||||
|
rescue RecordNotFound => e
|
||||||
|
# server not found - OK
|
||||||
|
s = provider.servers.detect {|s| s["name"] == name}
|
||||||
|
raise InvalidRecord.new("#{provider.name} node with name '#{name}' already exist") unless s.nil?
|
||||||
|
s = knife.chef_node_list.detect {|n| n == name}
|
||||||
|
raise InvalidRecord.new("Chef node with name '#{name}' already exist") unless s.nil?
|
||||||
|
s = knife.chef_client_list.detect {|c| c == name}
|
||||||
|
raise InvalidRecord.new("Chef client with name '#{name}' already exist") unless s.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Security checks should be already done here.
|
||||||
|
# @attrs should be a hash with:
|
||||||
|
# :project
|
||||||
|
# :deploy_env
|
||||||
|
# :key
|
||||||
|
# :remote_user
|
||||||
|
# :private_ip
|
||||||
|
# :public_ip
|
||||||
|
# :chef_node_name
|
||||||
|
# :run_list
|
||||||
|
def add_static_server(attrs)
|
||||||
|
server = Devops::Model::Server.new(
|
||||||
|
'_id' => "static_#{attrs[:key]}-#{attrs[:chef_node_name]}-#{Time.now.to_i}",
|
||||||
|
'provider' => ::Provider::ProviderFactory.get('static').name,
|
||||||
|
'project' => attrs[:project],
|
||||||
|
'deploy_env' => attrs[:deploy_env],
|
||||||
|
'remote_user' => attrs[:remote_user],
|
||||||
|
'private_ip' => attrs[:private_ip],
|
||||||
|
'public_ip' => attrs[:public_ip],
|
||||||
|
'key' => attrs[:key],
|
||||||
|
'chef_node_name' => attrs[:chef_node_name],
|
||||||
|
'run_list' => attrs[:run_list]
|
||||||
|
)
|
||||||
|
Devops::Db.connector.server_insert(server)
|
||||||
|
server
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_if_server_attrs_are_valid(body, user)
|
||||||
|
key_name = body["key"]
|
||||||
|
Devops::Db.connector.key(key_name) unless key_name.nil?
|
||||||
|
|
||||||
|
project = Devops::Db.connector.check_project_auth(body["project"], body["deploy_env"], user)
|
||||||
|
env = project.deploy_env(body["deploy_env"])
|
||||||
|
|
||||||
|
provider = env.provider_instance
|
||||||
|
server_name = body["name"]
|
||||||
|
check_chef_node_name(server_name, provider, KnifeFactory.instance) unless server_name.nil?
|
||||||
|
groups = body["groups"]
|
||||||
|
unless groups.nil?
|
||||||
|
buf = groups - provider.groups.keys
|
||||||
|
halt_response("Invalid security groups '#{buf.join("', '")}' for provider '#{provider.name}'") if buf.empty?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_last_operation_and_save(server, operation_type)
|
||||||
|
server.set_last_operation(operation_type, parser.current_user)
|
||||||
|
Devops::Db.connector.server_update(server)
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_servers_list_auth(servers, current_user)
|
||||||
|
project_with_env_pairs = servers.map do |server|
|
||||||
|
[server.project, server.deploy_env]
|
||||||
|
end
|
||||||
|
project_with_env_pairs.uniq.each do |pair|
|
||||||
|
project, env = *pair
|
||||||
|
Devops::Db.connector.check_project_auth project, env, current_user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@ -1,53 +1,51 @@
|
|||||||
require "lib/executors/server_executor"
|
require "lib/executors/server_executor"
|
||||||
require "app/api3/parsers/stack"
|
|
||||||
require 'db/mongo/models/stack/stack_factory'
|
require 'db/mongo/models/stack/stack_factory'
|
||||||
|
require "app/api2/parsers/stack"
|
||||||
require 'workers/stack_bootstrap_worker'
|
require 'workers/stack_bootstrap_worker'
|
||||||
require_relative "request_handler"
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Stack < RequestHandler
|
class Stack < RequestHandler
|
||||||
|
|
||||||
set_parser Devops::API3::Parser::StackParser
|
set_parser Devops::API2_0::Parser::StackParser
|
||||||
|
|
||||||
def stacks
|
def stacks
|
||||||
Model::StackAws.all
|
Devops::Db.connector.stacks
|
||||||
end
|
end
|
||||||
|
|
||||||
# We support only aws, actually
|
|
||||||
def stacks_for_provider provider
|
def stacks_for_provider provider
|
||||||
Model::StackAws.all
|
Devops::Db.connector.stacks(provider: provider)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_stack
|
def create_stack
|
||||||
object = parser.create
|
stack_attrs = parser.create
|
||||||
attrs = object['stack_attributes']
|
project = Devops::Db.connector.project(stack_attrs['project'])
|
||||||
env, category = fetch_env_and_category(attrs)
|
env = project.deploy_env(stack_attrs['deploy_env'])
|
||||||
fill_attributes_from_category(attrs, env, category)
|
raise InvalidRecord.new("Environment '#{env.identifier}' of project '#{project.id}' has no stack template") if env.stack_template.nil?
|
||||||
jid = Worker.start_async(StackBootstrapWorker,
|
add_stack_attributes(stack_attrs, env, parser)
|
||||||
stack_attributes: attrs,
|
|
||||||
without_bootstrap: object['without_bootstrap'],
|
jid = Worker.start_async(StackBootstrapWorker, stack_attributes: stack_attrs)
|
||||||
skip_rollback: object['skip_rollback']
|
|
||||||
)
|
|
||||||
[jid]
|
[jid]
|
||||||
end
|
end
|
||||||
|
|
||||||
def stack name
|
def stack id
|
||||||
Model::StackAws.where(name: name).first
|
Devops::Db.connector.stack(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_stack name
|
def delete_stack name
|
||||||
stack = self.stack(name)
|
stack = self.stack(name)
|
||||||
stack.delete_stack_in_cloud!
|
stack.delete_stack_in_cloud!
|
||||||
Model::Server.where(stack: stack.id).delete_all
|
Devops::Db.connector.stack_servers_delete(stack.name)
|
||||||
stack.delete
|
Devops::Db.connector.stack_delete(stack.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def sync id
|
def sync id
|
||||||
stack = self.stack(id)
|
stack = self.stack(id)
|
||||||
stack.sync_status_and_events!
|
stack.sync_status_and_events!
|
||||||
Devops::Db.connector.stack_update(stack)
|
Devops::Db.connector.stack_update(stack)
|
||||||
|
# do not remove syncing status and events, just add stack sync worker here.
|
||||||
|
|
||||||
stack
|
stack
|
||||||
end
|
end
|
||||||
@ -120,10 +118,10 @@ module Devops
|
|||||||
"created_by" => owner,
|
"created_by" => owner,
|
||||||
"project" => s.project,
|
"project" => s.project,
|
||||||
"deploy_env" => s.deploy_env,
|
"deploy_env" => s.deploy_env,
|
||||||
"type" => JobTask::DEPLOY_TYPE,
|
"type" => Report::DEPLOY_TYPE,
|
||||||
"status" => Worker::STATUS::FAILED
|
"status" => Worker::STATUS::FAILED
|
||||||
}
|
}
|
||||||
JobTask.create(o)
|
Devops::Db.connector.save_report(Report.new(o))
|
||||||
end
|
end
|
||||||
files.push jid
|
files.push jid
|
||||||
end
|
end
|
||||||
@ -201,25 +199,11 @@ module Devops
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# env is used in devops-nibr
|
def add_stack_attributes(stack_attrs, env, parser)
|
||||||
def fill_attributes_from_category(stack_attrs, env, category)
|
stack_attrs['stack_template'] = env.stack_template
|
||||||
stack_attrs['stack_template'] = category.provider.stack_template
|
|
||||||
stack_attrs['owner'] = parser.current_user
|
stack_attrs['owner'] = parser.current_user
|
||||||
stack_attrs['provider'] = category.provider.name
|
stack_attrs['provider'] = env.provider
|
||||||
stack_attrs['provider_account'] = category.provider.account
|
stack_attrs['provider_account'] = env.provider_account
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_env_and_category(attrs)
|
|
||||||
project = Model::Project.find_with_category(*attrs.values_at('project', 'environment', 'category'))
|
|
||||||
unless project
|
|
||||||
raise InvalidRecord.new("Project '#{attrs['project']}' has no env '#{attrs['environment']}' or category '#{attrs['category']}")
|
|
||||||
end
|
|
||||||
env = project.environment(attrs['environment'])
|
|
||||||
category = env.get_category!(attrs['category'])
|
|
||||||
if category.provider.type != Model::CategoryProvider::STACK_TYPE
|
|
||||||
raise InvalidRecord.new("Category '#{category.id}' type isn't 'stack'")
|
|
||||||
end
|
|
||||||
[env, category]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
81
devops-service/app/api2/handlers/stack_template.rb
Normal file
81
devops-service/app/api2/handlers/stack_template.rb
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
require 'db/mongo/models/stack_template/stack_template_factory'
|
||||||
|
require "app/api2/parsers/stack_template"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class StackTemplate < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::StackTemplateParser
|
||||||
|
|
||||||
|
def stack_templates
|
||||||
|
Devops::Db.connector.stack_templates
|
||||||
|
end
|
||||||
|
|
||||||
|
def stack_templates_for_provider provider
|
||||||
|
Devops::Db.connector.stack_templates(provider)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_stack_template provider
|
||||||
|
body = parser.create
|
||||||
|
template_model = Model::StackTemplateFactory.create(provider, body)
|
||||||
|
template_model.owner = parser.current_user
|
||||||
|
Devops::Db.connector.stack_template_insert(template_model)
|
||||||
|
template_model
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_stack_template id
|
||||||
|
Devops::Db.connector.stack_template(id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_stack_template id
|
||||||
|
envs_with_this_template = envs_using_stack_template(id)
|
||||||
|
|
||||||
|
if envs_with_this_template.empty?
|
||||||
|
Devops::Db.connector.stack_template_delete id
|
||||||
|
else
|
||||||
|
raise ConflictException.new("Stack template '#{id}' is already in use in #{envs_with_this_template.map{|project, envs| "#{project}: #{envs.join(', ')}"}.join('; ')}", {projects: envs_with_this_template})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# temp solution to update url on existing stacks
|
||||||
|
def update_template_url(id)
|
||||||
|
template = Devops::Db.connector.stack_template(id)
|
||||||
|
template.update_template_url
|
||||||
|
Devops::Db.connector.stack_template_update(template)
|
||||||
|
template
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_available_parameters(id)
|
||||||
|
template = Devops::Db.connector.stack_template(id)
|
||||||
|
template.available_parameters = template.parse_parameters
|
||||||
|
Devops::Db.connector.stack_template_update(template)
|
||||||
|
template
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# returns:
|
||||||
|
# {
|
||||||
|
# "project" => ["deploy_env"]
|
||||||
|
# }
|
||||||
|
def envs_using_stack_template(id)
|
||||||
|
projects = Devops::Db.connector.projects_and_deploy_envs_by_field('stack_template', id)
|
||||||
|
envs_with_this_template = []
|
||||||
|
res = {}
|
||||||
|
|
||||||
|
projects.each do |project|
|
||||||
|
array = []
|
||||||
|
res[project.id] = array
|
||||||
|
project.deploy_envs.each do |env|
|
||||||
|
array << env.identifier
|
||||||
|
end
|
||||||
|
end
|
||||||
|
res
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,18 +1,18 @@
|
|||||||
require "commands/bootstrap_templates"
|
require "commands/knife_commands"
|
||||||
require "app/api3/parsers/chef"
|
require "app/api2/parsers/tag"
|
||||||
require_relative "request_handler"
|
require_relative "request_handler"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Handler
|
module Handler
|
||||||
class Chef < RequestHandler
|
class Tag < RequestHandler
|
||||||
|
set_parser Devops::API2_0::Parser::TagParser
|
||||||
|
|
||||||
set_parser Devops::API3::Parser::ChefParser
|
def initialize node_name
|
||||||
|
@node_name = node_name
|
||||||
include BootstrapTemplatesCommands
|
@server = Devops::DB.connector.server_by_chef_node_name(@node_name)
|
||||||
|
#TODO: raise
|
||||||
def chef_nodes
|
halt_response("No servers found for name '#{@node_name}'", 404) if @server.nil?
|
||||||
KnifeFactory.instance.chef_node_list
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def tags node_name
|
def tags node_name
|
||||||
@ -34,7 +34,6 @@ module Devops
|
|||||||
halt_response("Cannot delete tags #{tagsStr} from server #{node_name}: #{cmd[0]}", 500) unless cmd[1]
|
halt_response("Cannot delete tags #{tagsStr} from server #{node_name}: #{cmd[0]}", 500) unless cmd[1]
|
||||||
tags
|
tags
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
62
devops-service/app/api2/handlers/user.rb
Normal file
62
devops-service/app/api2/handlers/user.rb
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
require "db/mongo/models/user"
|
||||||
|
require "app/api2/parsers/user"
|
||||||
|
require_relative "request_handler"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Handler
|
||||||
|
class User < RequestHandler
|
||||||
|
|
||||||
|
set_parser Devops::API2_0::Parser::UserParser
|
||||||
|
|
||||||
|
def users
|
||||||
|
Devops::Db.connector.users({}, fields: {password: false})
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
Devops::Db.connector.user_insert parser.create
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete user_id
|
||||||
|
projects = Devops::Db.connector.projects_by_user user_id
|
||||||
|
if !projects.empty?
|
||||||
|
str = ""
|
||||||
|
projects.each do |p|
|
||||||
|
p.deploy_envs.each do |e|
|
||||||
|
str+="#{p.id}.#{e.identifier} " if e.users.include? user_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
raise DependencyError.new "Deleting is forbidden: User is included in #{str}"
|
||||||
|
end
|
||||||
|
Devops::Db.connector.user_delete user_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_user_privileges user_id
|
||||||
|
cmd, privileges = parser.user_privileges
|
||||||
|
change_user(user_id) do |user|
|
||||||
|
user.grant(cmd, privileges)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_email user_id
|
||||||
|
change_user(user_id) do |user|
|
||||||
|
user.email = parser.change_email
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_password user_id
|
||||||
|
change_user(user_id) do |user|
|
||||||
|
user.password = parser.change_password
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def change_user user_id
|
||||||
|
user = Devops::Db.connector.user user_id
|
||||||
|
yield(user)
|
||||||
|
Devops::Db.connector.user_update user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@ -3,7 +3,7 @@ require "exceptions/parser_error"
|
|||||||
require "exceptions/validation_error"
|
require "exceptions/validation_error"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module ParserHelpers
|
module ParserHelpers
|
||||||
|
|
||||||
def create_object_from_json_body type=Hash, empty_body=false
|
def create_object_from_json_body type=Hash, empty_body=false
|
||||||
@ -13,15 +13,15 @@ module Devops
|
|||||||
::JSON.parse(json)
|
::JSON.parse(json)
|
||||||
rescue ::JSON::ParserError => e
|
rescue ::JSON::ParserError => e
|
||||||
DevopsLogger.logger.error e.message
|
DevopsLogger.logger.error e.message
|
||||||
raise Devops::Exception::ParserError.new("Invalid JSON: #{e.message}")
|
raise Devops::ParserError.new("Invalid JSON: #{e.message}")
|
||||||
end
|
end
|
||||||
raise Devops::Exception::ParserError.new("Invalid JSON, it should be an #{type == Array ? "array" : "object"}") unless @body_json.is_a?(type)
|
raise Devops::ParserError.new("Invalid JSON, it should be an #{type == Array ? "array" : "object"}") unless @body_json.is_a?(type)
|
||||||
@body_json
|
@body_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_provider provider
|
def check_provider provider
|
||||||
list = ::Provider.providers
|
list = ::Provider::ProviderFactory.providers
|
||||||
raise Devops::Exception::ValidationError.new("Invalid provider '#{provider}', available providers: '#{list.join("', '")}'") unless list.include?(provider)
|
raise Devops::ValidationError.new("Invalid provider '#{provider}', available providers: '#{list.join("', '")}'") unless list.include?(provider)
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_string val, msg, _nil=false, empty=false
|
def check_string val, msg, _nil=false, empty=false
|
||||||
@ -38,7 +38,7 @@ module Devops
|
|||||||
|
|
||||||
def check_array val, msg, vals_type=String, _nil=false, empty=false
|
def check_array val, msg, vals_type=String, _nil=false, empty=false
|
||||||
check_param val, Array, msg, _nil, empty
|
check_param val, Array, msg, _nil, empty
|
||||||
val.each {|v| raise Devops::Exception::ValidationError.new(msg) unless v.is_a?(vals_type)} unless val.nil?
|
val.each {|v| raise Devops::ValidationError.new(msg) unless v.is_a?(vals_type)} unless val.nil?
|
||||||
val
|
val
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ module Devops
|
|||||||
r = Regexp.new("^[\\w _\\-.]{1,255}$", Regexp::IGNORECASE)
|
r = Regexp.new("^[\\w _\\-.]{1,255}$", Regexp::IGNORECASE)
|
||||||
if r.match(file_name).nil?
|
if r.match(file_name).nil?
|
||||||
msg = "Invalid file name '#{file_name}'. Expected name with 'a'-'z', '0'-'9', ' ', '_', '-', '.' symbols with length greate then 0 and less then 256 "
|
msg = "Invalid file name '#{file_name}'. Expected name with 'a'-'z', '0'-'9', ' ', '_', '-', '.' symbols with length greate then 0 and less then 256 "
|
||||||
raise Devops::Exception::ValidationError.new(msg, json_resp)
|
raise Devops::ValidationError.new(msg, json_resp)
|
||||||
=begin
|
=begin
|
||||||
if json_resp
|
if json_resp
|
||||||
halt_response(msg)
|
halt_response(msg)
|
||||||
@ -64,14 +64,14 @@ module Devops
|
|||||||
if _nil
|
if _nil
|
||||||
return val
|
return val
|
||||||
else
|
else
|
||||||
raise Devops::Exception::ParserError.new(msg)
|
raise Devops::ValidationError.new(msg)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if val.is_a?(type)
|
if val.is_a?(type)
|
||||||
raise Devops::Exception::ParserError.new(msg) if !empty && val.empty?
|
raise Devops::ValidationError.new(msg) if !empty && val.empty?
|
||||||
val
|
val
|
||||||
else
|
else
|
||||||
raise Devops::Exception::ParserError.new(msg)
|
raise Devops::ValidationError.new(msg)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
49
devops-service/app/api2/helpers/request.rb
Normal file
49
devops-service/app/api2/helpers/request.rb
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
require 'sinatra/base'
|
||||||
|
require "sinatra/json"
|
||||||
|
|
||||||
|
require "providers/provider_factory"
|
||||||
|
|
||||||
|
module Sinatra
|
||||||
|
module Version2_0
|
||||||
|
module Request
|
||||||
|
module Helpers
|
||||||
|
|
||||||
|
=begin
|
||||||
|
# Check request headers
|
||||||
|
def check_headers *headers
|
||||||
|
ha = (headers.empty? ? [:accept, :content_type] : headers)
|
||||||
|
ha.each do |h|
|
||||||
|
case h
|
||||||
|
when :accept, "accept"
|
||||||
|
accept_json
|
||||||
|
when :content_type, "content_type"
|
||||||
|
request_json
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Check Accept header
|
||||||
|
#
|
||||||
|
# Can client works with JSON?
|
||||||
|
def accept_json
|
||||||
|
logger.debug(request.accept)
|
||||||
|
unless request.accept? 'application/json'
|
||||||
|
response.headers['Accept'] = 'application/json'
|
||||||
|
halt_response("Accept header should contains 'application/json' type", 406)
|
||||||
|
end
|
||||||
|
rescue NoMethodError => e
|
||||||
|
#error in sinatra 1.4.4 (https://github.com/sinatra/sinatra/issues/844, https://github.com/sinatra/sinatra/pull/805)
|
||||||
|
response.headers['Accept'] = 'application/json'
|
||||||
|
halt_response("Accept header should contains 'application/json' type", 406)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Check Content-Type header
|
||||||
|
def request_json
|
||||||
|
halt_response("Content-Type should be 'application/json'", 415) if request.media_type.nil? or request.media_type != 'application/json'
|
||||||
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,10 +1,11 @@
|
|||||||
require "json"
|
require "json"
|
||||||
require 'sinatra/base'
|
require 'sinatra/base'
|
||||||
require "sinatra/json"
|
require "sinatra/json"
|
||||||
require "db/mongo/models/statistic"
|
|
||||||
|
require "providers/provider_factory"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Helpers
|
module Helpers
|
||||||
|
|
||||||
include Sinatra::JSON
|
include Sinatra::JSON
|
||||||
@ -22,25 +23,19 @@ module Devops
|
|||||||
halt(rstatus, json(obj))
|
halt(rstatus, json(obj))
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_provider provider
|
def check_privileges cmd, p
|
||||||
list = ::Provider.providers
|
|
||||||
halt_response("Invalid provider '#{provider}', available providers: '#{list.join("', '")}'", 400) unless list.include?(provider)
|
|
||||||
end
|
|
||||||
|
|
||||||
def check_provider_account provider, account
|
|
||||||
halt_response("Provider acount '#{account}' not found", 400) if ::Provider.get_connector(provider, account).nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def check_policy policy
|
|
||||||
return unless policy
|
|
||||||
user = request.env['USER']
|
user = request.env['USER']
|
||||||
user.check_policy(policy)
|
user.check_privileges(cmd, p)
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_provider provider
|
||||||
|
list = ::Provider::ProviderFactory.providers
|
||||||
|
halt_response("Invalid provider '#{provider}', available providers: '#{list.join("', '")}'", 400) unless list.include?(provider)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Save information about requests with methods POST, PUT, DELETE
|
# Save information about requests with methods POST, PUT, DELETE
|
||||||
def insert_statistic msg=nil
|
def insert_statistic msg=nil
|
||||||
unless request.get?
|
unless request.get?
|
||||||
return if response.status == 401 and request.env['REMOTE_USER'].nil?
|
|
||||||
# parse body
|
# parse body
|
||||||
request.body.rewind
|
request.body.rewind
|
||||||
raw_body = request.body.read
|
raw_body = request.body.read
|
||||||
@ -50,13 +45,8 @@ module Devops
|
|||||||
raw_body
|
raw_body
|
||||||
end
|
end
|
||||||
|
|
||||||
Devops::Model::Statistic.create({
|
# store statistic
|
||||||
user: request.env['REMOTE_USER'],
|
settings.mongo.insert_statistic request.env['REMOTE_USER'], request.path, request.request_method, body, response.status
|
||||||
path: request.path,
|
|
||||||
method: request.request_method,
|
|
||||||
body: body,
|
|
||||||
response_code: response.status
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1,9 +1,9 @@
|
|||||||
require_relative "request_parser"
|
require_relative "request_parser"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Parser
|
module Parser
|
||||||
class DeployParser < RequestParser
|
class BootstrapTemplateParser < RequestParser
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
22
devops-service/app/api2/parsers/deploy.rb
Normal file
22
devops-service/app/api2/parsers/deploy.rb
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
require_relative "request_parser"
|
||||||
|
|
||||||
|
module Devops
|
||||||
|
module API2_0
|
||||||
|
module Parser
|
||||||
|
class DeployParser < RequestParser
|
||||||
|
|
||||||
|
def deploy
|
||||||
|
r = create_object_from_json_body
|
||||||
|
names = check_array(r["names"], "Parameter 'names' should be a not empty array of strings")
|
||||||
|
tags = check_array(r["tags"], "Parameter 'tags' should be an array of strings", String, true)
|
||||||
|
build_number = check_string(r["build_number"], "Parameter 'build_number' should be a not empty string", true)
|
||||||
|
rl = check_array(r["run_list"], "Parameter 'run_list' should be an array of string", String, true)
|
||||||
|
Validators::Helpers::RunList.new(rl).validate! unless rl.nil?
|
||||||
|
check_string(r["named_task"], "Parameter 'named_task' should be a not empty string", true)
|
||||||
|
r
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,7 +1,7 @@
|
|||||||
require_relative "request_parser"
|
require_relative "request_parser"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Parser
|
module Parser
|
||||||
class FilterParser < RequestParser
|
class FilterParser < RequestParser
|
||||||
|
|
||||||
@ -1,12 +1,13 @@
|
|||||||
require_relative "request_parser"
|
require_relative "request_parser"
|
||||||
|
|
||||||
module Devops
|
module Devops
|
||||||
module API3
|
module API2_0
|
||||||
module Parser
|
module Parser
|
||||||
class ImageParser < RequestParser
|
class ImageParser < RequestParser
|
||||||
|
|
||||||
def images
|
def images
|
||||||
provider = @params["provider"]
|
provider = @params["provider"]
|
||||||
|
puts "Provider: #{provider}"
|
||||||
check_provider(provider) if provider
|
check_provider(provider) if provider
|
||||||
provider
|
provider
|
||||||
end
|
end
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user