#648: store last server operation as subhash
This commit is contained in:
parent
39a8ff0eae
commit
a2d9e57d09
@ -85,7 +85,7 @@ module Devops
|
|||||||
begin
|
begin
|
||||||
deploy_info = create_deploy_info(s, project, body["build_number"])
|
deploy_info = create_deploy_info(s, project, body["build_number"])
|
||||||
deploy_info["run_list"] = run_list if run_list
|
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)
|
status.push(res)
|
||||||
rescue DeployInfoError => e
|
rescue DeployInfoError => e
|
||||||
msg = "Can not get deploy info: " + e.message
|
msg = "Can not get deploy info: " + e.message
|
||||||
|
|||||||
@ -225,7 +225,7 @@ module Devops
|
|||||||
# мы не можем указать один build_number для всех окружений, поэтому nil
|
# мы не можем указать один build_number для всех окружений, поэтому nil
|
||||||
deploy_info_buf[s.deploy_env] = project.deploy_info(deploy_env_model, nil)
|
deploy_info_buf[s.deploy_env] = project.deploy_info(deploy_env_model, nil)
|
||||||
end
|
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
|
end
|
||||||
status
|
status
|
||||||
end
|
end
|
||||||
|
|||||||
@ -120,7 +120,7 @@ module Devops
|
|||||||
provider = s.provider_instance
|
provider = s.provider_instance
|
||||||
r = provider.pause_server s
|
r = provider.pause_server s
|
||||||
if r.nil?
|
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"
|
"Server with instance ID '#{s.id}' and node name '#{node_name}' is paused"
|
||||||
else
|
else
|
||||||
@ -135,7 +135,7 @@ module Devops
|
|||||||
provider = s.provider_instance
|
provider = s.provider_instance
|
||||||
r = provider.unpause_server s
|
r = provider.unpause_server s
|
||||||
if r.nil?
|
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"
|
"Server with instance ID '#{s.id}' and node name '#{node_name}' is unpaused"
|
||||||
else
|
else
|
||||||
@ -149,7 +149,7 @@ module Devops
|
|||||||
Devops::Db.connector.check_project_auth s.project, s.deploy_env, user
|
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?
|
raise ConflictException.new("Server '#{node_name}' already reserved") unless s.reserved_by.nil?
|
||||||
s.reserved_by = user
|
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
|
end
|
||||||
|
|
||||||
def unreserve_server node_name
|
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
|
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?
|
raise ConflictException.new("Server '#{node_name}' is not reserved") if s.reserved_by.nil?
|
||||||
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
|
end
|
||||||
|
|
||||||
# TODO: check bootstrap template name
|
# TODO: check bootstrap template name
|
||||||
@ -169,7 +169,7 @@ module Devops
|
|||||||
DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}"
|
DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}"
|
||||||
#bootstrap s, out, cert.path, logger
|
#bootstrap s, out, cert.path, logger
|
||||||
options[:cert_path] = cert.path
|
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)
|
r = executor.two_phase_bootstrap(options)
|
||||||
str = nil
|
str = nil
|
||||||
r = if check_server(s)
|
r = if check_server(s)
|
||||||
@ -322,8 +322,8 @@ module Devops
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_last_operation_type_and_save(server, operation_type)
|
def set_last_operation_and_save(server, operation_type)
|
||||||
server.set_last_operation(operation_type)
|
server.set_last_operation(operation_type, parser.current_user)
|
||||||
Devops::Db.connector.server_update(server)
|
Devops::Db.connector.server_update(server)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -155,7 +155,7 @@ module Devops
|
|||||||
deploy_info = project.deploy_info(stack.deploy_env, nil)
|
deploy_info = project.deploy_info(stack.deploy_env, nil)
|
||||||
servers.each do |s|
|
servers.each do |s|
|
||||||
begin
|
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)
|
status.push(res)
|
||||||
rescue DeployInfoError => e
|
rescue DeployInfoError => e
|
||||||
msg = "Can not get deploy info: " + e.message
|
msg = "Can not get deploy info: " + e.message
|
||||||
|
|||||||
@ -25,7 +25,7 @@ module Devops
|
|||||||
end
|
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 :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},
|
types :id => {:type => String, :empty => false},
|
||||||
:provider => {:type => String, :empty => false},
|
:provider => {:type => String, :empty => false},
|
||||||
@ -45,13 +45,13 @@ module Devops
|
|||||||
|
|
||||||
def self.fields
|
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",
|
["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
|
end
|
||||||
|
|
||||||
def initialize s={}
|
def initialize s={}
|
||||||
self.set_provider(s)
|
self.set_provider(s)
|
||||||
self.chef_node_name = s["chef_node_name"]
|
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.remote_user = s["remote_user"]
|
||||||
self.project = s["project"]
|
self.project = s["project"]
|
||||||
self.deploy_env = s["deploy_env"]
|
self.deploy_env = s["deploy_env"]
|
||||||
@ -63,8 +63,7 @@ module Devops
|
|||||||
self.reserved_by = s["reserved_by"]
|
self.reserved_by = s["reserved_by"]
|
||||||
self.stack = s["stack"]
|
self.stack = s["stack"]
|
||||||
self.run_list = s["run_list"] || []
|
self.run_list = s["run_list"] || []
|
||||||
self.last_operation_at = s["last_operation_at"]
|
self.last_operation = s["last_operation"]
|
||||||
self.last_operation_type = s["last_operation_type"]
|
|
||||||
self
|
self
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -89,8 +88,7 @@ module Devops
|
|||||||
"reserved_by" => self.reserved_by,
|
"reserved_by" => self.reserved_by,
|
||||||
"stack" => stack,
|
"stack" => stack,
|
||||||
"run_list" => self.run_list,
|
"run_list" => self.run_list,
|
||||||
"last_operation_at" => self.last_operation_at,
|
"last_operation" => self.last_operation
|
||||||
"last_operation_type" => self.last_operation_type
|
|
||||||
}.merge(provider_hash).delete_if { |k,v| v.nil? }
|
}.merge(provider_hash).delete_if { |k,v| v.nil? }
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -113,10 +111,13 @@ module Devops
|
|||||||
self.provider == Provider::Static::PROVIDER
|
self.provider == Provider::Static::PROVIDER
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_last_operation(operation_type)
|
def set_last_operation(operation_type, user)
|
||||||
raise ArgumentError unless OperationType.supported_type?(operation_type)
|
raise ArgumentError unless OperationType.supported_type?(operation_type)
|
||||||
self.last_operation_type = operation_type
|
self.last_operation = {
|
||||||
self.last_operation_at = Time.now
|
'type' => operation_type,
|
||||||
|
'date' => Time.now,
|
||||||
|
'user' => user
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -35,7 +35,7 @@ module Devops
|
|||||||
|
|
||||||
before_deploy :create_run_list
|
before_deploy :create_run_list
|
||||||
|
|
||||||
def initialize server, out
|
def initialize server, out, options={}
|
||||||
if server
|
if server
|
||||||
@project = Devops::Db.connector.project(server.project)
|
@project = Devops::Db.connector.project(server.project)
|
||||||
@deploy_env = @project.deploy_env(server.deploy_env)
|
@deploy_env = @project.deploy_env(server.deploy_env)
|
||||||
@ -44,6 +44,7 @@ module Devops
|
|||||||
@server = server
|
@server = server
|
||||||
@out = out
|
@out = out
|
||||||
@out.class.send(:define_method, :flush) { } unless @out.respond_to?(:flush)
|
@out.class.send(:define_method, :flush) { } unless @out.respond_to?(:flush)
|
||||||
|
@current_user = options[:current_user]
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.result_code(symbolic_code)
|
def self.result_code(symbolic_code)
|
||||||
@ -76,7 +77,7 @@ module Devops
|
|||||||
|
|
||||||
def create_server options
|
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 = 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
|
provider = @deploy_env.provider_instance
|
||||||
mongo = ::Devops::Db.connector
|
mongo = ::Devops::Db.connector
|
||||||
begin
|
begin
|
||||||
@ -389,17 +390,19 @@ module Devops
|
|||||||
k = Devops::Db.connector.key(@server.key)
|
k = Devops::Db.connector.key(@server.key)
|
||||||
lline = @knife_instance.ssh_stream(@out, cmd, ip, @server.remote_user, k.path)
|
lline = @knife_instance.ssh_stream(@out, cmd, ip, @server.remote_user, k.path)
|
||||||
r = /Chef\sClient\sfinished/i
|
r = /Chef\sClient\sfinished/i
|
||||||
if lline[r].nil?
|
|
||||||
1
|
if lline && lline[r]
|
||||||
else
|
|
||||||
@out << "\nAfter deploy hooks...\n"
|
@out << "\nAfter deploy hooks...\n"
|
||||||
res = self.run_hook(:after_deploy, @out, deploy_info)
|
res = self.run_hook(:after_deploy, @out, deploy_info)
|
||||||
@out << "Done\n"
|
@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)
|
Devops::Db.connector.server_update(@server)
|
||||||
|
|
||||||
0
|
0
|
||||||
|
else
|
||||||
|
@out << "An error occured during knife command executing"
|
||||||
|
1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -13,7 +13,6 @@ FactoryGirl.define do
|
|||||||
chef_node_name 'chef_node_name'
|
chef_node_name 'chef_node_name'
|
||||||
reserved_by 'root'
|
reserved_by 'root'
|
||||||
run_list []
|
run_list []
|
||||||
last_operation_type 'creation'
|
last_operation({'type' => 'creation', 'date' => Time.now, 'user' => 'root' })
|
||||||
last_operation_at Time.now
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -40,7 +40,7 @@ RSpec.describe Devops::Model::Server, type: :model do
|
|||||||
expect(described_class.fields).to match_array(%w(
|
expect(described_class.fields).to match_array(%w(
|
||||||
chef_node_name project deploy_env provider remote_user
|
chef_node_name project deploy_env provider remote_user
|
||||||
private_ip public_ip created_at created_by key reserved_by
|
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
|
||||||
end
|
end
|
||||||
@ -69,26 +69,26 @@ RSpec.describe Devops::Model::Server, type: :model do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe '#set_last_operation' do
|
describe '#set_last_operation' do
|
||||||
it 'sets #last_operation_at to Time.now' do
|
it 'sets #last_operation.date to Time.now' do
|
||||||
prev_operation_time = server.last_operation_at
|
prev_operation_time = server.last_operation['date']
|
||||||
server.set_last_operation('deploy')
|
server.set_last_operation('deploy', 'root')
|
||||||
expect(server.last_operation_at).to be > prev_operation_time
|
expect(server.last_operation['date']).to be > prev_operation_time
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates last_operation_type' do
|
it 'updates last_operation_type' do
|
||||||
server.set_last_operation('deploy')
|
server.set_last_operation('deploy', 'root')
|
||||||
expect(server.last_operation_type).to eq 'deploy'
|
expect(server.last_operation['type']).to eq 'deploy'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'it raises error if given type is not supported' do
|
it 'it raises error if given type is not supported' do
|
||||||
expect {
|
expect {
|
||||||
server.set_last_operation(:wrong)
|
server.set_last_operation(:wrong, 'root')
|
||||||
}.to raise_error ArgumentError
|
}.to raise_error ArgumentError
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'expects string as an argument' do
|
it 'expects string as an argument' do
|
||||||
expect {
|
expect {
|
||||||
server.set_last_operation(:deploy)
|
server.set_last_operation(:deploy, 'root')
|
||||||
}.to raise_error ArgumentError
|
}.to raise_error ArgumentError
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -21,7 +21,7 @@ class BootstrapWorker < Worker
|
|||||||
bootstrap_template: bootstrap_template
|
bootstrap_template: bootstrap_template
|
||||||
}
|
}
|
||||||
=end
|
=end
|
||||||
executor = Devops::Executor::ServerExecutor.new(server, out)
|
executor = Devops::Executor::ServerExecutor.new(server, out, current_user: owner)
|
||||||
executor.report = report
|
executor.report = report
|
||||||
status = executor.two_phase_bootstrap(options)
|
status = executor.two_phase_bootstrap(options)
|
||||||
mongo.set_report_server_data(jid, server.chef_node_name, server.public_ip || server.private_ip)
|
mongo.set_report_server_data(jid, server.chef_node_name, server.public_ip || server.private_ip)
|
||||||
|
|||||||
@ -16,7 +16,7 @@ class DeployWorker < Worker
|
|||||||
server = Devops::Model::Server.new(server_attrs)
|
server = Devops::Model::Server.new(server_attrs)
|
||||||
report = save_report(file, owner, server)
|
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.report = report
|
||||||
executor.deploy_server_with_tags(tags, deploy_info)
|
executor.deploy_server_with_tags(tags, deploy_info)
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user