create stack method for ec2

This commit is contained in:
amartynov 2015-08-17 11:25:20 +03:00
parent 21cfbd8973
commit ce49f03dd4
4 changed files with 70 additions and 14 deletions

View File

@ -16,7 +16,7 @@ module Devops
json Devops::API2_0::Handler::Stack.new(request).stacks_for_provider(provider).map(&:to_hash)
end
app.post_with_headers "/stack", :headers => [:accept] do
app.post_with_headers "/stack", :headers => [:accept, :content_type] do
check_privileges("stack", "w")
json Devops::API2_0::Handler::Stack.new(request).create_stack
#create_response "Created", nil, 201

View File

@ -29,5 +29,13 @@ module Provider
def unset_tags instance_id, tags
end
def create_default_chef_node_name s
"#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}"
end
def create_default_stack_name s
"stack_#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}"
end
end
end

View File

@ -157,10 +157,6 @@ module Provider
true
end
def create_default_chef_node_name s
"#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}"
end
def delete_server s
r = self.compute.terminate_instances(s.id)
i = r.body["instancesSet"][0]
@ -202,6 +198,63 @@ module Provider
def compute
connection_compute(connection_options)
end
def cloud_formation
@cloud_formation ||= Fog::AWS::CloudFormation.new(connection_options)
end
def create_stack(stack, out)
begin
out << "Creating stack for project '#{stack.project}' and environment '#{stack.deploy_env}'...\n"
stack.name = create_default_stack_name(stack) unless stack.name
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 = cloud_formation.create_stack(stack.name,
{
'TemplateBody' => stack.template_body,
'Parameters' => stack.parameters || {}
}
)
stack.id = response.body['StackId']
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
def delete_stack(stack)
fog_stack(stack).destroy
end
def stack_details(stack)
fog_stack(stack).details
end
def stack_resources(stack)
fog_stack(stack).resources
end
def stack_resource(stack, resource_id)
physical_id = fog_stack(stack).resources.get(resource_id).physical_resource_id
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 = {}
@ -252,5 +305,9 @@ module Provider
end
r
end
def fog_stack(stack)
cloud_formation.stacks.get(stack.name, stack.id)
end
end
end

View File

@ -161,14 +161,6 @@ module Provider
true
end
def create_default_chef_node_name s
"#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}"
end
def create_default_stack_name s
"stack_#{self.ssh_key}-#{s.project}-#{s.deploy_env}-#{Time.now.to_i}"
end
def delete_server s
r = self.compute.delete_server(s.id)
return r.status == 204 ? "Server with id '#{s.id}' terminated" : r.body
@ -211,7 +203,6 @@ module Provider
response = orchestration.create_stack(
stack_name: stack.name,
template: stack.template_body,
tenant_id: connection_options[:openstack_tenant],
parameters: stack.parameters || {}
)
stack.id = response[:body]['stack']['id']