openstack and ec2 deploy_envs

This commit is contained in:
amartynov 2014-07-01 11:57:36 +04:00
parent b0d5e8e1bd
commit f3d1f6a9ff
9 changed files with 425 additions and 269 deletions

View File

@ -0,0 +1,132 @@
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/input_utils"
class DeployEnv
include InputUtils
attr_accessor :options, :auth, :flavors, :flavors_table, :images, :images_table, :networks, :networks_table, :groups, :groups_table, :users, :users_table
def set_parameter obj, key
if self.options[key].nil?
obj[key] = yield
else
obj[key] = self.options[key]
end
end
def fill obj
yield(obj) if block_given?
set_users(obj)
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 obj, :run_list do
set_run_list_cmd
end
unless self.options[:no_expires]
set_parameter obj, :expires do
s = enter_parameter_or_empty(I18n.t("options.project.create.expires") + ": ").strip
s.empty? ? nil : s
end
end
end
def set_run_list_cmd
res = nil
begin
res = get_comma_separated_list(I18n.t("options.project.create.run_list") + ": ")
end until DeployEnv.validate_run_list(res)
res
end
# flavors commands
def set_flavor d
if self.flavors.nil?
get_flavors
end
unless self.options[:flavor].nil?
f = self.flavors.detect { |f| f["id"] == self.options[:flavor] }
abort(I18n.t("handler.project.create.flavor.not_found")) if f.nil?
end
set_parameter d, :flavor do
choose_flavor_cmd(self.flavors, self.flavors_table)["id"]
end
end
def get_flavors
f = Flavor.new(@host, self.options)
f.auth = self.auth
self.flavors = f.list_handler(["flavor", "list", self.provider])
self.flavors_table = f.table
end
# returns flavor hash
def choose_flavor_cmd flavors, table=nil
abort(I18n.t("handler.flavor.list.empty")) if flavors.empty?
flavors[ choose_number_from_list(I18n.t("headers.flavor"), flavors.map{|f| "#{f["id"]}. #{f["name"]} - #{f["ram"]}, #{f["disk"]}, #{f["v_cpus"]} CPU"}.join("\n"), table) ]
end
# images commands
def get_images
img = Image.new(@host, self.options)
img.auth = self.auth
self.images = img.list_handler(["image", "list", self.provider])
self.images_table = img.table
end
def set_image d
images, ti = nil, nil
if self.images.nil?
get_images
end
set_parameter d, :image do
choose_image_cmd(self.images, self.images_table)["id"]
end
end
def get_networks
n = Network.new(@host, self.options)
n.auth = self.auth
self.networks = n.list_handler(["network", "list", self.provider])
self.networks_table = n.table
end
def get_users
u = User.new(@host, self.options)
u.auth = self.auth
self.users = u.list_handler
self.users_table = u.table
end
def set_users d
if self.users.nil?
get_users
end
set_parameter d, :users do
list = users.map{|u| u["id"]}
Set.new choose_indexes_from_list(I18n.t("handler.project.create.user"), list, self.users_table).map{|i| list[i]}
end
d[:users].add(self.options[:username])
d[:users] = d[:users].to_a
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
end

View File

@ -0,0 +1,65 @@
require "devops-client/handler/deploy_envs/deploy_env"
class DeployEnvEc2 < DeployEnv
NAME = "ec2"
def initialize host, options, auth
@host = host
self.auth = auth
self.options = options
end
def provider
NAME
end
def fill obj
super(obj) do |o|
set_flavor(o)
set_image(o)
vpc_id = set_subnets(o)
set_groups(o, vpc_id)
end
end
def set_subnets d
if self.networks.nil?
get_networks
end
unless self.options[:subnets].nil?
self.options[:subnets] = [ self.options[:subnets][0] ]
end
vpc_id = nil
set_parameter d, :subnets do
if self.networks.any?
num = choose_number_from_list(I18n.t("handler.project.create.subnet.ec2"), self.networks, self.networks_table, -1)
vpc_id = self.networks[num]["vpcId"] unless num == -1
num == -1 ? [] : [ self.networks[num]["subnetId"] ]
else
[]
end
end
return vpc_id
end
def get_groups vpcId
g = Group.new(@host, self.options)
g.auth = self.auth
p = ["group", "list", provider]
p.push vpcId if !vpcId.nil?
self.groups = g.list_handler(p)
self.groups_table = g.table
end
def set_groups d, vpc_id
if self.groups.nil?
get_groups(vpc_id)
end
set_parameter d, :groups do
list = groups.keys
choose_indexes_from_list(I18n.t("options.project.create.groups"), list, self.groups_table, "default", list.index("default")).map{|i| list[i]}
end
end
end

