diff --git a/devops-service/db/mongo/models/stack/stack_base.rb b/devops-service/db/mongo/models/stack/stack_base.rb index dbcc6c2..a961002 100644 --- a/devops-service/db/mongo/models/stack/stack_base.rb +++ b/devops-service/db/mongo/models/stack/stack_base.rb @@ -2,14 +2,13 @@ module Devops module Model class StackBase < MongoModel - attr_accessor :id, :project, :deploy_env, :stack_template, :cloud_stack_id, :provider, :parameters, :template_body + attr_accessor :id, :project, :deploy_env, :stack_template, :cloud_stack_id, :provider, :parameters types id: {type: String, empty: false}, provider: {type: String, empty: false}, - project: {type: String, empty: true}, - deploy_env: {type: String, empty: true}, - stack_template: {type: String, empty: true}, - template_body: {type: String, empty: true} + project: {type: String, nil: true}, + deploy_env: {type: String, nil: true}, + stack_template: {type: String, empty: false} # cloud_stack_id: {type: String, empty: true} # TODO: add parameters Hash @@ -19,7 +18,6 @@ module Devops self.project = attrs['project'] self.deploy_env = attrs['deploy_env'] self.stack_template = attrs['stack_template'] - self.template_body = attrs['template_body'] # self.cloud_stack_id = attrs['cloud_stack_id'] self.parameters = attrs['parameters'] self @@ -61,11 +59,8 @@ module Devops raise 'override me' end - # if not set in constructor, assume stack was created via stack_template. - # It is need to support presets. - # TODO: refactore it. def template_body - @template_body ||= Devops::Api2.settings.mongo.stack_template(stack_template).template_body + Devops::Api2.settings.mongo.stack_template(stack_template).template_body end end diff --git a/devops-service/lib/stack_template_presets/base.rb b/devops-service/lib/stack_template_presets/base.rb index d637121..aa692f7 100644 --- a/devops-service/lib/stack_template_presets/base.rb +++ b/devops-service/lib/stack_template_presets/base.rb @@ -10,20 +10,20 @@ module Devops end def to_hash - {id: id, template_preset_body: template_preset_body} + {id: id, template_body: template_body} end def create_stack_from_preset(provider, stack_id, parameters) - stack_attrs = { + find_or_create_stack_template!(provider) + Model::StackFactory.create(provider, { 'id' => stack_id, 'provider' => provider, 'parameters' => parameters, - 'template_body' => template_preset_body - } - Model::StackFactory.create(provider, stack_attrs) + 'stack_template' => stack_template_name(provider) + }) end - def template_preset_body + def template_body file_name = File.join("lib/stack_template_presets/#{id}.#{template_file_extension}") File.read(file_name) end @@ -33,6 +33,26 @@ module Devops :json end + private + + def find_or_create_stack_template!(provider) + name = stack_template_name(provider) + begin + Devops::Api2.settings.mongo.stack_template(name) + rescue RecordNotFound + template = Model::StackTemplateFactory.create(provider, { + 'id' => name, + 'provider' => provider, + 'template_body' => template_body + }) + Devops::Api2.settings.mongo.stack_template_insert(template) + end + end + + def stack_template_name(provider) + "#{id}_#{provider}_preset" + end + end end end \ No newline at end of file diff --git a/devops-service/providers/openstack.rb b/devops-service/providers/openstack.rb index b3f92f7..5a10594 100644 --- a/devops-service/providers/openstack.rb +++ b/devops-service/providers/openstack.rb @@ -193,11 +193,13 @@ module Provider def create_stack(stack) begin - response = orchestration.create_stack(stack.id, { + response = orchestration.create_stack( + stack_name: stack.id, template: stack.template_body, tenant_id: connection_options[:openstack_tenant], parameters: stack.parameters - }) + ) + # byebug response[:body]['stack']['id'] rescue Excon::Errors::Conflict => e raise ProviderErrors::NameConflict diff --git a/devops-service/routes/v2.0/handlers/stack_template.rb b/devops-service/routes/v2.0/handlers/stack_template.rb index 5a690bb..ae8e799 100644 --- a/devops-service/routes/v2.0/handlers/stack_template.rb +++ b/devops-service/routes/v2.0/handlers/stack_template.rb @@ -28,8 +28,8 @@ module Devops attrs = create_object_from_json_body template_model = Model::StackTemplateFactory.create(attrs['provider'], attrs) - settings.mongo.stack_template_insert(template_model) + create_response 'Created', template_model.to_hash, 201 } end diff --git a/devops-service/routes/v2.0/handlers/stack_template_preset.rb b/devops-service/routes/v2.0/handlers/stack_template_preset.rb index 766e23b..1d71146 100644 --- a/devops-service/routes/v2.0/handlers/stack_template_preset.rb +++ b/devops-service/routes/v2.0/handlers/stack_template_preset.rb @@ -31,6 +31,7 @@ module Devops preset = Devops::StackTemplatePresetsFactory.get(attrs.fetch('id')) stack = preset.create_stack_from_preset(provider, stack_id, parameters) + settings.mongo.stack_insert(stack) create_response 'Created', stack.to_hash, 201 }