Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automate - Refactoring infra vm check_powered_off method. #108

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,60 @@
# Description: This method checks to see if the VM has been powered off or suspended
#

# Get vm from root object
vm = $evm.root['vm']

if vm
power_state = vm.attributes['power_state']
ems = vm.ext_management_system
$evm.log('info', "VM:<#{vm.name}> on provider:<#{ems.try(:name)} has Power State:<#{power_state}>")

# If VM is powered off or suspended exit

if %w(off suspended).include?(power_state)
# Bump State
$evm.root['ae_result'] = 'ok'
elsif power_state == "never"
# If never then this VM is a template so exit the retirement state machine
$evm.root['ae_result'] = 'error'
else
$evm.root['ae_result'] = 'retry'
$evm.root['ae_retry_interval'] = '60.seconds'
module ManageIQ
module Automate
module Infrastructure
module VM
module Retirement
module StateMachines
class CheckPoweredOff
def initialize(handle = $evm)
@handle = handle
end

def main
check_power_state(vm)
end

private

def vm
raise "ERROR - vm object not passed in" unless @handle.root['vm']
@handle.root['vm']
end

def check_power_state(vm)
ems = vm.ext_management_system
if ems.nil?
@handle.log('info', "Skipping check powered on for VM:<#{vm(:name)}> "\
"with no EMS")
return
end

power_state = vm.power_state
@handle.log('info', "VM:<#{vm.name}> on Provider:<#{ems.name}> has Power State:<#{power_state}>")

# If VM is powered off or suspended exit

if %w(off suspended).include?(power_state)
# Bump State
@handle.root['ae_result'] = 'ok'
elsif power_state == "never"
# If never then this VM is a template so exit the retirement state machine
@handle.root['ae_result'] = 'error'
else
@handle.root['ae_result'] = 'retry'
@handle.root['ae_retry_interval'] = '60.seconds'
end
end
end
end
end
end
end
end
end

if __FILE__ == $PROGRAM_NAME
ManageIQ::Automate::Infrastructure::VM::Retirement::StateMachines::CheckPoweredOff.new.main
end
28 changes: 0 additions & 28 deletions spec/automation/unit/method_validation/check_powered_off_spec.rb

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
require_domain_file

describe ManageIQ::Automate::Infrastructure::VM::Retirement::StateMachines::CheckPoweredOff do
let(:zone) { FactoryGirl.create(:zone) }
let(:ems) { FactoryGirl.create(:ems_microsoft, :zone => zone) }
let(:vm) do
FactoryGirl.create(:vm_microsoft,
:raw_power_state => "PowerOff",
:ems_id => ems.id)
end

let(:svc_model_vm) do
MiqAeMethodService::MiqAeServiceVm.find(vm.id)
end

let(:root_hash) do
{ 'vm' => MiqAeMethodService::MiqAeServiceVm.find(vm.id) }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@billfitzgerald0120
This could be just

{'vm' => svc_model_vm }

end

let(:root_object) do
Spec::Support::MiqAeMockObject.new(root_hash)
end

let(:ae_service) do
Spec::Support::MiqAeMockService.new(root_object).tap do |service|
current_object = Spec::Support::MiqAeMockObject.new
current_object.parent = root_object
service.object = current_object
end
end

it "returns 'ok' for a vm in powered_off state" do
described_class.new(ae_service).main
expect(ae_service.root['vm'].power_state).to eq("off")
expect(ae_service.root['ae_result']).to eq('ok')
end

shared_examples_for "#vm power state" do
it "check" do
vm.update_attributes(:raw_power_state => raw_power_state)
svc_model_vm
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@billfitzgerald0120
What does this line do? Is it trying to reload the service vm object. Should this be happening after the method has run?

described_class.new(ae_service).main
expect(ae_service.root['vm'].power_state).to eq(power_state)
expect(ae_service.root['ae_result']).to eq(ae_result)
end
end

context "powered_on " do
let(:raw_power_state) { "Running" }
let(:power_state) { "on" }
let(:ae_result) { "retry" }
it_behaves_like "#vm power state"
end
context "unknown" do
let(:raw_power_state) { "unknown" }
let(:power_state) { "unknown" }
let(:ae_result) { "retry" }
it_behaves_like "#vm power state"
end
context "suspended" do
let(:raw_power_state) { "suspended" }
let(:power_state) { "unknown" }
let(:ae_result) { "retry" }
it_behaves_like "#vm power state"
end
context "never" do
let(:raw_power_state) { "never" }
let(:power_state) { "never" }
let(:ae_result) { "error" }
it_behaves_like "#vm power state"
end

context "exceptions" do
context "with no ems" do
let(:vm) do
FactoryGirl.create(:vm_microsoft, :raw_power_state => "PowerOff")
end

it "result is nil" do
expect(ae_service.root['ae_result']).to be_nil
end
end

context "with no vm" do
let(:root_hash) { {} }
let(:svc_model_service) { nil }
let(:vm) { nil }

it "raises the vm is nil exception" do
expect { described_class.new(ae_service).main }.to raise_error(
'ERROR - vm object not passed in'
)
end
end
end
end