Use mcollective instead of Cobbler fence_ssh to reboot nodes

Change-Id: Ia761dd4a8d2f3a077647dc2e5292628b793e30be
Closes-Bug: #1528574
(cherry picked from commit 330ac35b26)
(cherry picked from commit b81577a5b7)
This commit is contained in:
Vladimir Sharshov (warpc) 2015-12-30 22:37:29 +03:00 committed by Aleksey Zvyagintsev
parent 016be055f6
commit b35db0f7ba
3 changed files with 49 additions and 31 deletions

View File

@ -61,5 +61,22 @@ module Astute
ctx.reporter.report({'status' => 'error', 'error' => msg, 'progress' => 100})
end
def self.reboot(ctx, node_ids, task_id="reboot_provisioned_nodes")
Astute::NailgunHooks.new(
[{
"priority" => 100,
"type" => "reboot",
"fail_on_error" => false,
"id" => task_id,
"uids" => node_ids,
"parameters" => {
"timeout" => Astute.config.reboot_timeout
}
}],
ctx,
'provision'
).process
end
end
end

View File

@ -92,10 +92,6 @@ module Astute
raise e
end
def image_provision(reporter, task_id, nodes)
ImageProvision.provision(Context.new(task_id, reporter), nodes)
end
def provision_and_watch_progress(reporter,
task_id,
nodes_to_provision,
@ -250,13 +246,18 @@ module Astute
cobbler.netboot_nodes(provisioned_nodes, false)
# in case of IBP we reboot only those nodes which we managed to provision
reboot_events = cobbler.reboot_nodes(provisioned_nodes)
soft_reboot(
reporter,
task_id,
provisioned_nodes.map{ |n| n['uid'] },
'reboot_provisioned_nodes'
)
else
reboot_events = cobbler.reboot_nodes(nodes)
not_rebooted = cobbler.check_reboot_nodes(reboot_events)
not_rebooted = nodes.select { |n| not_rebooted.include?(n['slave_name'])}
failed_uids |= not_rebooted.map { |n| n['uid']}
end
not_rebooted = cobbler.check_reboot_nodes(reboot_events)
not_rebooted = nodes.select { |n| not_rebooted.include?(n['slave_name'])}
failed_uids |= not_rebooted.map { |n| n['uid']}
# control reboot for nodes which still in bootstrap state
# Note: if the image based provisioning is used nodes are already
@ -291,6 +292,14 @@ module Astute
private
def image_provision(reporter, task_id, nodes)
ImageProvision.provision(Context.new(task_id, reporter), nodes)
end
def soft_reboot(reporter, task_id, nodes, task_name)
ImageProvision.reboot(Context.new(task_id, reporter), nodes, task_name)
end
def report_result(result, reporter)
default_result = {'status' => 'ready', 'progress' => 100}
@ -525,20 +534,12 @@ module Astute
)
if existent_nodes.present?
Astute::NailgunHooks.new(
[{
"priority" => 100,
"type" => "reboot",
"fail_on_error" => false,
"diagnostic_name" => "reboot_reprovisioned_nodes",
"uids" => existent_nodes.map { |n| n['uid'] },
"parameters" => {
"timeout" => Astute.config.reboot_timeout
}
}],
Context.new(task_id, reporter),
'provision'
).process
soft_reboot(
reporter,
task_id,
existent_nodes.map{ |n| n['uid'] },
"reboot_reprovisioned_nodes"
)
end
cobbler.remove_nodes(nodes)

View File

@ -241,24 +241,23 @@ describe Astute::Provisioner do
Astute::Provision::Cobbler.any_instance do
expects(:power_reboot).with('controller-1')
end
Astute::CobblerManager.any_instance.stubs(:check_reboot_nodes).returns([])
Astute::CobblerManager.any_instance.stubs(:netboot_nodes)
Astute::CobblerManager.any_instance.stubs(:edit_nodes)
@provisioner.stubs(:change_nodes_type)
@provisioner.stubs(:image_provision).returns([])
Astute::CobblerManager.any_instance.expects(:check_reboot_nodes).never
@provisioner.expects(:soft_reboot).returns()
@provisioner.provision_piece(@reporter, data['task_uuid'], data['engine'], data['nodes'], 'image')
end
it "does not reboot nodes which failed during provisioning" do
Astute::Provision::Cobbler.any_instance do
expects(:power_reboot).never
end
Astute::CobblerManager.any_instance.stubs(:check_reboot_nodes).returns([])
Astute::CobblerManager.any_instance.stubs(:netboot_nodes)
Astute::CobblerManager.any_instance.stubs(:edit_nodes)
@provisioner.stubs(:change_nodes_type)
@provisioner.stubs(:image_provision).returns(['1'])
@provisioner.stubs(:soft_reboot).returns()
expect(@provisioner.provision_piece(@reporter, data['task_uuid'], data['engine'], data['nodes'], 'image')).to eql(['1'])
end
@ -270,11 +269,11 @@ describe Astute::Provisioner do
{'profile' => Astute.config.bootstrap_profile}
)
end
Astute::CobblerManager.any_instance.stubs(:check_reboot_nodes).returns([])
Astute::CobblerManager.any_instance.stubs(:netboot_nodes)
Astute::CobblerManager.any_instance.stubs(:edit_nodes)
@provisioner.stubs(:change_nodes_type)
@provisioner.stubs(:image_provision).returns([])
@provisioner.stubs(:soft_reboot).returns()
@provisioner.provision_piece(@reporter, data['task_uuid'], data['engine'], data['nodes'], 'image')
end
@ -283,10 +282,10 @@ describe Astute::Provisioner do
Astute::CobblerManager.any_instance do
expects(:netboot_nodes).with([], false)
end
Astute::CobblerManager.any_instance.stubs(:check_reboot_nodes).returns([])
Astute::CobblerManager.any_instance.stubs(:edit_nodes)
Astute::CobblerManager.any_instance.stubs(:netboot_nodes)
@provisioner.stubs(:change_nodes_type)
@provisioner.stubs(:soft_reboot).returns()
@provisioner.stubs(:image_provision).returns([1])
@provisioner.provision_piece(@reporter, data['task_uuid'], data['engine'], data['nodes'], 'image')
@ -302,6 +301,7 @@ describe Astute::Provisioner do
.returns([Time.now.to_f, 'controller-1', 'complete'])
Astute::CobblerManager.any_instance.stubs(:netboot_nodes)
@provisioner.stubs(:change_nodes_type)
@provisioner.stubs(:soft_reboot).returns()
@provisioner.stubs(:image_provision).returns([])
@provisioner.provision_piece(@reporter, data['task_uuid'], data['engine'], data['nodes'], 'image')
@ -1066,11 +1066,11 @@ describe Astute::Provisioner do
it 'return failed nodes if image provision return failed uid' do
Astute::CobblerManager.any_instance.stubs(:netboot_nodes)
Astute::CobblerManager.any_instance.stubs(:reboot_nodes)
Astute::CobblerManager.any_instance.stubs(:check_reboot_nodes).returns(['node1'])
@provisioner.stubs(:change_nodes_type)
@provisioner.stubs(:control_reboot_using_ssh)
Astute::ImageProvision.stubs(:provision).returns(['1'])
result = @provisioner.provision_piece(@reporter, 'task_uuid', engine_attrs, nodes, 'image')
result = @provisioner.provision_piece(@reporter, 'task_uuid', engine_attrs, nodes, 'native')
result.should eql(['1'])
end
end