diff --git a/devops-client/lib/devops-client/handler/stack_template_preset.rb b/devops-client/lib/devops-client/handler/stack_template_preset.rb index a6811cf..674284e 100644 --- a/devops-client/lib/devops-client/handler/stack_template_preset.rb +++ b/devops-client/lib/devops-client/handler/stack_template_preset.rb @@ -46,19 +46,15 @@ class StackTemplatePreset < Handler abort(wrong_params) end - preset = @args[2] - provider = options[:provider] || resources_selector.select_available_provider - stack_template_id_to_create = options[:stack_template] || enter_parameter(I18n.t('handler.stack_template_preset.create.stack_template')) - parameters = options[:parameters] || enter_hash(I18n.t('handler.stack_template_preset.create.parameters')) + params = {} + params[:id] = @args[2] + params[:provider] = options[:provider] || resources_selector.select_available_provider + params[:stack] = options[:stack] || enter_parameter(I18n.t('handler.stack_template_preset.create.stack')) - params = { - id: preset, - provider: provider, - stack_template: stack_template_id_to_create, - parameters: parameters - } + filepath = options[:parameters_file] || enter_parameter(I18n.t('handler.stack_template_preset.create.parameters_file')) + params[:parameters] = JSON.parse(File.read(filepath)) - result = post_body("/stack_template_presets/#{preset}/build_stack_template", JSON.pretty_generate(params)) + result = post_body("/stack_template_presets/#{params[:id]}/build_stack_template", JSON.pretty_generate(params)) end end diff --git a/devops-client/lib/devops-client/options/stack_template_preset_options.rb b/devops-client/lib/devops-client/options/stack_template_preset_options.rb index ad52987..237503d 100644 --- a/devops-client/lib/devops-client/options/stack_template_preset_options.rb +++ b/devops-client/lib/devops-client/options/stack_template_preset_options.rb @@ -17,18 +17,9 @@ class StackTemplatePresetOptions < CommonOptions self.options do |parser, options| parser.banner << self.build_banner - parser.recognize_option_value(:provider, 'stack') - parser.recognize_option_value(:stack_template, 'stack') - - parser.recognize_option_value(:parameters, 'stack') do |parameters| - begin - hash = JSON.parse(parameters) - options[:parameters] = hash - rescue JSON::ParserError - raise ArgumentError.new('Should be proper JSON string') - end - end - + parser.recognize_option_value(:provider, 'stack_template_preset') + parser.recognize_option_value(:stack, 'stack_template_preset') + parser.recognize_option_value(:parameters_file, 'stack_template_preset') end end diff --git a/devops-client/locales/en.yml b/devops-client/locales/en.yml index 931114f..f121224 100644 --- a/devops-client/locales/en.yml +++ b/devops-client/locales/en.yml @@ -120,7 +120,7 @@ en: delete: "Are you sure to delete stack '%{name}'?" stack_template_preset: create: - parameters: Parameters hash as single quoted JSON string + parameters_file: 'Path to file with JSON parameters: ' stack_template: 'Name of stack template to build: ' message: choose_list_default: "Choose %{name} (comma separated), like 1,2,3 or empty for default value '%{default}': " @@ -377,5 +377,9 @@ en: provider: Stack template provider id: Stack template id template_file: Stack template file + stack_template_preset: + parameters_file: Path to file with JSON parameters + stack: 'Name of stack to build: ' + provider: Stack provider user: new_password: New user password diff --git a/devops-service/db/mongo/models/stack/stack_base.rb b/devops-service/db/mongo/models/stack/stack_base.rb index 94dd3f2..9817613 100644 --- a/devops-service/db/mongo/models/stack/stack_base.rb +++ b/devops-service/db/mongo/models/stack/stack_base.rb @@ -2,13 +2,14 @@ module Devops module Model class StackBase < MongoModel - attr_accessor :id, :project, :deploy_env, :stack_template, :cloud_stack_id, :provider, :parameters + attr_accessor :id, :project, :deploy_env, :stack_template, :cloud_stack_id, :provider, :parameters, :template_body types id: {type: String, empty: false}, provider: {type: String, empty: false}, - project: {type: String, empty: false}, - deploy_env: {type: String, empty: false}, - stack_template: {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} # cloud_stack_id: {type: String, empty: true} # TODO: add parameters Hash @@ -18,7 +19,8 @@ module Devops self.project = attrs['project'] self.deploy_env = attrs['deploy_env'] self.stack_template = attrs['stack_template'] - self.cloud_stack_id = attrs['cloud_stack_id'] + self.template_body = attrs['template_body'] + # self.cloud_stack_id = attrs['cloud_stack_id'] self.parameters = attrs['parameters'] self end @@ -59,9 +61,11 @@ 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 - stack_template_model = DevopsService.mongo.stack_template(stack_template) - stack_template_model.template_body + @template_body ||= DevopsService.mongo.stack_template(stack_template).template_body end end diff --git a/devops-service/devops_config.rb b/devops-service/devops_config.rb index d019548..53b0c13 100644 --- a/devops-service/devops_config.rb +++ b/devops-service/devops_config.rb @@ -9,7 +9,7 @@ class DevopsConfig class << self def read config_file=nil if config_file.nil? - config_file = ENV["CONFIG"] || File.join(File.dirname(__FILE__), "config.rb") + config_file = ENV['DEVOPS_CONFIG'] || ENV['CONFIG'] || File.join(File.dirname(__FILE__), 'config.rb') end config = {:url_prefix => ""} if File.exists? config_file diff --git a/devops-service/lib/stack_template_presets/base.rb b/devops-service/lib/stack_template_presets/base.rb index 8f959c6..d637121 100644 --- a/devops-service/lib/stack_template_presets/base.rb +++ b/devops-service/lib/stack_template_presets/base.rb @@ -13,92 +13,23 @@ module Devops {id: id, template_preset_body: template_preset_body} end - def build_template_from_preset(provider, stack_template_id, template_attrs) - stack_template_attrs = { - 'id' => stack_template_id, + def create_stack_from_preset(provider, stack_id, parameters) + stack_attrs = { + 'id' => stack_id, 'provider' => provider, - 'template_body' => serialize(actual_template_hash(template_attrs)) + 'parameters' => parameters, + 'template_body' => template_preset_body } - template_model = Model::StackTemplateFactory.create(provider, stack_template_attrs) + Model::StackFactory.create(provider, stack_attrs) end def template_preset_body - @template_preset_body ||= begin - file_name = File.join("lib/stack_template_presets/#{id}.#{template_file_extension}") - File.read(file_name) - end - end - - - private - - def template_preset_hash - unserialize(template_preset_body) - end - - def actual_template_hash(template_attrs) - actual = template_preset_hash.dup - template_attrs.each do |key, value| - path = param_attrs_pathes_in_preset[key.to_s] - next unless path - insert_value_at(actual, value, path) - end - actual - end - - # returns hash with keys lists. Better to show an example: - # Imagine tha t template is the following: - # { - # template: { - # users_count: %users_count% - # } - # } - # - # So param_attrs_pathes_in_preset will be - # {users_count: [:template, :users_count]} - def param_attrs_pathes_in_preset - {} - end - - # given hash = {t: {a: nil}}, value = 1, path = [:t, :a] returns - # {t: {a: 1}} - def insert_value_at(hash, value, path) - current = hash - path.each_with_index do |key, i| - if i == path.size - 1 - current[key] = value - else - current = current[key] - end - end - hash + file_name = File.join("lib/stack_template_presets/#{id}.#{template_file_extension}") + File.read(file_name) end # some templates may be YAML files def template_file_extension - serialization_strategy.to_s - end - - # some templates may be YAML files - def serialize(hash) - case serialization_strategy - when :json - hash.to_json - else - raise - end - end - - def unserialize(text) - case serialization_strategy - when :json - JSON.parse(text) - else - raise - end - end - - def serialization_strategy :json end diff --git a/devops-service/lib/stack_template_presets/postgres_cluster.json b/devops-service/lib/stack_template_presets/postgres_cluster.json deleted file mode 100644 index 4a2e98f..0000000 --- a/devops-service/lib/stack_template_presets/postgres_cluster.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "template": { - "users_count": null - } -} diff --git a/devops-service/lib/stack_template_presets/postgres_cluster.rb b/devops-service/lib/stack_template_presets/postgres_cluster.rb index fec48ca..9f55456 100644 --- a/devops-service/lib/stack_template_presets/postgres_cluster.rb +++ b/devops-service/lib/stack_template_presets/postgres_cluster.rb @@ -1,9 +1,7 @@ module Devops::StackTemplatePresets class PostgresCluster < Base - def param_attrs_pathes_in_preset - { - 'users_count' => %w(template users_count) - } + def template_file_extension + :yml end end end \ No newline at end of file diff --git a/devops-service/lib/stack_template_presets/postgres_cluster.yml b/devops-service/lib/stack_template_presets/postgres_cluster.yml new file mode 100644 index 0000000..7f97c80 --- /dev/null +++ b/devops-service/lib/stack_template_presets/postgres_cluster.yml @@ -0,0 +1,17 @@ +heat_template_version: 2013-05-23 + +description: Simple template to deploy a single compute instance + +parameters: + key_name: + type: string + label: Key Name + description: Name of key-pair to be used for compute instance + +resources: + my_instance: + type: OS::Nova::Server + properties: + key_name: { get_param: key_name } + image: 227f4be7-be1c-498d-ab88-54f8b5df249f + flavor: m1.small \ No newline at end of file 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 5082102..766e23b 100644 --- a/devops-service/routes/v2.0/handlers/stack_template_preset.rb +++ b/devops-service/routes/v2.0/handlers/stack_template_preset.rb @@ -27,13 +27,12 @@ module Devops attrs = create_object_from_json_body - provider, stack_template, parameters = attrs.fetch('provider'), attrs.fetch('stack_template'), attrs.fetch('parameters') + provider, stack_id, parameters = attrs.fetch('provider'), attrs.fetch('stack'), attrs.fetch('parameters') preset = Devops::StackTemplatePresetsFactory.get(attrs.fetch('id')) - template_model = preset.build_template_from_preset(provider, stack_template, parameters) + stack = preset.create_stack_from_preset(provider, stack_id, parameters) - settings.mongo.stack_template_insert(template_model) - create_response 'Created', template_model.to_hash, 201 + create_response 'Created', stack.to_hash, 201 } end