diff --git a/devops-client/lib/devops-client/handler/stack_template.rb b/devops-client/lib/devops-client/handler/stack_template.rb index d1754c4..949afe6 100644 --- a/devops-client/lib/devops-client/handler/stack_template.rb +++ b/devops-client/lib/devops-client/handler/stack_template.rb @@ -28,6 +28,8 @@ class StackTemplate < Handler delete_handler when :update_url update_url_handler + when :update_available_parameters + update_available_parameters_handler end end @@ -87,6 +89,16 @@ class StackTemplate < Handler puts stack_template['template_url'] end + def update_available_parameters_handler + r = inspect_parameters @options_parser.update_url_params, @args[2] + unless r.nil? + @options_parser.invalid_update_url_command + abort(r) + end + stack_template = post "/stack_template/#{@args[2]}/update_available_parameters" + puts JSON.pretty_generate(stack_template['available_parameters']) + end + def provider_stack_templates(provider) if Providers.has_functionality?(provider, :stack_templates) @provider = true diff --git a/devops-client/lib/devops-client/options/stack_template_options.rb b/devops-client/lib/devops-client/options/stack_template_options.rb index 3da56a9..6f2fb08 100644 --- a/devops-client/lib/devops-client/options/stack_template_options.rb +++ b/devops-client/lib/devops-client/options/stack_template_options.rb @@ -2,7 +2,7 @@ require "devops-client/options/common_options" class StackTemplateOptions < CommonOptions - commands :create, :delete, :list, :show, :update_url + commands :create, :delete, :list, :show, :update_url, :update_available_parameters def initialize args, def_options super(args, def_options) @@ -12,6 +12,7 @@ class StackTemplateOptions < CommonOptions self.show_params = ["STACK_TEMPLATE"] self.delete_params = ["STACK_TEMPLATE"] self.update_url_params = ["STACK_TEMPLATE"] + self.update_available_parameters_params = ["STACK_TEMPLATE"] end def create_options diff --git a/devops-client/lib/devops-client/output/stack_template.rb b/devops-client/lib/devops-client/output/stack_template.rb index 8c99dab..4a2c9ab 100644 --- a/devops-client/lib/devops-client/output/stack_template.rb +++ b/devops-client/lib/devops-client/output/stack_template.rb @@ -43,12 +43,11 @@ module Output end def create_show - rows = [ [ @data["id"], @data["provider"], @data["template_url"], @data["template_body"] ] ] + rows = [ [ @data["id"], @data["provider"], @data["template_url"] ] ] headers = [ I18n.t("output.table_header.id"), I18n.t("output.table_header.provider"), - I18n.t("output.table_header.template_url"), - I18n.t("output.table_header.template_body") + I18n.t("output.table_header.template_url") ] return headers, rows end diff --git a/devops-service/app/api2/handlers/stack_template.rb b/devops-service/app/api2/handlers/stack_template.rb index ecb28a2..fe134a8 100644 --- a/devops-service/app/api2/handlers/stack_template.rb +++ b/devops-service/app/api2/handlers/stack_template.rb @@ -47,6 +47,13 @@ module Devops template end + def update_available_parameters(id) + template = Devops::Db.connector.stack_template(id) + template.available_parameters = template.parse_parameters + Devops::Db.connector.stack_template_update(template) + template + end + private # returns: diff --git a/devops-service/app/api2/routes/stack_template.rb b/devops-service/app/api2/routes/stack_template.rb index 1b18fd9..5a46f01 100644 --- a/devops-service/app/api2/routes/stack_template.rb +++ b/devops-service/app/api2/routes/stack_template.rb @@ -22,11 +22,18 @@ module Devops create_response 'Created', model.to_hash, 201 end + # Temp route just to process migration. Could be deleted safely app.post_with_headers "/stack_template/:id/update_template_url", :headers => [:accept] do |template_id| check_privileges('stack_template', 'w') json Devops::API2_0::Handler::StackTemplate.new(request).update_template_url(template_id).to_hash end + # Temp route just to process migration + app.post_with_headers "/stack_template/:id/update_available_parameters", :headers => [:accept] do |template_id| + check_privileges('stack_template', 'w') + json Devops::API2_0::Handler::StackTemplate.new(request).update_available_parameters(template_id).to_hash + end + hash = {} hash['GET'] = lambda {|stack_template_id| diff --git a/devops-service/db/mongo/models/stack_template/stack_template_base.rb b/devops-service/db/mongo/models/stack_template/stack_template_base.rb index 58ebc2c..e79419d 100644 --- a/devops-service/db/mongo/models/stack_template/stack_template_base.rb +++ b/devops-service/db/mongo/models/stack_template/stack_template_base.rb @@ -1,5 +1,3 @@ -require 'tempfile' -require 'securerandom' require "db/mongo/models/model_with_provider" require "db/validators/stack_template/template_content" @@ -10,6 +8,8 @@ module Devops include ModelWithProvider attr_accessor :id, :template_body, :provider, :owner + # should be a hash like {'param_name' => {type: 'String', description: 'Description'}} + attr_accessor :available_parameters types id: {type: String, empty: false}, provider: {type: String, empty: false}, @@ -40,23 +40,31 @@ module Devops self.template_body = attrs['template_body'] self.provider = attrs['provider'] self.owner = attrs['owner'] + self.available_parameters = attrs['available_parameters'] self end def to_hash_without_id { - provider: provider, - template_body: template_body, - owner: owner + 'provider' => provider, + 'template_body' => template_body, + 'owner' => owner, + 'available_parameters' => available_parameters } end + def parse_parameters + {} + end + # attrs should include: # - id (String) # - provider (String) # - template_body (String) def self.create(attrs) - new(attrs) + template = new(attrs) + template.available_parameters = template.parse_parameters + template end def self.build_from_bson(attrs) diff --git a/devops-service/db/mongo/models/stack_template/stack_template_ec2.rb b/devops-service/db/mongo/models/stack_template/stack_template_ec2.rb index 4cd52f3..590160a 100644 --- a/devops-service/db/mongo/models/stack_template/stack_template_ec2.rb +++ b/devops-service/db/mongo/models/stack_template/stack_template_ec2.rb @@ -1,3 +1,5 @@ +require 'securerandom' + module Devops module Model class StackTemplateEc2 < StackTemplateBase @@ -5,8 +7,6 @@ module Devops # In Amazon Cloudformation the template file must be stored on an Amazon S3 bucket. attr_accessor :template_url - # types template_url: {type: String, empty: false} - def initialize(attrs) self.template_url = attrs['template_url'] super(attrs) @@ -17,7 +17,23 @@ module Devops end def update_template_url - self.template_url = generate_template_file_and_upload_to_storage(id, template_body) + uniq_filename = "#{id}-#{SecureRandom.hex}.template" + s3_file = provider_instance.store_stack_template(uniq_filename, template_body) + self.template_url = s3_file['url'] + end + + def parse_parameters + template_hash = JSON.parse(template_body) + return {} unless template_hash['Parameters'] + + parameters = {} + template_hash['Parameters'].each do |param_name, param_info| + # use String always for now + parameters[param_name] = {'type' => 'String', 'description' => param_info['Description']} + end + parameters + rescue + {} end class << self @@ -28,13 +44,6 @@ module Devops end end - private - - def generate_template_file_and_upload_to_storage(id, json) - uniq_filename = "#{id}-#{SecureRandom.hex}.template" - provider_instance.store_stack_template(uniq_filename, json)['url'] - end - end end end diff --git a/devops-service/spec/models/stack_template/shared_stack_template_specs.rb b/devops-service/spec/models/stack_template/shared_stack_template_specs.rb index e8c1dc4..5228a6e 100644 --- a/devops-service/spec/models/stack_template/shared_stack_template_specs.rb +++ b/devops-service/spec/models/stack_template/shared_stack_template_specs.rb @@ -14,7 +14,7 @@ RSpec.shared_examples 'stack template' do describe '#to_hash_without_id' do it 'returns hash with provider, template_body and owner' do - expect(stack_template.to_hash_without_id).to include(:provider, :template_body, :owner) + expect(stack_template.to_hash_without_id).to include('provider', 'template_body', 'owner') end end diff --git a/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb b/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb index b94506f..546eac1 100644 --- a/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb +++ b/devops-service/spec/models/stack_template/stack_template_ec2_spec.rb @@ -25,4 +25,38 @@ RSpec.describe Devops::Model::StackTemplateEc2, type: :model do expect(result.template_url).to eq 'template_url' end + describe 'available parameters fetching' do + let(:template_body) { %q( + { + "Description" : "Example", + + "Parameters" : { + "KeyName": { + "Description" : "Name of KeyPair", + "Type": "AWS::EC2::KeyPair::KeyName" + }, + "SSHLocation" : { + "Type": "String", + "MinLength": "9" + } + } + } + + ) } + let(:template_attributes) { FactoryGirl.attributes_for(:stack_template_ec2, template_body: template_body) } + let(:template) { described_class.create(template_attributes.stringify_keys) } + + it 'fetches parameters from template body' do + expect(template.available_parameters).to be_a(Hash) + expect(template.available_parameters).to include('KeyName', 'SSHLocation') + end + + it 'parses description' do + expect(template.available_parameters['KeyName']['description']).to eq 'Name of KeyPair' + expect(template.available_parameters['SSHLocation']['description']).to be nil + end + end + + + end \ No newline at end of file