lib/fog/openstack/orchestration/requests/create_stack.rb
module Fog
module OpenStack
class Orchestration
class Real
# Create a stack.
#
#
# * options [Hash]:
# * :stack_name [String] Name of the stack to create.
# * :template [String] Structure containing the template body.
# or (one of the two Template parameters is required)
# * :template_url [String] URL of file containing the template body.
# * :files [Hash] Hash with files resources.
# * :disable_rollback [Boolean] Controls rollback on stack creation failure, defaults to false.
# * :parameters [Hash] Hash of providers to supply to template
# * :timeout_mins [Integer] Minutes to wait before status is set to CREATE_FAILED
#
# @see http://developer.openstack.org/api-ref-orchestration-v1.html
def create_stack(arg1, arg2 = nil)
if arg1.kind_of?(Hash)
# Normal use: create_stack(options)
options = arg1
else
# Deprecated: create_stack(stack_name, options = {})
Fog::Logger.deprecation("#create_stack(stack_name, options) is deprecated, use #create_stack(options) instead [light_black](#{caller.first})[/]")
options = {
:stack_name => arg1
}.merge(arg2.nil? ? {} : arg2)
end
# Templates should always:
# - be strings
# - contain URI references instead of relative paths.
# Passing :template_url may not work well with `get_file` and remote `type`:
# the python client implementation in shade retrieves from :template_uri
# and replaces it with :template.
# see https://github.com/openstack-infra/shade/blob/master/shade/openstackcloud.py#L1201
# see https://developer.openstack.org/api-ref/orchestration/v1/index.html#create-stack
file_resolver = Util::RecursiveHotFileLoader.new(options[:template] || options[:template_url], options[:files])
options[:template] = file_resolver.template
options[:files] = file_resolver.files unless file_resolver.files.empty?
request(
:expects => 201,
:path => 'stacks',
:method => 'POST',
:body => Fog::JSON.encode(options)
)
end
end
class Mock
def create_stack(arg1, arg2 = nil)
if arg1.kind_of?(Hash)
# Normal use: create_stack(options)
options = arg1
else
# Deprecated: create_stack(stack_name, options = {})
Fog::Logger.deprecation("#create_stack(stack_name, options) is deprecated, use #create_stack(options) instead [light_black](#{caller.first})[/]")
options = {
:stack_name => arg1
}.merge(arg2.nil? ? {} : arg2)
end
stack_id = Fog::Mock.random_hex(32)
stack = data[:stacks][stack_id] = {
'id' => stack_id,
'stack_name' => options[:stack_name],
'links' => [],
'description' => options[:description],
'stack_status' => 'CREATE_COMPLETE',
'stack_status_reason' => 'Stack successfully created',
'creation_time' => Time.now,
'updated_time' => Time.now
}
response = Excon::Response.new
response.status = 201
response.body = {
'id' => stack_id,
'links' => [{"href" => "http://localhost:8004/v1/fake_tenant_id/stacks/#{options[:stack_name]}/#{stack_id}", "rel" => "self"}]
}
if options.key?(:files)
response.body['files'] = {'foo.sh' => 'hello'}
end
if options.key?(:template) || options.key?(:template_url)
file_resolver = OrchestrationUtil::RecursiveHotFileLoader.new(options[:template] || options[:template_url], options[:files])
response.body['files'] = file_resolver.files unless file_resolver.files.empty?
end
response
end
end
end
end
end