View File

@ -0,0 +1,26 @@
require "devops-client/handler/deploy_envs/deploy_env_static"
require "devops-client/handler/deploy_envs/deploy_env_ec2"
require "devops-client/handler/deploy_envs/deploy_env_openstack"
class DeployEnvFactory
@@envs = {}
def self.create provider, host, options, auth
unless @@envs.key?(provider)
de = case provider
when DeployEnvStatic::NAME
DeployEnvStatic
when DeployEnvEc2::NAME
DeployEnvEc2
when DeployEnvOpenstack::NAME
DeployEnvOpenstack
else
end
@@envs[provider] = de.new(host, options, auth)
end
@@envs[provider]
end
end

View File

@ -0,0 +1,57 @@
require "devops-client/handler/deploy_envs/deploy_env"
class DeployEnvOpenstack < DeployEnv
NAME = "openstack"
def initialize host, options, auth
@host = host
self.auth = auth
self.options = options
end
def provider
NAME
end
def fill obj
super(obj) do |o|
set_flavor(o)
set_image(o)
set_subnets(o)
set_groups(o)
end
end
def set_subnets d
networks, tn = nil, nil
if self.networks.nil?
get_networks
end
set_parameter d, :subnets do
s = []
begin
s = choose_indexes_from_list(I18n.t("handler.project.create.subnet.openstack"), self.networks, self.networks_table).map{|i| self.networks[i]["name"]}
end while s.empty?
s
end
end
def get_groups
g = Group.new(@host, self.options)
g.auth = self.auth
self.groups = g.list_handler(["group", "list", self.provider])
self.groups_table = g.table
end
def set_groups d
if self.groups.nil?
get_groups
end
set_parameter d, :groups do
list = groups.keys
choose_indexes_from_list(I18n.t("options.project.create.groups"), list, self.groups_table, "default", list.index("default")).map{|i| list[i]}
end
end
end

View File

@ -0,0 +1,20 @@
require "devops-client/handler/deploy_envs/deploy_env"
class DeployEnvStatic < DeployEnv
NAME = "static"
def initialize options, auth
self.auth = auth
self.options = options
end
def provider
NAME
end
def fill obj
super(obj)
end
end

View File

@ -6,9 +6,12 @@ require "devops-client/options/common_options"
require "uri"
require "json"
require "devops-client/i18n"
require "devops-client/handler/input_utils"
class Handler
include InputUtils
attr_reader :options
attr_writer :host
attr_accessor :auth
@ -114,109 +117,6 @@ protected
puts "\e[31m#{msg}\e[0m"
end
def question str
return true if self.options[:no_ask]
if block_given?
yield
end
res = false
#system("stty raw -echo")
begin
print "#{str} (y/n): "
s = STDIN.gets.strip
if s == "y"
res = true
elsif s == "n"
res == false
else
raise ArgumentError.new
end
rescue ArgumentError
retry
end
#print "#{s}\n\r"
#system("stty -raw echo")
res
end
def choose_image_cmd images, t=nil
abort(I18n.t("handler.error.list.empty", :name => "Image")) if images.empty?
if options[:image_id].nil?
images[ choose_number_from_list(I18n.t("headers.image"), images, t) ]
else
i = images.detect { |i| i["name"] == options[:image_id]}
abort("No such image") if i.nil?
return i
end
end
def get_comma_separated_list msg
print msg
STDIN.gets.strip.split(",").map{|e| e.strip}
end
def enter_parameter msg
str = enter_parameter_or_empty(msg)
raise ArgumentError.new if str.empty?
str
rescue ArgumentError
retry
end
def enter_parameter_or_empty msg
print msg
return STDIN.gets.strip
end
def choose_number_from_list title, list, table=nil, default=nil
i = 0
if table.nil?
puts I18n.t("handler.message.choose", :name => title.downcase) + "\n" + list.map{|p| i += 1; "#{i}. #{p}"}.join("\n")
else
puts table
end
begin
print "#{title}: "
buf = STDIN.gets.strip
if buf.empty? and !default.nil?
return default
end
i = Integer buf
rescue ArgumentError
retry
end until i > 0 and i <= list.size
return i - 1
end
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?
ar = nil
if table.nil?
i = 0
print I18n.t("handler.message.choose", :name => title.downcase) + "\n#{list.map{|p| i += 1; "#{i}. #{p}"}.join("\n")}\n"
else
puts table
end
msg = if default.nil?
I18n.t("handler.message.choose_list", :name => title)
else
I18n.t("handler.message.choose_list_default", :name => title, :default => default)
end
begin
ar = get_comma_separated_list(msg).map do |g|
n = Integer g.strip
raise ArgumentError.new(I18n.t("handler.error.number.invalid")) if n < 1 or n > list.size
n
end
if ar.empty? and !default.nil?
return [ defindex ]
end
rescue ArgumentError
retry
end
ar.map{|i| i - 1}
end
def output
case self.options[:format]
when CommonOptions::TABLE_FORMAT

