From 344514d08e6a6b09a8428b2a21eceab4fbe482dc Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Mon, 20 Jul 2015 19:59:26 +0400 Subject: [PATCH] current_progress --- .../lib/devops-client/handler/stack_preset.rb | 3 +- .../options/stack_preset_options.rb | 2 ++ .../lib/devops-client/output/stack_preset.rb | 11 +++++-- devops-service/commands/stack.rb | 23 ++++++++++++++ devops-service/db/mongo/models/mongo_model.rb | 1 + devops-service/db/mongo/models/report.rb | 1 + .../db/mongo/models/stack/stack_base.rb | 13 ++++++++ .../routes/v2.0/handlers/stack_preset.rb | 16 ++++++++++ .../sinatra/methods_with_headers.rb | 2 +- devops-service/workers/run_workers.rb | 1 + devops-service/workers/stack_sync_worker.rb | 30 +++++++++++++++++++ 11 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 devops-service/commands/stack.rb create mode 100644 devops-service/workers/stack_sync_worker.rb diff --git a/devops-client/lib/devops-client/handler/stack_preset.rb b/devops-client/lib/devops-client/handler/stack_preset.rb index a6df6d9..b1e9073 100644 --- a/devops-client/lib/devops-client/handler/stack_preset.rb +++ b/devops-client/lib/devops-client/handler/stack_preset.rb @@ -22,6 +22,7 @@ class StackPreset < Handler output when :apply apply_handler + output end end @@ -55,7 +56,7 @@ class StackPreset < Handler filepath = options[:parameters_file] || enter_parameter(I18n.t('handler.stack_preset.create.parameters_file')) params[:parameters] = JSON.parse(File.read(filepath)) - result = post_body("/stack_presets/#{params[:id]}/apply", JSON.pretty_generate(params)) + @list = post_body("/stack_presets/#{params[:id]}/apply", JSON.pretty_generate(params)) end end diff --git a/devops-client/lib/devops-client/options/stack_preset_options.rb b/devops-client/lib/devops-client/options/stack_preset_options.rb index 919e2dc..5475210 100644 --- a/devops-client/lib/devops-client/options/stack_preset_options.rb +++ b/devops-client/lib/devops-client/options/stack_preset_options.rb @@ -19,6 +19,8 @@ class StackPresetOptions < CommonOptions parser.recognize_option_value(:provider, 'stack_preset') parser.recognize_option_value(:stack, 'stack_preset') + parser.recognize_option_value(:project, 'stack_preset') + parser.recognize_option_value(:deploy_env, 'stack_preset') parser.recognize_option_value(:parameters_file, 'stack_preset') end end diff --git a/devops-client/lib/devops-client/output/stack_preset.rb b/devops-client/lib/devops-client/output/stack_preset.rb index 184c944..76c9909 100644 --- a/devops-client/lib/devops-client/output/stack_preset.rb +++ b/devops-client/lib/devops-client/output/stack_preset.rb @@ -3,14 +3,15 @@ require "devops-client/output/base" module Output class StackPreset < Base - def table + def table if outputting_list? title = I18n.t("output.title.stack_preset.list") headers, rows = create_list - create_table headers, rows, title, with_num? else - @data["id"] + "\n" + @data["template_preset_body"] + title = I18n.t("output.title.stack.show", id: @data["id"]) + headers, rows = create_apply end + create_table headers, rows, title, with_num? end def csv @@ -36,5 +37,9 @@ module Output headers_and_rows(@data, fields_to_output) end + def create_apply + headers_and_rows([@data], %w(id deploy_env stack_template cloud_stack_id stack_status)) + end + end end diff --git a/devops-service/commands/stack.rb b/devops-service/commands/stack.rb new file mode 100644 index 0000000..b125d67 --- /dev/null +++ b/devops-service/commands/stack.rb @@ -0,0 +1,23 @@ +module StackCommands + + def sync_stack_till_not_in_progress_proc + lambda do |out, stack, mongo| + begin + 10.times do |i| + sleep 10 + out << "Syncing stack '#{stack.id}'..." + stack.sync_details! + if stack.stack_status != 'CREATE_IN_PROGRESS' + mongo.stack_update(stack) + out << "Stack '#{stack.id}' status is now #{stack.stack_status}" + break + end + end + rescue StandardError => e + logger.error e.message + return 5 + end + end + end + +end diff --git a/devops-service/db/mongo/models/mongo_model.rb b/devops-service/db/mongo/models/mongo_model.rb index 316276a..a32d764 100644 --- a/devops-service/db/mongo/models/mongo_model.rb +++ b/devops-service/db/mongo/models/mongo_model.rb @@ -1,6 +1,7 @@ require "providers/provider_factory" require "db/exceptions/invalid_record" require "json" +require 'db/validators/all' module Devops module Model diff --git a/devops-service/db/mongo/models/report.rb b/devops-service/db/mongo/models/report.rb index b4971f7..dce0489 100644 --- a/devops-service/db/mongo/models/report.rb +++ b/devops-service/db/mongo/models/report.rb @@ -9,6 +9,7 @@ module Devops SERVER_TYPE = 2 BOOTSTRAP_TYPE = 3 PROJECT_TEST_TYPE = 4 + STACK_TYPE = 5 attr_accessor :id, :file, :created_at, :created_by, :project, :deploy_env, :type diff --git a/devops-service/db/mongo/models/stack/stack_base.rb b/devops-service/db/mongo/models/stack/stack_base.rb index 695331f..3ae32c9 100644 --- a/devops-service/db/mongo/models/stack/stack_base.rb +++ b/devops-service/db/mongo/models/stack/stack_base.rb @@ -67,6 +67,18 @@ module Devops Devops::Api2.settings.mongo.stack_template(stack_template).template_body end + def stack_status + raise 'override me' + end + + def stack_statuses + # maybe they differ in different providers, so use method instead of hardcoding + { + in_progress: 'CREATE_IN_PROGRESS', + complete: 'CREATE_COMPLETE' + } + end + class << self attr_accessor :provider @@ -77,6 +89,7 @@ module Devops def create(attrs) model = new(attrs) model.create_stack_in_cloud! + model.sync_details! model end diff --git a/devops-service/routes/v2.0/handlers/stack_preset.rb b/devops-service/routes/v2.0/handlers/stack_preset.rb index 1b16e13..106d638 100644 --- a/devops-service/routes/v2.0/handlers/stack_preset.rb +++ b/devops-service/routes/v2.0/handlers/stack_preset.rb @@ -1,5 +1,6 @@ require 'json' require 'lib/stack_presets/factory' +require 'workers/stack_sync_worker' module Devops module Version2_0 @@ -30,6 +31,21 @@ module Devops stack = preset.create_stack_from_preset(attrs) settings.mongo.stack_insert(stack) + + jid = StackSyncWorker.perform_async( + DevopsConfig[:report_dir_v2], + stack.id, + request.env['REMOTE_USER'], # owner + DevopsConfig.config + ) + Worker.set_status jid, Worker::STATUS::IN_QUEUE + logger.info "Job '#{jid}' has been started" + uri = URI.parse(request.url) + uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid + file = uri.to_s + + puts "Syncing report is located here: #{file}" + create_response 'Created', stack.to_hash, 201 } end diff --git a/devops-service/sinatra/methods_with_headers.rb b/devops-service/sinatra/methods_with_headers.rb index 1a36622..aeafdf9 100644 --- a/devops-service/sinatra/methods_with_headers.rb +++ b/devops-service/sinatra/methods_with_headers.rb @@ -101,7 +101,7 @@ module Sinatra # Can client works with JSON? def accept_json types = request.accept_media_types - unless types.include?('application/json')# or types.include?("*/*") + unless types.include?('application/json') or types.include?("*/*") response.headers['Accept'] = 'application/json' halt_response("Accept header should contains 'application/json' type", 406) end diff --git a/devops-service/workers/run_workers.rb b/devops-service/workers/run_workers.rb index bdf8c59..7bd89d8 100644 --- a/devops-service/workers/run_workers.rb +++ b/devops-service/workers/run_workers.rb @@ -4,6 +4,7 @@ require File.join(root, "create_server_worker") require File.join(root, "deploy_worker") require File.join(root, "bootstrap_worker") require File.join(root, "project_test_worker") +require File.join(root, "stack_sync_worker") config = {} #require File.join(root, "../proxy") diff --git a/devops-service/workers/stack_sync_worker.rb b/devops-service/workers/stack_sync_worker.rb new file mode 100644 index 0000000..de60193 --- /dev/null +++ b/devops-service/workers/stack_sync_worker.rb @@ -0,0 +1,30 @@ +#root = File.join(File.dirname(__FILE__), "..") +#$LOAD_PATH.push root unless $LOAD_PATH.include? root + +# require File.join(File.dirname(__FILE__), "workers") +require "providers/provider_factory" +require "commands/stack" +require "db/mongo/models/stack/stack_factory" +require "db/mongo/models/report" + +class StackSyncWorker < Worker + include StackCommands + + def perform(dir, stack_id, owner, conf) + call(conf, nil, dir) do |mongo, useless, out, file| + stack = mongo.stack(stack_id) + o = { + "file" => file, + "_id" => jid, + "created_by" => owner, + "project" => stack.project, + "deploy_env" => stack.deploy_env, + "type" => Report::STACK_TYPE + } + mongo.save_report(Report.new(o)) + + status = sync_stack_till_not_in_progress_proc.call(out, stack, mongo) + status + end + end +end