diff --git a/devops-service/db/mongo/connectors/report.rb b/devops-service/db/mongo/connectors/report.rb index 0a8d449..0f9d5c0 100644 --- a/devops-service/db/mongo/connectors/report.rb +++ b/devops-service/db/mongo/connectors/report.rb @@ -3,6 +3,7 @@ require "date" module Connectors class Report < Base include Helpers::ShowCommand, + Helpers::UpdateCommand, Helpers::ListCommand def initialize(db) diff --git a/devops-service/db/mongo/mongo_connector.rb b/devops-service/db/mongo/mongo_connector.rb index 60deaa7..cc44133 100644 --- a/devops-service/db/mongo/mongo_connector.rb +++ b/devops-service/db/mongo/mongo_connector.rb @@ -31,7 +31,7 @@ class MongoConnector [:user_auth, :user, :users, :users_names, :user_insert, :user_delete, :user_update, :create_root_user, :check_user_privileges] => :users_connector, [:keys, :key, :key_insert, :key_delete] => :keys_connector, - [:save_report, :report, :reports, :set_report_status, :set_report_server_data, :add_report_subreports] => :reports_connector, + [:save_report, :report_update, :report, :reports, :set_report_status, :set_report_server_data, :add_report_subreports] => :reports_connector, [:insert_statistic, :search_statistic] => :statistics_connector, [:provider_accounts, :provider_account_insert, :provider_account_delete, :provider_account] => :provider_accounts_connector ) diff --git a/devops-service/spec/workers/stack_bootstrap_worker_spec.rb b/devops-service/spec/workers/stack_bootstrap_worker_spec.rb index b2ede82..2724095 100644 --- a/devops-service/spec/workers/stack_bootstrap_worker_spec.rb +++ b/devops-service/spec/workers/stack_bootstrap_worker_spec.rb @@ -15,12 +15,15 @@ RSpec.describe StackBootstrapWorker, type: :worker, stubbed_connector: true do before do allow(Provider::ProviderFactory).to receive(:providers).and_return(%w(ec2)) allow(stubbed_connector).to receive(:save_report) + allow(stubbed_connector).to receive(:report) { build(:report) } + allow(stubbed_connector).to receive(:report_update) allow(stubbed_connector).to receive(:stack_insert) allow(worker).to receive(:stack_synchronizer) { stack_synchronizer } allow(worker).to receive(:stack_servers_bootstrapper) { stack_servers_bootstrapper } allow(worker).to receive(:stack_servers_persister) { stack_servers_persister } - allow(worker).to receive(:call).and_yield(out, file) + allow(worker).to receive(:call).and_yield + worker.out = out allow(Devops::Model::StackEc2).to receive(:create) { Devops::Model::StackEc2.new(stack_attrs) } end @@ -31,14 +34,14 @@ RSpec.describe StackBootstrapWorker, type: :worker, stubbed_connector: true do }.to raise_error KeyError end - it 'saves report about operation' do - expect(stubbed_connector).to receive(:save_report).with(instance_of(Devops::Model::Report)) + it 'updates report about operation' do + expect(stubbed_connector).to receive(:report_update).with(instance_of(Devops::Model::Report)) perform_without_bootstrap end - it 'saves report about operation, creates stack and persists stack servers' do + it 'updates report about operation, creates stack and persists stack servers' do allow(worker).to receive(:create_stack).and_call_original - expect(stubbed_connector).to receive(:save_report).with(instance_of(Devops::Model::Report)).ordered + expect(stubbed_connector).to receive(:report_update).with(instance_of(Devops::Model::Report)).ordered expect(worker).to receive(:create_stack).ordered expect(stack_servers_persister).to receive(:persist).ordered perform_without_bootstrap diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index 001f0d2..1e40e05 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -6,24 +6,18 @@ require "db/mongo/models/report" class BootstrapWorker < Worker + # options must contain 'server_attrs', 'owner' def perform(options) - server_attrs = options.fetch('server_attrs') -# bootstrap_template = options.fetch('bootstrap_template') - owner = options.fetch('owner') - options = convert_config(options) + call do + owner = options.fetch('owner') + converted_options = convert_config(options) - call() do |out, file| - server = Devops::Model::Server.new(server_attrs) - report = save_report(file, owner, server) + server = Devops::Model::Server.new(options.fetch('server_attrs')) + report = save_report(owner, server) -=begin - options = { - bootstrap_template: bootstrap_template - } -=end executor = Devops::Executor::ServerExecutor.new(server, out, current_user: owner) executor.report = report - status = executor.two_phase_bootstrap(options) + status = executor.two_phase_bootstrap(converted_options) mongo.set_report_server_data(jid, server.chef_node_name, server.public_ip || server.private_ip) status end @@ -31,18 +25,19 @@ class BootstrapWorker < Worker private - def save_report(file, owner, server) - report_data = { - "file" => file, - "_id" => jid, + def save_report(owner, server) + update_report( "created_by" => owner, "project" => server.project, "deploy_env" => server.deploy_env, "type" => Devops::Model::Report::BOOTSTRAP_TYPE - } - report = Devops::Model::Report.new(report_data) - mongo.save_report(report) - report + ) + end + + def convert_config conf + config = {} + conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v} + config end end diff --git a/devops-service/workers/create_server_worker.rb b/devops-service/workers/create_server_worker.rb index bc2655a..78c0e59 100644 --- a/devops-service/workers/create_server_worker.rb +++ b/devops-service/workers/create_server_worker.rb @@ -6,14 +6,15 @@ require "lib/executors/server_executor" class CreateServerWorker < Worker + # options must contain 'server_attrs', 'owner' def perform(options) - server_attrs = options.fetch('server_attrs') - owner = options.fetch('owner') + call do + server_attrs = options.fetch('server_attrs') + owner = options.fetch('owner') - call() do |out, file| project = mongo.project(server_attrs["project"]) env = project.deploy_env(server_attrs["deploy_env"]) - report = save_report(file, project, env, owner) + report = save_report(project, env, owner) e = Devops::Executor::ServerExecutor.new(nil, out) e.project = project @@ -26,18 +27,13 @@ class CreateServerWorker < Worker private - def save_report(file, project, env, owner) - report_data = { - "file" => file, - "_id" => jid, + def save_report(project, env, owner) + update_report( "created_by" => owner, "project" => project.id, "deploy_env" => env.identifier, "type" => Devops::Model::Report::SERVER_TYPE - } - report = Devops::Model::Report.new(report_data) - mongo.save_report(report) - report + ) end end diff --git a/devops-service/workers/delete_server_worker.rb b/devops-service/workers/delete_server_worker.rb index 77f3e5c..937f00f 100644 --- a/devops-service/workers/delete_server_worker.rb +++ b/devops-service/workers/delete_server_worker.rb @@ -5,15 +5,14 @@ require "workers/worker" class DeleteServerWorker < Worker - # options should contain 'server_id' + # options must contain 'server_id', 'current_user' def perform(options) - server_id = options.fetch('server_id') - current_user = options.fetch('current_user') + call do + server_id = options.fetch('server_id') - call() do |out, file| out.puts "Deleting server with id #{server_id}" and out.flush @server = mongo.server_by_instance_id(server_id) - report = save_report(file, current_user) + report = save_report(options.fetch('current_user')) e = Devops::Executor::ServerExecutor.new(@server, out) e.report = report @@ -23,17 +22,13 @@ class DeleteServerWorker < Worker private - def save_report(file, current_user) - report = Devops::Model::Report.new( - "file" => file, - "_id" => jid, + def save_report(current_user) + update_report( "created_by" => current_user, "project" => @server.project, "deploy_env" => @server.deploy_env, "type" => Devops::Model::Report::DELETE_SERVER_TYPE ) - mongo.save_report(report) - report end end diff --git a/devops-service/workers/deploy_worker.rb b/devops-service/workers/deploy_worker.rb index b6e48d0..791c86d 100644 --- a/devops-service/workers/deploy_worker.rb +++ b/devops-service/workers/deploy_worker.rb @@ -6,15 +6,16 @@ require "db/mongo/models/report" class DeployWorker < Worker + # options must contain 'server_attrs', 'owner', 'tags', 'deploy_info' def perform(options) - server_attrs = options.fetch('server_attrs') - owner = options.fetch('owner') - tags = options.fetch('tags') - deploy_info = options.fetch('deploy_info') + call do + server_attrs = options.fetch('server_attrs') + owner = options.fetch('owner') + tags = options.fetch('tags') + deploy_info = options.fetch('deploy_info') - call() do |out, file| server = Devops::Model::Server.new(server_attrs) - report = save_report(file, owner, server) + report = save_report(owner, server) executor = Devops::Executor::ServerExecutor.new(server, out, current_user: owner) executor.report = report @@ -24,14 +25,11 @@ class DeployWorker < Worker private - def save_report(file, owner, server) + def save_report(owner, server) report_data = { - "file" => file, - "_id" => jid, "created_by" => owner, "project" => server.project, "deploy_env" => server.deploy_env, - "status" => STATUS::RUNNING, "chef_node_name" => server.chef_node_name, "host" => server.public_ip || server.private_ip } @@ -41,9 +39,7 @@ class DeployWorker < Worker report_data["type"] = Devops::Model::Report::DEPLOY_STACK_TYPE report_data["stack"] = server.stack end - report = Devops::Model::Report.new(report_data) - mongo.save_report(report) - report + update_report(report_data) end end diff --git a/devops-service/workers/project_test_worker.rb b/devops-service/workers/project_test_worker.rb index 760b06c..2d604a7 100644 --- a/devops-service/workers/project_test_worker.rb +++ b/devops-service/workers/project_test_worker.rb @@ -11,15 +11,15 @@ class ProjectTestWorker < Worker include StatusCommands def perform(params) - user = params.fetch('user') - project_name = params.fetch('project') - deploy_env_name = params.fetch('deploy_env') + call do + user = params.fetch('user') + project_name = params.fetch('project') + deploy_env_name = params.fetch('deploy_env') - call() do |out, file| DevopsLogger.logger.info "Test project '#{project_name}' and env '#{deploy_env_name}' (user - #{user})" project = mongo.project(project_name) env = project.deploy_env(deploy_env_name) - report = save_report(file, user, project_name, deploy_env_name) + report = save_report(user, project_name, deploy_env_name) executor = Devops::Executor::ServerExecutor.new(nil, out) executor.project = project @@ -102,17 +102,12 @@ class ProjectTestWorker < Worker private - def save_report(file, user, project_name, deploy_env_name) - report_data = { - "file" => file, - "_id" => jid, + def save_report(user, project_name, deploy_env_name) + update_report( "created_by" => user, "project" => project_name, "deploy_env" => deploy_env_name, "type" => Devops::Model::Report::PROJECT_TEST_TYPE - } - report = Devops::Model::Report.new(report_data) - mongo.save_report(report) - report + ) end end diff --git a/devops-service/workers/stack_bootstrap_worker.rb b/devops-service/workers/stack_bootstrap_worker.rb index 51e8b0a..3d1f3fb 100644 --- a/devops-service/workers/stack_bootstrap_worker.rb +++ b/devops-service/workers/stack_bootstrap_worker.rb @@ -9,15 +9,15 @@ require "workers/stack_bootstrap/errors" class StackBootstrapWorker < Worker + # options must contain 'stack_attributes' def perform(options) - stack_attrs = options.fetch('stack_attributes') + call do + stack_attrs = options.fetch('stack_attributes') - call() do |out, file| - @out = out without_bootstrap = stack_attrs.delete('without_bootstrap') @out.puts "Received 'without_bootstrap' option" if without_bootstrap - save_report(file, stack_attrs) + save_report(stack_attrs) begin @stack = create_stack(stack_attrs) @@ -99,10 +99,8 @@ class StackBootstrapWorker < Worker puts_and_flush "Rollback has been completed" end - def save_report(file, stack_attrs) - report = ::Devops::Model::Report.new( - "file" => file, - "_id" => jid, + def save_report(stack_attrs) + update_report( "created_by" => stack_attrs['owner'], "project" => stack_attrs["project"], "deploy_env" => stack_attrs["deploy_env"], @@ -110,7 +108,5 @@ class StackBootstrapWorker < Worker "subreports" => [], "stack" => stack_attrs['name'] ) - mongo.save_report(report) - report end end diff --git a/devops-service/workers/worker.rb b/devops-service/workers/worker.rb index c7daada..ade61e8 100644 --- a/devops-service/workers/worker.rb +++ b/devops-service/workers/worker.rb @@ -83,15 +83,16 @@ class Worker def call_async() dir = DevopsConfig[:report_dir_v2] # directory is created on server start in config.ru - file = File.join(dir, jid) + @file = File.join(dir, jid) + create_report update_job_status(STATUS::INIT, nil) - File.open(file, "w") do |out| + File.open(@file, "w") do |out| begin update_job_status(STATUS::RUNNING, nil) self.out = out - job_result = yield(out, file) + job_result = yield canonical_status = (job_result == 0 ? STATUS::COMPLETED : STATUS::FAILED) update_job_status(canonical_status, job_result) rescue StandardError, RecordNotFound => e @@ -125,10 +126,16 @@ class Worker status end - def convert_config conf - config = {} - conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v} - config + def create_report + report = Devops::Model::Report.new('_id' => jid, 'file' => @file) + mongo.save_report(report) end + def update_report(additional_report_attrs) + initial_report = mongo.report(jid) + report_attrs = initial_report.to_mongo_hash.merge(additional_report_attrs) + report = Devops::Model::Report.new(report_attrs) + mongo.report_update(report) + report + end end