From a2d9e57d09200a861b874bf4ef91089e22c0326a Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Mon, 23 Nov 2015 17:21:43 +0300 Subject: [PATCH] #648: store last server operation as subhash --- devops-service/app/api2/handlers/deploy.rb | 2 +- devops-service/app/api2/handlers/project.rb | 2 +- devops-service/app/api2/handlers/server.rb | 14 ++++++------- devops-service/app/api2/handlers/stack.rb | 2 +- devops-service/db/mongo/models/server.rb | 21 ++++++++++--------- .../lib/executors/server_executor.rb | 15 +++++++------ devops-service/spec/factories/server.rb | 3 +-- devops-service/spec/models/server_spec.rb | 18 ++++++++-------- devops-service/workers/bootstrap_worker.rb | 2 +- devops-service/workers/deploy_worker.rb | 2 +- 10 files changed, 42 insertions(+), 39 deletions(-) diff --git a/devops-service/app/api2/handlers/deploy.rb b/devops-service/app/api2/handlers/deploy.rb index acaf5b1..b0e3045 100644 --- a/devops-service/app/api2/handlers/deploy.rb +++ b/devops-service/app/api2/handlers/deploy.rb @@ -85,7 +85,7 @@ module Devops begin deploy_info = create_deploy_info(s, project, body["build_number"]) deploy_info["run_list"] = run_list if run_list - res = Devops::Executor::ServerExecutor.new(s, out).deploy_server_with_tags(tags, deploy_info) + res = Devops::Executor::ServerExecutor.new(s, out, current_user: owner).deploy_server_with_tags(tags, deploy_info) status.push(res) rescue DeployInfoError => e msg = "Can not get deploy info: " + e.message diff --git a/devops-service/app/api2/handlers/project.rb b/devops-service/app/api2/handlers/project.rb index c771eae..3e36bb9 100644 --- a/devops-service/app/api2/handlers/project.rb +++ b/devops-service/app/api2/handlers/project.rb @@ -225,7 +225,7 @@ module Devops # мы не можем указать один build_number для всех окружений, поэтому nil deploy_info_buf[s.deploy_env] = project.deploy_info(deploy_env_model, nil) end - status.push(Devops::Executor::ServerExecutor.new(s, out).deploy_server(deploy_info)) + status.push(Devops::Executor::ServerExecutor.new(s, out, current_user: parser.current_user).deploy_server(deploy_info)) end status end diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index 448ec1e..6b35d72 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -120,7 +120,7 @@ module Devops provider = s.provider_instance r = provider.pause_server s if r.nil? - set_last_operation_type_and_save(s, Devops::Model::Server::OperationType::PAUSE) + set_last_operation_and_save(s, Devops::Model::Server::OperationType::PAUSE) "Server with instance ID '#{s.id}' and node name '#{node_name}' is paused" else @@ -135,7 +135,7 @@ module Devops provider = s.provider_instance r = provider.unpause_server s if r.nil? - set_last_operation_type_and_save(s, Devops::Model::Server::OperationType::UNPAUSE) + set_last_operation_and_save(s, Devops::Model::Server::OperationType::UNPAUSE) "Server with instance ID '#{s.id}' and node name '#{node_name}' is unpaused" else @@ -149,7 +149,7 @@ module Devops Devops::Db.connector.check_project_auth s.project, s.deploy_env, user raise ConflictException.new("Server '#{node_name}' already reserved") unless s.reserved_by.nil? s.reserved_by = user - set_last_operation_type_and_save(s, Devops::Model::Server::OperationType::RESERVE) + set_last_operation_and_save(s, Devops::Model::Server::OperationType::RESERVE) end def unreserve_server node_name @@ -157,7 +157,7 @@ module Devops Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user raise ConflictException.new("Server '#{node_name}' is not reserved") if s.reserved_by.nil? s.reserved_by = nil - set_last_operation_type_and_save(s, Devops::Model::Server::OperationType::UNRESERVE) + set_last_operation_and_save(s, Devops::Model::Server::OperationType::UNRESERVE) end # TODO: check bootstrap template name @@ -169,7 +169,7 @@ module Devops DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}" #bootstrap s, out, cert.path, logger options[:cert_path] = cert.path - executor = Devops::Executor::ServerExecutor.new(s, out) + executor = Devops::Executor::ServerExecutor.new(s, out, current_user: parser.current_user) r = executor.two_phase_bootstrap(options) str = nil r = if check_server(s) @@ -322,8 +322,8 @@ module Devops end end - def set_last_operation_type_and_save(server, operation_type) - server.set_last_operation(operation_type) + def set_last_operation_and_save(server, operation_type) + server.set_last_operation(operation_type, parser.current_user) Devops::Db.connector.server_update(server) end diff --git a/devops-service/app/api2/handlers/stack.rb b/devops-service/app/api2/handlers/stack.rb index c6b122d..6f5a910 100644 --- a/devops-service/app/api2/handlers/stack.rb +++ b/devops-service/app/api2/handlers/stack.rb @@ -155,7 +155,7 @@ module Devops deploy_info = project.deploy_info(stack.deploy_env, nil) servers.each do |s| begin - res = Devops::Executor::ServerExecutor.new(s, out).deploy_server_with_tags(tags, deploy_info) + res = Devops::Executor::ServerExecutor.new(s, out, current_user: owner).deploy_server_with_tags(tags, deploy_info) status.push(res) rescue DeployInfoError => e msg = "Can not get deploy info: " + e.message diff --git a/devops-service/db/mongo/models/server.rb b/devops-service/db/mongo/models/server.rb index aae8ecf..19078ca 100644 --- a/devops-service/db/mongo/models/server.rb +++ b/devops-service/db/mongo/models/server.rb @@ -25,7 +25,7 @@ module Devops end attr_accessor :chef_node_name, :id, :remote_user, :project, :deploy_env, :private_ip, :public_ip, :created_at, :without_bootstrap, :created_by, :reserved_by, :stack, :run_list - attr_accessor :key, :last_operation_at, :last_operation_type + attr_accessor :key, :last_operation types :id => {:type => String, :empty => false}, :provider => {:type => String, :empty => false}, @@ -45,13 +45,13 @@ module Devops def self.fields ["chef_node_name", "project", "deploy_env", "provider", "remote_user", "private_ip", "public_ip", "created_at", "created_by", "key", "reserved_by", "run_list", "stack", - "last_operation_type", "last_operation_at"] + "last_operation"] end def initialize s={} self.set_provider(s) self.chef_node_name = s["chef_node_name"] - self.id = s["_id"] + self.id = s["_id"] || s['id'] self.remote_user = s["remote_user"] self.project = s["project"] self.deploy_env = s["deploy_env"] @@ -63,8 +63,7 @@ module Devops self.reserved_by = s["reserved_by"] self.stack = s["stack"] self.run_list = s["run_list"] || [] - self.last_operation_at = s["last_operation_at"] - self.last_operation_type = s["last_operation_type"] + self.last_operation = s["last_operation"] self end @@ -89,8 +88,7 @@ module Devops "reserved_by" => self.reserved_by, "stack" => stack, "run_list" => self.run_list, - "last_operation_at" => self.last_operation_at, - "last_operation_type" => self.last_operation_type + "last_operation" => self.last_operation }.merge(provider_hash).delete_if { |k,v| v.nil? } end @@ -113,10 +111,13 @@ module Devops self.provider == Provider::Static::PROVIDER end - def set_last_operation(operation_type) + def set_last_operation(operation_type, user) raise ArgumentError unless OperationType.supported_type?(operation_type) - self.last_operation_type = operation_type - self.last_operation_at = Time.now + self.last_operation = { + 'type' => operation_type, + 'date' => Time.now, + 'user' => user + } end end diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index cb983d1..6382005 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -35,7 +35,7 @@ module Devops before_deploy :create_run_list - def initialize server, out + def initialize server, out, options={} if server @project = Devops::Db.connector.project(server.project) @deploy_env = @project.deploy_env(server.deploy_env) @@ -44,6 +44,7 @@ module Devops @server = server @out = out @out.class.send(:define_method, :flush) { } unless @out.respond_to?(:flush) + @current_user = options[:current_user] end def self.result_code(symbolic_code) @@ -76,7 +77,7 @@ module Devops def create_server options @server = Devops::Model::Server.new({"project" => @project.id, "deploy_env" => @deploy_env.identifier, "created_by" => options["created_by"], "provider" => @deploy_env.provider, "provider_account" => @deploy_env.provider_account}) - @server.set_last_operation(Devops::Model::Server::OperationType::CREATION) + @server.set_last_operation(Devops::Model::Server::OperationType::CREATION, options["created_by"]) provider = @deploy_env.provider_instance mongo = ::Devops::Db.connector begin @@ -389,17 +390,19 @@ module Devops k = Devops::Db.connector.key(@server.key) lline = @knife_instance.ssh_stream(@out, cmd, ip, @server.remote_user, k.path) r = /Chef\sClient\sfinished/i - if lline[r].nil? - 1 - else + + if lline && lline[r] @out << "\nAfter deploy hooks...\n" res = self.run_hook(:after_deploy, @out, deploy_info) @out << "Done\n" - @server.set_last_operation(Devops::Model::Server::OperationType::DEPLOY) + @server.set_last_operation(Devops::Model::Server::OperationType::DEPLOY, @current_user) Devops::Db.connector.server_update(@server) 0 + else + @out << "An error occured during knife command executing" + 1 end end diff --git a/devops-service/spec/factories/server.rb b/devops-service/spec/factories/server.rb index 2878ec8..2af6793 100644 --- a/devops-service/spec/factories/server.rb +++ b/devops-service/spec/factories/server.rb @@ -13,7 +13,6 @@ FactoryGirl.define do chef_node_name 'chef_node_name' reserved_by 'root' run_list [] - last_operation_type 'creation' - last_operation_at Time.now + last_operation({'type' => 'creation', 'date' => Time.now, 'user' => 'root' }) end end \ No newline at end of file diff --git a/devops-service/spec/models/server_spec.rb b/devops-service/spec/models/server_spec.rb index b018979..f970df8 100644 --- a/devops-service/spec/models/server_spec.rb +++ b/devops-service/spec/models/server_spec.rb @@ -40,7 +40,7 @@ RSpec.describe Devops::Model::Server, type: :model do expect(described_class.fields).to match_array(%w( chef_node_name project deploy_env provider remote_user private_ip public_ip created_at created_by key reserved_by - run_list stack last_operation_type last_operation_at + run_list stack last_operation )) end end @@ -69,26 +69,26 @@ RSpec.describe Devops::Model::Server, type: :model do end describe '#set_last_operation' do - it 'sets #last_operation_at to Time.now' do - prev_operation_time = server.last_operation_at - server.set_last_operation('deploy') - expect(server.last_operation_at).to be > prev_operation_time + it 'sets #last_operation.date to Time.now' do + prev_operation_time = server.last_operation['date'] + server.set_last_operation('deploy', 'root') + expect(server.last_operation['date']).to be > prev_operation_time end it 'updates last_operation_type' do - server.set_last_operation('deploy') - expect(server.last_operation_type).to eq 'deploy' + server.set_last_operation('deploy', 'root') + expect(server.last_operation['type']).to eq 'deploy' end it 'it raises error if given type is not supported' do expect { - server.set_last_operation(:wrong) + server.set_last_operation(:wrong, 'root') }.to raise_error ArgumentError end it 'expects string as an argument' do expect { - server.set_last_operation(:deploy) + server.set_last_operation(:deploy, 'root') }.to raise_error ArgumentError end end diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index a261900..001f0d2 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -21,7 +21,7 @@ class BootstrapWorker < Worker bootstrap_template: bootstrap_template } =end - executor = Devops::Executor::ServerExecutor.new(server, out) + executor = Devops::Executor::ServerExecutor.new(server, out, current_user: owner) executor.report = report status = executor.two_phase_bootstrap(options) mongo.set_report_server_data(jid, server.chef_node_name, server.public_ip || server.private_ip) diff --git a/devops-service/workers/deploy_worker.rb b/devops-service/workers/deploy_worker.rb index 9916ee2..b6e48d0 100644 --- a/devops-service/workers/deploy_worker.rb +++ b/devops-service/workers/deploy_worker.rb @@ -16,7 +16,7 @@ class DeployWorker < Worker server = Devops::Model::Server.new(server_attrs) report = save_report(file, owner, server) - executor = Devops::Executor::ServerExecutor.new(server, out) + executor = Devops::Executor::ServerExecutor.new(server, out, current_user: owner) executor.report = report executor.deploy_server_with_tags(tags, deploy_info) end