View File

@ -0,0 +1,106 @@
module InputUtils
def question str
return true if self.options[:no_ask]
if block_given?
yield
end
res = false
#system("stty raw -echo")
begin
print "#{str} (y/n): "
s = STDIN.gets.strip
if s == "y"
res = true
elsif s == "n"
res == false
else
raise ArgumentError.new
end
rescue ArgumentError
retry
end
#print "#{s}\n\r"
#system("stty -raw echo")
res
end
def choose_image_cmd images, t=nil
abort(I18n.t("handler.error.list.empty", :name => "Image")) if images.empty?
if options[:image_id].nil?
images[ choose_number_from_list(I18n.t("headers.image"), images, t) ]
else
i = images.detect { |i| i["name"] == options[:image_id]}
abort("No such image") if i.nil?
return i
end
end
def get_comma_separated_list msg
print msg
STDIN.gets.strip.split(",").map{|e| e.strip}
end
def enter_parameter msg
str = enter_parameter_or_empty(msg)
raise ArgumentError.new if str.empty?
str
rescue ArgumentError
retry
end
def enter_parameter_or_empty msg
print msg
return STDIN.gets.strip
end
def choose_number_from_list title, list, table=nil, default=nil
i = 0
if table.nil?
puts I18n.t("handler.message.choose", :name => title.downcase) + "\n" + list.map{|p| i += 1; "#{i}. #{p}"}.join("\n")
else
puts table
end
begin
print "#{title}: "
buf = STDIN.gets.strip
if buf.empty? and !default.nil?
return default
end
i = Integer buf
rescue ArgumentError
retry
end until i > 0 and i <= list.size
return i - 1
end
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?
ar = nil
if table.nil?
i = 0
print I18n.t("handler.message.choose", :name => title.downcase) + "\n#{list.map{|p| i += 1; "#{i}. #{p}"}.join("\n")}\n"
else
puts table
end
msg = if default.nil?
I18n.t("handler.message.choose_list", :name => title)
else
I18n.t("handler.message.choose_list_default", :name => title, :default => default)
end
begin
ar = get_comma_separated_list(msg).map do |g|
n = Integer g.strip
raise ArgumentError.new(I18n.t("handler.error.number.invalid")) if n < 1 or n > list.size
n
end
if ar.empty? and !default.nil?
return [ defindex ]
end
rescue ArgumentError
retry
end
ar.map{|i| i - 1}
end
end

View File

