Skip to content

Commit

Permalink
Merge pull request ManageIQ#257 from pkomanek/refactoring_cloud_vm_re…
Browse files Browse the repository at this point in the history
…tirement_statemachines_methods_RemoveFromProvider_method

Refactoring cloud vm retirement remove_from_provider method
  • Loading branch information
mkanoor authored Jun 13, 2018
2 parents 3a67c4f + 1b76d5e commit 0d7b72a
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 120 deletions.
Original file line number Diff line number Diff line change
@@ -1,33 +1,70 @@
#
# Description: This method removes the Instance from the provider
#
# ManageIQ/Cloud/VM/Retirement/StateMachines/Methods.class/__methods__/remove_from_provider.rb
module ManageIQ
module Automate
module Cloud
module VM
module Retirement
module StateMachines
module Methods
class RemoveFromProvider
def initialize(handle = $evm)
@handle = handle
end

# Get vm from root object
vm = $evm.root['vm']
category = "lifecycle"
tag = "retire_full"
def main
# Get vm from root object
@vm = @handle.root['vm']

removal_type = $evm.inputs['removal_type'].downcase
$evm.set_state_var('vm_removed_from_provider', false)
ems = vm.ext_management_system if vm
@handle.set_state_var('vm_removed_from_provider', false)
@ems = @vm.ext_management_system if @vm

if vm.nil? || ems.nil?
$evm.log('info', "Skipping remove from provider for Instance:<#{vm.try(:name)}> on provider:<#{ems.try(:name)}>")
exit MIQ_OK
end
if @vm && @ems
remove_vm
else
@handle.log('info', "Skipping remove from provider for Instance:<#{@vm.try(:name)}> on provider:<#{@ems.try(:name)}>")
end
end

private

def remove_vm
category = "lifecycle"
tag = "retire_full"

case @handle.inputs['removal_type'].try(:downcase)
when "remove_from_disk"
remove_from_disk if @vm.miq_provision || @vm.tagged_with?(category, tag)
when "unregister"
unregister
else
@handle.log('info', "Unknown retirement type for VM:<#{@vm.name}> from provider:<#{@ems.name}>")
raise 'Unknown retirement type'
end
end

case removal_type
when "remove_from_disk"
if vm.miq_provision || vm.tagged_with?(category, tag)
$evm.log('info', "Removing Instance:<#{vm.name}> from provider:<#{ems.name}>")
vm.remove_from_disk(false)
$evm.set_state_var('vm_removed_from_provider', true)
def remove_from_disk
@handle.log('info', "Removing Instance:<#{@vm.name}> from provider:<#{@ems.name}>")
@vm.remove_from_disk(false)
@handle.set_state_var('vm_removed_from_provider', true)
end

def unregister
@handle.log('info', "Unregistering Instance:<#{@vm.name}> from provider:<#{@ems.name}>")
@vm.unregister
@handle.set_state_var('vm_removed_from_provider', true)
end
end
end
end
end
end
end
end
when "unregister"
$evm.log('info', "Unregistering Instance:<#{vm.name}> from provider:<#{ems.name}>")
vm.unregister
$evm.set_state_var('vm_removed_from_provider', true)
else
$evm.log('info', "Unknown retirement type for VM:<#{vm.name}> from provider:<#{ems.name}>")
exit MIQ_ABORT
end

if $PROGRAM_NAME == __FILE__
ManageIQ::Automate::Cloud::VM::Retirement::StateMachines::Methods::RemoveFromProvider.new.main
end

This file was deleted.

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

describe ManageIQ::Automate::Cloud::VM::Retirement::StateMachines::Methods::RemoveFromProvider do
let(:zone) { FactoryGirl.create(:zone) }
let(:svc_vm) { MiqAeMethodService::MiqAeServiceVm.find(vm.id) }
let(:root_hash) { { 'vm' => svc_vm } }
let(:root_object) { Spec::Support::MiqAeMockObject.new(root_hash) }

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 'ae_method' do
it "without removal_type" do
expect(ae_service).to receive(:log).with('info', "Unknown retirement type for VM:<#{vm.name}> from provider:<#{ems.name}>")
expect { described_class.new(ae_service).main }.to raise_error('Unknown retirement type')
expect(ae_service.get_state_var('vm_removed_from_provider')).to be_falsey
end

it "vm without tags" do
ae_service.inputs['removal_type'] = 'remove_from_disk'
described_class.new(ae_service).main
expect(ae_service.get_state_var('vm_removed_from_provider')).to be_falsey
end

it "nil vm" do
ae_service.root['vm'] = nil
expect(ae_service).to receive(:log).with('info', 'Skipping remove from provider for Instance:<> on provider:<>')
described_class.new(ae_service).main
expect(ae_service.get_state_var('vm_removed_from_provider')).to be_falsey
end

it "removes a vm" do
ae_service.inputs['removal_type'] = 'remove_from_disk'
vm.tag_with("retire_full", :ns => "/managed", :cat => "lifecycle")
expect { described_class.new(ae_service).main }.to_not raise_error
expect(ae_service.get_state_var('vm_removed_from_provider')).to be_truthy
end

context "without ems" do
let(:vm) { FactoryGirl.create(:vm_vmware) }

it "skips removing" do
expect(ae_service).to receive(:log).with('info', "Skipping remove from provider for Instance:<#{svc_vm.try(:name)}> on provider:<>")
described_class.new(ae_service).main
expect(ae_service.get_state_var('vm_removed_from_provider')).to be_falsey
end
end
end

context "Infrastructure" do
let(:ems) { FactoryGirl.create(:ems_vmware, :zone => zone) }
let(:vm) { FactoryGirl.create(:vm_vmware, :ems_id => ems.id) }

it_behaves_like 'ae_method'
end

context "Cloud" do
let(:ems) { FactoryGirl.create(:ems_google, :zone => zone) }
let(:vm) { FactoryGirl.create(:vm_google, :ems_id => ems.id) }

it_behaves_like 'ae_method'
end
end

0 comments on commit 0d7b72a

Please sign in to comment.