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

Refactoring cloud vm retirement amazon_check_pre_retirement method #325

Merged
merged 2 commits into from
Jul 9, 2018
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,27 +2,52 @@
# Description: This method checks to see if the amazon instance has been powered off
# if the instance is on a instance store we cannot stop it
#
module ManageIQ
module Automate
module Cloud
module VM
module Retirement
module StateMachines
module Methods
class AmazonCheckPreRetirement
def initialize(handle = $evm)
@handle = handle
end

# Get vm from root object
vm = $evm.root['vm']
ems = vm.ext_management_system if vm
def main
# Get vm from root object
vm = @handle.root['vm']
ems = vm.ext_management_system if vm

if vm.nil? || ems.nil?
$evm.log('info', "Skipping check pre retirement for Instance:<#{vm.try(:name)}> on EMS:<#{ems.try(:name)}>")
exit MIQ_OK
if vm.nil? || ems.nil?
@handle.log('info', "Skipping check pre retirement for Instance:<#{vm.try(:name)}> on EMS:<#{ems.try(:name)}>")
else
power_state = vm.power_state
@handle.log('info', "Instance:<#{vm.name}> on EMS:<#{ems.name}> has Power State:<#{power_state}>")
# If VM is powered off, suspended, terminated, unknown or this instance is running on an instance store exit
if %w(off suspended terminated unknown).include?(power_state) || vm.hardware.root_device_type == "instance-store"
# 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'
Copy link
Contributor

Choose a reason for hiding this comment

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

@pkomanek Should we raise an error here if someone is trying to power off a template?

raise 'Trying to power off a template'
else
vm.refresh
@handle.root['ae_result'] = 'retry'
@handle.root['ae_retry_interval'] = '60.seconds'
end
end
end
end
end
end
end
end
end
end
end

power_state = vm.power_state
$evm.log('info', "Instance:<#{vm.name}> on EMS:<#{ems.name}> has Power State:<#{power_state}>")
# If VM is powered off, suspended, terminated, unknown or this instance is running on an instance store exit
if %w(off suspended terminated unknown).include?(power_state) || vm.hardware.root_device_type == "instance-store"
# 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
vm.refresh
$evm.root['ae_result'] = 'retry'
$evm.root['ae_retry_interval'] = '60.seconds'
if $PROGRAM_NAME == __FILE__
ManageIQ::Automate::Cloud::VM::Retirement::StateMachines::Methods::AmazonCheckPreRetirement.new.main
end

This file was deleted.

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

describe ManageIQ::Automate::Cloud::VM::Retirement::StateMachines::Methods::AmazonCheckPreRetirement do
let(:svc_vm) { MiqAeMethodService::MiqAeServiceVm.find(vm.id) }
let(:ems) { FactoryGirl.create(:ems_amazon, :name => 'testEmsAmazon') }
let(:root_object) { Spec::Support::MiqAeMockObject.new(root_hash) }
let(:root_hash) { { 'vm' => svc_vm } }
let(:vm) do
FactoryGirl.create(:vm_amazon, :ems_id => ems.id,
:name => 'testVmAmazon',
:raw_power_state => "running",
:registered => true)
end
let(:ebs_hardware) do
FactoryGirl.create(:hardware, :bitness => 64,
:virtualization_type => 'paravirtual',
:root_device_type => 'ebs')
end
let(:is_hardware) do
FactoryGirl.create(:hardware, :bitness => 64,
:virtualization_type => 'paravirtual',
:root_device_type => 'instance-store')
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

shared_examples_for "ae_method" do |ae_result, vm_power_state, ae_retry_interval|
it "has valid output" do
described_class.new(ae_service).main
expect(ae_service.root['ae_result']).to eq(ae_result) if ae_result
expect(ae_service.root['vm'].power_state).to eq(vm_power_state) if vm_power_state
expect(ae_service.root['ae_retry_interval']).to eq(ae_retry_interval) if ae_retry_interval
end
end

context "returns 'ok' for instance store instances even with power on" do
before { vm.hardware = is_hardware }
it_behaves_like 'ae_method', 'ok', 'on'
end

context "returns 'retry' for running ebs instances" do
before do
vm.hardware = ebs_hardware
expect(svc_vm).to(receive(:refresh))
end
it_behaves_like 'ae_method', 'retry', 'on', '60.seconds'
end

context "returns 'ok' for stopped ebs instances" do
let(:vm) do
FactoryGirl.create(:vm_amazon, :ems_id => ems.id,
:raw_power_state => "off",
:registered => true,
:hardware => ebs_hardware)
end
it_behaves_like 'ae_method', 'ok', 'off'
end

context "returns 'ok' for ebs instance with unknown power state" do
let(:vm) do
FactoryGirl.create(:vm_amazon, :ems_id => ems.id,
:raw_power_state => "unknown",
:registered => true,
:hardware => ebs_hardware)
end
it_behaves_like 'ae_method', 'ok', 'terminated'
end

context "returns 'error' for VM template" do
let(:vm) do
FactoryGirl.create(:template_amazon, :ems_id => ems.id,
:hardware => ebs_hardware)
end
let(:svc_vm) { MiqAeMethodService::MiqAeServiceVmOrTemplate.find(vm.id) }

it "raise error with template" do
expect { described_class.new(ae_service).main }.to(raise_error('Trying to power off a template'))
expect(ae_service.root['ae_result']).to(eq('error'))
end
end

context "skips check" do
before do
message = "Skipping check pre retirement for Instance:"\
"<#{vm.try(:name)}> on EMS:<#{ems.try(:name)}>"
expect(ae_service).to(receive(:log).with('info', message))
end

context '#nil vm' do
let(:vm) {}
let(:svc_vm) {}
let(:ems) {}
it_behaves_like 'ae_method'
end

context '#nil ems' do
let(:vm) { FactoryGirl.create(:vm_amazon, :name => 'testVmAmazon') }
let(:ems) {}
it_behaves_like 'ae_method'
end
end
end