From b35db0f7ba59590c82ea649f1bf1cc0c753bb421 Mon Sep 17 00:00:00 2001 From: "Vladimir Sharshov (warpc)" Date: Wed, 30 Dec 2015 22:37:29 +0300 Subject: [PATCH] Use mcollective instead of Cobbler fence_ssh to reboot nodes Change-Id: Ia761dd4a8d2f3a077647dc2e5292628b793e30be Closes-Bug: #1528574 (cherry picked from commit 330ac35b26d01f882adf62b060888349e3200b0b) (cherry picked from commit b81577a5b7857c4be8748492bae1dec2fa89b446) --- lib/astute/image_provision.rb | 17 +++++++++++++ lib/astute/provision.rb | 45 ++++++++++++++++++----------------- spec/unit/provision_spec.rb | 18 +++++++------- 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/lib/astute/image_provision.rb b/lib/astute/image_provision.rb index 5aa1f694..d6bf9b79 100644 --- a/lib/astute/image_provision.rb +++ b/lib/astute/image_provision.rb @@ -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 diff --git a/lib/astute/provision.rb b/lib/astute/provision.rb index 0fcf372b..54391d00 100644 --- a/lib/astute/provision.rb +++ b/lib/astute/provision.rb @@ -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) diff --git a/spec/unit/provision_spec.rb b/spec/unit/provision_spec.rb index 763a73e8..28ad48b9 100644 --- a/spec/unit/provision_spec.rb +++ b/spec/unit/provision_spec.rb @@ -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