fixed openstack provider to create stack
This commit is contained in:
parent
3fcc4f16d1
commit
21cfbd8973
@ -18,6 +18,7 @@ module Devops
|
|||||||
Devops::Db.connector.stacks(provider)
|
Devops::Db.connector.stacks(provider)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
def create_stack object
|
def create_stack object
|
||||||
object[:owner] = owner_from_request
|
object[:owner] = owner_from_request
|
||||||
file = JobStarter.start_job(:worker, :stack_bootstrap,
|
file = JobStarter.start_job(:worker, :stack_bootstrap,
|
||||||
@ -29,21 +30,26 @@ module Devops
|
|||||||
|
|
||||||
stack
|
stack
|
||||||
end
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
def create_stack
|
def create_stack
|
||||||
object = parser.create
|
object = parser.create
|
||||||
stack_model = Model::StackFactory.create(object['provider'], object)
|
project = Devops::Db.connector.project(object["project"])
|
||||||
stack_model.owner = owner_from_request
|
env = project.deploy_env(object["deploy_env"])
|
||||||
Devops::Db.connector.stack_insert(stack_model)
|
raise InvalidRecord.new("Environment '#{env.identifier}' of project '#{project.id}' has no stack template") if env.stack_template.nil?
|
||||||
|
object["stack_template"] = env.stack_template
|
||||||
|
object["owner"] = parser.current_user
|
||||||
|
# stack_model = Model::StackFactory.create(env.provider, object)
|
||||||
|
# stack_model.owner = owner_from_request
|
||||||
|
#Devops::Db.connector.stack_insert(stack_model)
|
||||||
|
|
||||||
file = JobStarter.start_job(:worker, :stack_bootstrap,
|
file = JobStarter.start_job(:worker, :stack_bootstrap,
|
||||||
provider: stack_model.provider,
|
provider: env.provider,
|
||||||
stack_id: stack_model.id,
|
stack_attributes: object,
|
||||||
request: @request
|
request: @request
|
||||||
)
|
)
|
||||||
puts "Syncing report is located here: #{file}"
|
puts "Syncing report is located here: #{file}"
|
||||||
|
[file]
|
||||||
stack_model
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def stack id
|
def stack id
|
||||||
|
|||||||
@ -17,9 +17,9 @@ module Devops
|
|||||||
Devops::Db.connector.stack_templates(provider)
|
Devops::Db.connector.stack_templates(provider)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_stack_template
|
def create_stack_template provider
|
||||||
body = parser.create
|
body = parser.create
|
||||||
template_model = Model::StackTemplateFactory.create(body['provider'], body)
|
template_model = Model::StackTemplateFactory.create(provider, {'template_body' => body.to_json})
|
||||||
Devops::Db.connector.stack_template_insert(template_model)
|
Devops::Db.connector.stack_template_insert(template_model)
|
||||||
template_model
|
template_model
|
||||||
end
|
end
|
||||||
|
|||||||
@ -18,8 +18,8 @@ module Devops
|
|||||||
|
|
||||||
app.post_with_headers "/stack", :headers => [:accept] do
|
app.post_with_headers "/stack", :headers => [:accept] do
|
||||||
check_privileges("stack", "w")
|
check_privileges("stack", "w")
|
||||||
m = Devops::API2_0::Handler::Stack.new(request).create_stack
|
json Devops::API2_0::Handler::Stack.new(request).create_stack
|
||||||
create_response "Created", m.to_hash, 201
|
#create_response "Created", nil, 201
|
||||||
end
|
end
|
||||||
|
|
||||||
hash = {}
|
hash = {}
|
||||||
|
|||||||
@ -15,9 +15,10 @@ module Devops
|
|||||||
json Devops::API2_0::Handler::StackTemplate.new(request).stack_templates_for_provider(provider).map(&:to_hash)
|
json Devops::API2_0::Handler::StackTemplate.new(request).stack_templates_for_provider(provider).map(&:to_hash)
|
||||||
end
|
end
|
||||||
|
|
||||||
app.post_with_headers "/stack_template", :headers => [:accept] do
|
app.post_with_headers "/stack_template/:provider", :headers => [:accept] do |provider|
|
||||||
check_privileges('stack_template', 'w')
|
check_privileges('stack_template', 'w')
|
||||||
model = Devops::API2_0::Handler::StackTemplate.new(request).create_stack_template()
|
check_provider(provider)
|
||||||
|
model = Devops::API2_0::Handler::StackTemplate.new(request).create_stack_template(provider)
|
||||||
create_response 'Created', model.to_hash, 201
|
create_response 'Created', model.to_hash, 201
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
require "db/mongo/models/stack_template/stack_template_factory"
|
||||||
module Connectors
|
module Connectors
|
||||||
class StackTemplate < Base
|
class StackTemplate < Base
|
||||||
include Helpers::InsertCommand,
|
include Helpers::InsertCommand,
|
||||||
|
|||||||
@ -28,7 +28,7 @@ module Devops
|
|||||||
self.parameters = attrs['parameters']
|
self.parameters = attrs['parameters']
|
||||||
self.details = attrs['details']
|
self.details = attrs['details']
|
||||||
self.owner = attrs['owner']
|
self.owner = attrs['owner']
|
||||||
self.run_list = attrs['run_list']
|
self.run_list = attrs['run_list'] || []
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -46,9 +46,9 @@ module Devops
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_stack_in_cloud!
|
def create_stack_in_cloud! out
|
||||||
begin
|
begin
|
||||||
self.cloud_stack_id = provider_instance.create_stack(self)
|
provider_instance.create_stack(self, out)
|
||||||
rescue ProviderErrors::NameConflict
|
rescue ProviderErrors::NameConflict
|
||||||
raise InvalidRecord.new "Duplicate key error: stack with name '#{id}' already exists in cloud"
|
raise InvalidRecord.new "Duplicate key error: stack with name '#{id}' already exists in cloud"
|
||||||
end
|
end
|
||||||
@ -93,9 +93,9 @@ module Devops
|
|||||||
# - id (String)
|
# - id (String)
|
||||||
# - deploy_env (String)
|
# - deploy_env (String)
|
||||||
# - stack_template (String)
|
# - stack_template (String)
|
||||||
def create(attrs)
|
def create(attrs, out)
|
||||||
model = new(attrs)
|
model = new(attrs)
|
||||||
model.create_stack_in_cloud!
|
model.create_stack_in_cloud!(out)
|
||||||
model.sync_details!
|
model.sync_details!
|
||||||
model
|
model
|
||||||
end
|
end
|
||||||
|
|||||||
@ -6,8 +6,8 @@ module Devops
|
|||||||
module Model
|
module Model
|
||||||
class StackFactory
|
class StackFactory
|
||||||
|
|
||||||
def self.create(provider, attrs)
|
def self.create(provider, attrs, out)
|
||||||
get_class(provider).create(attrs)
|
get_class(provider).create(attrs, out)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.build_from_bson(provider, attrs)
|
def self.build_from_bson(provider, attrs)
|
||||||
|
|||||||
@ -7,7 +7,9 @@ module Devops
|
|||||||
class StackTemplateFactory
|
class StackTemplateFactory
|
||||||
|
|
||||||
def self.create(provider, attrs)
|
def self.create(provider, attrs)
|
||||||
get_class(provider).create(attrs)
|
attrs['id'] = "#{provider}_stack_template_#{Time.new.to_i}"
|
||||||
|
attrs['provider'] = provider
|
||||||
|
st = get_class(provider).create(attrs)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.build_from_bson(provider, attrs)
|
def self.build_from_bson(provider, attrs)
|
||||||
|
|||||||
@ -17,7 +17,7 @@ class MongoConnector
|
|||||||
[:available_images, :add_available_images, :delete_available_images] => :filters_connector,
|
[:available_images, :add_available_images, :delete_available_images] => :filters_connector,
|
||||||
[:project, :projects_all, :projects, :project_names_with_envs,
|
[:project, :projects_all, :projects, :project_names_with_envs,
|
||||||
:projects_by_image, :projects_by_user, :project_insert, :project_update,
|
:projects_by_image, :projects_by_user, :project_insert, :project_update,
|
||||||
:project_delete, :is_project_exists?, :check_project_auth, :set_project_run_list, :set_project_env_run_list] => :projects_connector,
|
:project_delete, :is_project_exists?, :check_project_auth, :set_project_run_list, :set_project_env_run_list, :add_deploy_env_to_project] => :projects_connector,
|
||||||
[:project_templates, :project_template_insert, :project_template_update,
|
[:project_templates, :project_template_insert, :project_template_update,
|
||||||
:project_template_delete] => :projects_templates_connector,
|
:project_template_delete] => :projects_templates_connector,
|
||||||
[:servers_find, :servers, :stack_servers, :servers_by_names, :server_by_instance_id,
|
[:servers_find, :servers, :stack_servers, :servers_by_names, :server_by_instance_id,
|
||||||
|
|||||||
@ -207,15 +207,27 @@ module Provider
|
|||||||
out << "Stack name: #{stack.name}\n"
|
out << "Stack name: #{stack.name}\n"
|
||||||
out << "Stack template: #{stack.stack_template}\n"
|
out << "Stack template: #{stack.stack_template}\n"
|
||||||
out << "Stack parameters: #{stack.parameters}\n"
|
out << "Stack parameters: #{stack.parameters}\n"
|
||||||
|
out << "Stack template: #{stack.template_body}\n"
|
||||||
response = orchestration.create_stack(
|
response = orchestration.create_stack(
|
||||||
stack_name: stack.name,
|
stack_name: stack.name,
|
||||||
template: stack.template_body,
|
template: stack.template_body,
|
||||||
# tenant_id: connection_options[:openstack_tenant],
|
tenant_id: connection_options[:openstack_tenant],
|
||||||
parameters: stack.parameters
|
parameters: stack.parameters || {}
|
||||||
)
|
)
|
||||||
stack.id = response[:body]['stack']['id']
|
stack.id = response[:body]['stack']['id']
|
||||||
rescue Excon::Errors::Conflict => e
|
rescue Excon::Errors::Conflict => e
|
||||||
raise ProviderErrors::NameConflict
|
raise ProviderErrors::NameConflict
|
||||||
|
rescue Excon::Errors::BadRequest => br
|
||||||
|
response = ::Chef::JSONCompat.from_json(br.response.body)
|
||||||
|
if response['code'] == 400
|
||||||
|
out << "\nERROR: Bad request (400): #{response['explanation']}"
|
||||||
|
out << "\n"
|
||||||
|
raise InvalidRecord.new(response['explanation'])
|
||||||
|
else
|
||||||
|
out << "\nERROR: Unknown server error (#{response['code']}): #{response['explanation']}"
|
||||||
|
out << "\n"
|
||||||
|
raise InvalidRecord.new(response['explanation'])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -236,6 +248,10 @@ module Provider
|
|||||||
compute.servers.get(physical_id)
|
compute.servers.get(physical_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def stack_servers(stack)
|
||||||
|
fog_stack(stack).resources.map{|r| compute.servers.get(r.physical_resource_id)}
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def convert_groups list
|
def convert_groups list
|
||||||
res = {}
|
res = {}
|
||||||
@ -262,7 +278,7 @@ module Provider
|
|||||||
end
|
end
|
||||||
|
|
||||||
def fog_stack(stack)
|
def fog_stack(stack)
|
||||||
orchestration.stacks.get(stack.id, stack.cloud_stack_id)
|
orchestration.stacks.get(stack.name, stack.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -12,48 +12,47 @@ class StackBootstrapWorker < Worker
|
|||||||
# :stack_id
|
# :stack_id
|
||||||
def perform(options)
|
def perform(options)
|
||||||
call(options['config'], options['provider'], options['dir']) do |provider, out, file|
|
call(options['config'], options['provider'], options['dir']) do |provider, out, file|
|
||||||
save_report(mongo, stack, file)
|
attrs = options['stack_attributes']
|
||||||
stack = Model::StackFactory.create(options['provider'], options['stack_attributes'])
|
|
||||||
stack.owner = options['owner']
|
|
||||||
mongo = ::Devops::Db.connector
|
mongo = ::Devops::Db.connector
|
||||||
|
report = ::Devops::Model::Report.new(
|
||||||
|
"file" => file,
|
||||||
|
"_id" => jid,
|
||||||
|
"created_by" => attrs['owner'],
|
||||||
|
"project" => attrs["project"],
|
||||||
|
"deploy_env" => attrs["deploy_env"],
|
||||||
|
"type" => ::Devops::Model::Report::STACK_TYPE
|
||||||
|
)
|
||||||
|
mongo.save_report(report)
|
||||||
|
|
||||||
|
stack = Devops::Model::StackFactory.create(options['provider'], options['stack_attributes'], out)
|
||||||
|
# stack.owner = attrs['owner']
|
||||||
mongo.stack_insert(stack)
|
mongo.stack_insert(stack)
|
||||||
|
|
||||||
sync_bootstrap_proc.call(out, stack, mongo)
|
sync_bootstrap_proc.call(out, stack, mongo)
|
||||||
servers = persist_stack_servers!(stack, provider)
|
servers = persist_stack_servers!(stack, provider)
|
||||||
|
unless options['stack_attributes']['without_bootstrap']
|
||||||
statuses = servers.map do |s|
|
statuses = servers.map do |s|
|
||||||
Devops::Executor::ServerExecutor.new(s, out).two_phase_bootstrap({})
|
Devops::Executor::ServerExecutor.new(s, out).two_phase_bootstrap({})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def save_report(mongo, stack, file)
|
|
||||||
report = ::Devops::Model::Report.new(
|
|
||||||
"file" => file,
|
|
||||||
"_id" => jid,
|
|
||||||
"created_by" => stack.owner,
|
|
||||||
"project" => stack.project,
|
|
||||||
"deploy_env" => stack.deploy_env,
|
|
||||||
"type" => ::Devops::Model::Report::STACK_TYPE
|
|
||||||
)
|
|
||||||
mongo.save_report(report)
|
|
||||||
end
|
|
||||||
|
|
||||||
def persist_stack_servers!(stack, provider)
|
def persist_stack_servers!(stack, provider)
|
||||||
mongo = ::Devops::Db.connector
|
mongo = ::Devops::Db.connector
|
||||||
project = mongo.project(stack.project)
|
project = mongo.project(stack.project)
|
||||||
deploy_env = project.deploy_env(stack.deploy_env)
|
deploy_env = project.deploy_env(stack.deploy_env)
|
||||||
|
|
||||||
stack.resources.map do |resource|
|
provider.stack_servers(stack).map do |extended_info |
|
||||||
extended_info = stack.resource(resource.resource_name)
|
|
||||||
server_attrs = {
|
server_attrs = {
|
||||||
'provider' => provider.name,
|
'provider' => provider.name,
|
||||||
'project' => project.id,
|
'project' => project.id,
|
||||||
'deploy_env' => deploy_env.identifier,
|
'deploy_env' => deploy_env.identifier,
|
||||||
'remote_user' => mongo.image(deploy_env.image).remote_user,
|
'remote_user' => mongo.image(deploy_env.image).remote_user,
|
||||||
'key' => extended_info.key_name || provider.ssh_key,
|
'key' => extended_info.key_name || provider.ssh_key,
|
||||||
'id' => extended_info.id,
|
'_id' => extended_info.id,
|
||||||
'chef_node_name' => extended_info.name,
|
'chef_node_name' => extended_info.name,
|
||||||
'private_ip' => extended_info.addresses.values.first.first['addr'],
|
'private_ip' => extended_info.addresses.values.first.first['addr'],
|
||||||
'created_by' => stack.owner,
|
'created_by' => stack.owner,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user