@ -8,6 +8,7 @@ require "devops-client/options/project_options"
require "json"
require "set"
require "devops-client/output/project"
require "devops-client/handler/deploy_envs/deploy_env_factory"
class Project < Handler
@ -244,7 +245,7 @@ class Project < Handler
if run_list.empty?
exit unless question(I18n.t("handler.project.run_list.empty"))
else
exit unless Project.validate_run_list(run_list)
exit unless DeployEnv.validate_run_list(run_list)
end
put "/project/#{args[3]}/#{args[4]}/run_list", run_list
end
@ -281,41 +282,10 @@ protected
return p.list_handler(["provider", "list"]), p.table
end
def get_images provider
img = Image.new(@host, self.def_options)
img.auth = self.auth
return img.list_handler(["image", "list", provider]), img.table
end
def get_flavors provider
f = Flavor.new(@host, self.def_options)
f.auth = self.auth
return f.list_handler(["flavor", "list", provider]), f.table
end
def get_groups provider, vpcId
g = Group.new(@host, self.def_options)
g.auth = self.auth
p = ["group", "list", provider]
p.push vpcId if !vpcId.nil? and provider == "ec2"
return g.list_handler(p), g.table
end
def get_networks provider
n = Network.new(@host, self.def_options)
n.auth = self.auth
return n.list_handler(["network", "list", provider]), n.table
end
def get_users
u = User.new(@host, self.def_options)
u.auth = self.auth
return u.list_handler, u.table
end
def create_project args, env_method_name, type=nil
project_name = args[2]
providers = {}
providers[:obj], providers[:table] = get_providers
begin
project = get_project_info_obj(project_name)
puts_warn I18n.t("handler.project.exist", :project => project_name)
@ -351,12 +321,17 @@ protected
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)
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?
@ -373,6 +348,7 @@ protected
s.empty? ? nil : s
end
end
=end
d
end
@ -391,7 +367,7 @@ protected
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])
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]
@ -424,114 +400,11 @@ protected
end
def set_provider d, providers
if providers[:obj].nil?
providers[:obj], providers[:table] = get_providers
providers[:obj].each{|p| providers[p] = {}}
end
set_parameter d, :provider do
providers[:obj][ choose_number_from_list(I18n.t("headers.provider"), providers[:obj], providers[:table]) ]
end
end
def set_flavor d, buf
flavors, tf = nil, nil
if buf[:flavors].nil?
flavors, tf = get_flavors(d[:provider])
add_object buf, :flavors, flavors, tf
else
flavors, tf = buf[:flavors][:obj], buf[:flavors][:table]
end
unless self.options[:flavor].nil?
f = flavors.detect { |f| f["id"] == self.options[:flavor] }
abort(I18n.t("handler.project.create.flavor.not_found")) if f.nil?
end
set_parameter d, :flavor do
choose_flavor_cmd(flavors, tf)["id"]
end
end
def set_image d, buf
images, ti = nil, nil
if buf[:images].nil?
images, ti = get_images(d[:provider])
add_object buf, :images, images, ti
else
images, ti = buf[:images][:obj], buf[:images][:table]
end
set_parameter d, :image do
choose_image_cmd(images, ti)["id"]
end
end
def set_subnets d, buf
networks, tn = nil, nil
if buf[:networks].nil?
networks, tn = get_networks(d[:provider])
add_object buf, :networks, networks, tn
else
networks, tn = buf[:networks][:obj], buf[:networks][:table]
end
unless self.options[:subnets].nil?
if "ec2" == d[:provider]
self.options[:subnets] = [ self.options[:subnets][0] ]
end
end
vpc_id = nil
set_parameter d, :subnets do
if "ec2" == d[:provider]
if networks.any?
num = choose_number_from_list(I18n.t("handler.project.create.subnet.ec2"), networks, tn, -1)
vpc_id = networks[num]["vpcId"] unless num == -1
num == -1 ? [] : [ networks[num]["subnetId"] ]
else
[]
end
else
s = []
begin
s = choose_indexes_from_list(I18n.t("handler.project.create.subnet.openstack"), networks, tn).map{|i| networks[i]["name"]}
end while s.empty?
s
end
end
return vpc_id
end
def set_groups d, buf, vpc_id
groups, tg = nil, nil
if buf[:groups].nil?
groups, tg = get_groups(d[:provider], vpc_id)
add_object buf, :groups, groups, tg
else
groups, tg = buf[:groups][:obj], buf[:groups][:table]
end
set_parameter d, :groups do
list = groups.keys
choose_indexes_from_list(I18n.t("options.project.create.groups"), list, tg, "default", list.index("default")).map{|i| list[i]}
end
end
def set_users d, buf
users, tu = nil, nil
if buf[:users].nil?
users, tu = get_users
add_object buf, :users, users, tu
else
users, tu = buf[:users][:obj], buf[:users][:table]
end
set_parameter d, :users do
list = users.map{|u| u["id"]}
Set.new choose_indexes_from_list(I18n.t("handler.project.create.user"), list, tu).map{|i| list[i]}
end
d[:users].add(self.options[:username])
d[:users] = d[:users].to_a
end
def add_object tec, key, obj, table
tec[key] = {:obj => obj, :table => table}
end
def set_parameter obj, key
if self.options[key].nil?
obj[key] = yield
@ -540,12 +413,6 @@ protected
end
end
# returns flavor hash
def choose_flavor_cmd flavors, table=nil
abort(I18n.t("handler.flavor.list.empty")) if flavors.empty?
flavors[ choose_number_from_list(I18n.t("headers.flavor"), flavors.map{|f| "#{f["id"]}. #{f["name"]} - #{f["ram"]}, #{f["disk"]}, #{f["v_cpus"]} CPU"}.join("\n"), table) ]
end
# returns project id
def choose_project projects, table=nil
abort(I18n.t("handler.project.list.empty")) if projects.empty?
@ -558,21 +425,4 @@ protected
project_envs[ choose_number_from_list(I18n.t("headers.project_env"), project_envs, table) ]
end
def set_run_list_cmd project, env
res = nil
begin
res = get_comma_separated_list(I18n.t("options.project.create.run_list") + ": ")
end until Project.validate_run_list(res)
res
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
end

View File

@ -1,3 +1,3 @@
module DevopsClient
VERSION = "2.1.30"
VERSION = "2.1.31"
end