fixed openstack provider to create stack

This commit is contained in:
amartynov 2015-08-14 17:48:07 +03:00
parent 3fcc4f16d1
commit 21cfbd8973
11 changed files with 70 additions and 45 deletions

View File

@ -18,6 +18,7 @@ module Devops
Devops::Db.connector.stacks(provider)
end
=begin
def create_stack object
object[:owner] = owner_from_request
file = JobStarter.start_job(:worker, :stack_bootstrap,
@ -29,21 +30,26 @@ module Devops
stack
end
=end
def create_stack
object = parser.create
stack_model = Model::StackFactory.create(object['provider'], object)
stack_model.owner = owner_from_request
Devops::Db.connector.stack_insert(stack_model)
project = Devops::Db.connector.project(object["project"])
env = project.deploy_env(object["deploy_env"])
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,
provider: stack_model.provider,
stack_id: stack_model.id,
provider: env.provider,
stack_attributes: object,
request: @request
)
puts "Syncing report is located here: #{file}"
stack_model
[file]
end
def stack id

View File

@ -17,9 +17,9 @@ module Devops
Devops::Db.connector.stack_templates(provider)
end
def create_stack_template
def create_stack_template provider
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)
template_model
end

View File

@ -18,8 +18,8 @@ module Devops
app.post_with_headers "/stack", :headers => [:accept] do
check_privileges("stack", "w")
m = Devops::API2_0::Handler::Stack.new(request).create_stack
create_response "Created", m.to_hash, 201
json Devops::API2_0::Handler::Stack.new(request).create_stack
#create_response "Created", nil, 201
end
hash = {}

View File

@ -15,9 +15,10 @@ module Devops
json Devops::API2_0::Handler::StackTemplate.new(request).stack_templates_for_provider(provider).map(&:to_hash)
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')
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
end

View File

@ -1,3 +1,4 @@
require "db/mongo/models/stack_template/stack_template_factory"
module Connectors
class StackTemplate < Base
include Helpers::InsertCommand,

View File

@ -28,7 +28,7 @@ module Devops
self.parameters = attrs['parameters']
self.details = attrs['details']
self.owner = attrs['owner']
self.run_list = attrs['run_list']
self.run_list = attrs['run_list'] || []
self
end
@ -46,9 +46,9 @@ module Devops
}
end
def create_stack_in_cloud!
def create_stack_in_cloud! out
begin
self.cloud_stack_id = provider_instance.create_stack(self)
provider_instance.create_stack(self, out)
rescue ProviderErrors::NameConflict
raise InvalidRecord.new "Duplicate key error: stack with name '#{id}' already exists in cloud"
end
@ -93,9 +93,9 @@ module Devops
# - id (String)
# - deploy_env (String)
# - stack_template (String)
def create(attrs)
def create(attrs, out)
model = new(attrs)
model.create_stack_in_cloud!
model.create_stack_in_cloud!(out)
model.sync_details!
model
end

View File

@ -6,8 +6,8 @@ module Devops
module Model
class StackFactory
def self.create(provider, attrs)
get_class(provider).create(attrs)
def self.create(provider, attrs, out)
get_class(provider).create(attrs, out)
end
def self.build_from_bson(provider, attrs)

View File

@ -7,7 +7,9 @@ module Devops
class StackTemplateFactory
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
def self.build_from_bson(provider, attrs)

View File

@ -17,7 +17,7 @@ class MongoConnector
[:available_images, :add_available_images, :delete_available_images] => :filters_connector,
[:project, :projects_all, :projects, :project_names_with_envs,
: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_template_delete] => :projects_templates_connector,
[:servers_find, :servers, :stack_servers, :servers_by_names, :server_by_instance_id,

View File

@ -207,15 +207,27 @@ module Provider
out << "Stack name: #{stack.name}\n"
out << "Stack template: #{stack.stack_template}\n"
out << "Stack parameters: #{stack.parameters}\n"
out << "Stack template: #{stack.template_body}\n"
response = orchestration.create_stack(
stack_name: stack.name,
template: stack.template_body,
# tenant_id: connection_options[:openstack_tenant],
parameters: stack.parameters
tenant_id: connection_options[:openstack_tenant],
parameters: stack.parameters || {}
)
stack.id = response[:body]['stack']['id']
rescue Excon::Errors::Conflict => e
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
@ -236,6 +248,10 @@ module Provider
compute.servers.get(physical_id)
end
def stack_servers(stack)
fog_stack(stack).resources.map{|r| compute.servers.get(r.physical_resource_id)}
end
private
def convert_groups list
res = {}
@ -262,7 +278,7 @@ module Provider
end
def fog_stack(stack)
orchestration.stacks.get(stack.id, stack.cloud_stack_id)
orchestration.stacks.get(stack.name, stack.id)
end
end

View File

@ -12,48 +12,47 @@ class StackBootstrapWorker < Worker
# :stack_id
def perform(options)
call(options['config'], options['provider'], options['dir']) do |provider, out, file|
save_report(mongo, stack, file)
stack = Model::StackFactory.create(options['provider'], options['stack_attributes'])
stack.owner = options['owner']
attrs = options['stack_attributes']
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)
sync_bootstrap_proc.call(out, stack, mongo)
servers = persist_stack_servers!(stack, provider)
unless options['stack_attributes']['without_bootstrap']
statuses = servers.map do |s|
Devops::Executor::ServerExecutor.new(s, out).two_phase_bootstrap({})
end
end
end
end
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)
mongo = ::Devops::Db.connector
project = mongo.project(stack.project)
deploy_env = project.deploy_env(stack.deploy_env)
stack.resources.map do |resource|
extended_info = stack.resource(resource.resource_name)
provider.stack_servers(stack).map do |extended_info |
server_attrs = {
'provider' => provider.name,
'project' => project.id,
'deploy_env' => deploy_env.identifier,
'remote_user' => mongo.image(deploy_env.image).remote_user,
'key' => extended_info.key_name || provider.ssh_key,
'id' => extended_info.id,
'_id' => extended_info.id,
'chef_node_name' => extended_info.name,
'private_ip' => extended_info.addresses.values.first.first['addr'],
'created_by' => stack.owner,