diff --git a/devops-client/lib/devops-client/handler/stack.rb b/devops-client/lib/devops-client/handler/stack.rb index 782f958..2625d3e 100644 --- a/devops-client/lib/devops-client/handler/stack.rb +++ b/devops-client/lib/devops-client/handler/stack.rb @@ -79,13 +79,17 @@ class Stack < Handler end def resources_handler - stack_id = @args[2] + stack_id, resource_id = @args[2], @args[3] r = inspect_parameters(@options_parser.sync_params, stack_id) unless r.nil? @options_parser.invalid_sync_command abort(r) end - @list = get "/stack/#{stack_id}/resources" + if resource_id + @list = get "/stack/#{stack_id}/resources/#{resource_id}" + else + @list = get "/stack/#{stack_id}/resources" + end end def delete_handler diff --git a/devops-client/lib/devops-client/handler/stack_preset.rb b/devops-client/lib/devops-client/handler/stack_preset.rb index 427cdfe..a6df6d9 100644 --- a/devops-client/lib/devops-client/handler/stack_preset.rb +++ b/devops-client/lib/devops-client/handler/stack_preset.rb @@ -49,6 +49,8 @@ class StackPreset < Handler params[:id] = @args[2] params[:provider] = options[:provider] || resources_selector.select_available_provider params[:stack] = options[:stack] || enter_parameter(I18n.t('handler.stack_preset.create.stack')) + params[:project] = options[:project] || resources_selector.select_available_project + params[:deploy_env] = options[:deploy_env] || enter_parameter(I18n.t('handler.stack.create.deploy_env')) filepath = options[:parameters_file] || enter_parameter(I18n.t('handler.stack_preset.create.parameters_file')) params[:parameters] = JSON.parse(File.read(filepath)) diff --git a/devops-service/db/mongo/models/project.rb b/devops-service/db/mongo/models/project.rb index 98a010a..20cc25b 100644 --- a/devops-service/db/mongo/models/project.rb +++ b/devops-service/db/mongo/models/project.rb @@ -136,7 +136,7 @@ module Devops def to_hash_without_id h = {} h["deploy_envs"] = self.deploy_envs.map {|e| e.to_hash} unless self.deploy_envs.nil? - h["archived"] = self.archived + h["archived"] = self.archived if self.archived h["description"] = self.description if self.multi? h["type"] = MULTI_TYPE diff --git a/devops-service/db/mongo/models/stack/stack_base.rb b/devops-service/db/mongo/models/stack/stack_base.rb index 1c4fd20..695331f 100644 --- a/devops-service/db/mongo/models/stack/stack_base.rb +++ b/devops-service/db/mongo/models/stack/stack_base.rb @@ -7,8 +7,8 @@ module Devops types id: {type: String, empty: false}, provider: {type: String, empty: false}, - project: {type: String, nil: true}, - deploy_env: {type: String, nil: true}, + project: {type: String}, + deploy_env: {type: String}, stack_template: {type: String, empty: false}, cloud_stack_id: {type: String, nil: true} # details: {type: String, nil: true} @@ -59,6 +59,10 @@ module Devops provider_class.stack_resources(self) end + def resource(resource_id) + provider_class.stack_resource(self, resource_id) + end + def template_body Devops::Api2.settings.mongo.stack_template(stack_template).template_body end diff --git a/devops-service/lib/stack_presets/base.rb b/devops-service/lib/stack_presets/base.rb index d19ca77..ae09ac7 100644 --- a/devops-service/lib/stack_presets/base.rb +++ b/devops-service/lib/stack_presets/base.rb @@ -13,15 +13,22 @@ module Devops {id: id, template_body: template_body} end - def create_stack_from_preset(provider, stack_id, parameters) + # attrs should include + # 'provider' + # 'stack' + # 'parameters' + # 'project' + # 'deploy_env' + def create_stack_from_preset(attrs) + provider = attrs.fetch('provider') template_name = find_or_create_stack_template!(provider) - puts "Using #{template_name} stack_template to create new stack" - Model::StackFactory.create(provider, { - 'id' => stack_id, - 'provider' => provider, - 'parameters' => parameters, + + stack_attrs = attrs.merge( + 'id' => attrs['stack'], 'stack_template' => template_name - }) + ) + + Model::StackFactory.create(provider, stack_attrs) end def template_body diff --git a/devops-service/providers/openstack.rb b/devops-service/providers/openstack.rb index a5f74fb..a927741 100644 --- a/devops-service/providers/openstack.rb +++ b/devops-service/providers/openstack.rb @@ -217,6 +217,10 @@ module Provider fog_stack(stack).resources end + def stack_resource(stack, resource_id) + fog_stack(stack).resources.get(resource_id) + end + private def convert_groups list res = {} diff --git a/devops-service/routes/v2.0/handlers/stack.rb b/devops-service/routes/v2.0/handlers/stack.rb index cc5b652..c8a9731 100644 --- a/devops-service/routes/v2.0/handlers/stack.rb +++ b/devops-service/routes/v2.0/handlers/stack.rb @@ -74,6 +74,14 @@ module Devops } end + def self.resource + lambda { + check_privileges("stack", "r") + stack = settings.mongo.stack(params[:stack_id]) + json stack.resource(params[:resource_id]) + } + end + end end end diff --git a/devops-service/routes/v2.0/handlers/stack_preset.rb b/devops-service/routes/v2.0/handlers/stack_preset.rb index 376606f..1b16e13 100644 --- a/devops-service/routes/v2.0/handlers/stack_preset.rb +++ b/devops-service/routes/v2.0/handlers/stack_preset.rb @@ -26,11 +26,8 @@ module Devops check_privileges('stack_template', 'w') attrs = create_object_from_json_body - - provider, stack_id, parameters = attrs.fetch('provider'), attrs.fetch('stack'), attrs.fetch('parameters') - preset = Devops::StackPresetsFactory.get(attrs.fetch('id')) - stack = preset.create_stack_from_preset(provider, stack_id, parameters) + stack = preset.create_stack_from_preset(attrs) settings.mongo.stack_insert(stack) create_response 'Created', stack.to_hash, 201 diff --git a/devops-service/routes/v2.0/stack.rb b/devops-service/routes/v2.0/stack.rb index 1d866aa..8634ae0 100644 --- a/devops-service/routes/v2.0/stack.rb +++ b/devops-service/routes/v2.0/stack.rb @@ -18,6 +18,8 @@ module Devops app.get_with_headers "/stack/:stack_id/resources", :headers => [:accept], &Devops::Version2_0::Handler::Stack.resources + app.get_with_headers "/stack/:stack_id/resources/:resource_id", :headers => [:accept], &Devops::Version2_0::Handler::Stack.resource + hash = {} hash['GET'] = Devops::Version2_0::Handler::Stack.get_stack diff --git a/devops-service/tests/stubs/providers/openstack.rb b/devops-service/tests/stubs/providers/openstack.rb index 8c3159f..d6b477d 100644 --- a/devops-service/tests/stubs/providers/openstack.rb +++ b/devops-service/tests/stubs/providers/openstack.rb @@ -71,12 +71,16 @@ class Provider::Openstack true end - def stack_details + def stack_details(stack) {stack_status: 'stubbed'} end - def stack_resources - ['stubbed'] + def stack_resources(stack) + [{'stubbed' => 'stubbed'}] + end + + def stack_resource(stack, resource_id) + {'stubbed' => 'stubbed'} end end \ No newline at end of file