diff --git a/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend.rb b/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend.rb new file mode 100644 index 000000000..f530af321 --- /dev/null +++ b/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend.rb @@ -0,0 +1,63 @@ +# +# Description: This method is used to add 14 days to retirement date when target +# VM has a retires_on value and is not already retired +# + +module ManageIQ + module Automate + module System + module Request + class VmRetireExtend + def initialize(handle = $evm) + @handle = handle + end + + def main + @handle.log("info", "Starting vm_retire_extend") + @handle.object['vm_retire_extend_days'] = 14 + check_retire_extend(vm) + @handle.log("info", "Ending vm_retire_extend") + end + + private + + def vm + @handle.root["vm"].tap do |vm| + if vm.nil? + @handle.log(:error, 'vm is nil') + raise 'ERROR - vm object not passed in' + end + end + end + + def check_retire_extend(vm) + vm_retire_extend_days = @handle.object['vm_retire_extend_days'] + raise "ERROR - vm_retire_extend_days not found!" if vm_retire_extend_days.nil? + + @handle.log("info", "Number of days to extend: <#{vm_retire_extend_days}>") + + if vm.retires_on.blank? + raise "ERROR - VM #{vm.name} has no retirement date - extension bypassed. No Action taken" + end + + if vm.retired + raise "ERROR - VM #{vm.name} is already retired - extension bypassed. No Action taken" + end + + @handle.log("info", "VM: <#{vm.name}> current retirement date is #{vm.retires_on}") + @handle.log("info", "Extending retirement <#{vm_retire_extend_days}> days for VM: <#{vm.name}>") + + vm.extend_retires_on(vm_retire_extend_days, vm.retires_on) + + @handle.log("info", "VM: <#{vm.name}> new retirement date is #{vm.retires_on}") + @handle.log("info", "Inspecting retirement vm: <#{vm.retirement_state}>") + end + end + end + end + end +end + +if $PROGRAM_NAME == __FILE__ + ManageIQ::Automate::System::Request::VmRetireExtend.new.main +end diff --git a/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend.yaml b/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend.yaml new file mode 100644 index 000000000..a49786ce3 --- /dev/null +++ b/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend.yaml @@ -0,0 +1,13 @@ +--- +object_type: method +version: 1.0 +object: + attributes: + name: vm_retire_extend + display_name: + description: + scope: instance + language: ruby + location: inline + options: {} + inputs: [] diff --git a/content/automate/ManageIQ/System/Request.class/vm_retire_extend.yaml b/content/automate/ManageIQ/System/Request.class/vm_retire_extend.yaml index 90a07d30d..e2f27313c 100644 --- a/content/automate/ManageIQ/System/Request.class/vm_retire_extend.yaml +++ b/content/automate/ManageIQ/System/Request.class/vm_retire_extend.yaml @@ -8,5 +8,7 @@ object: inherits: description: fields: + - meth4: + value: vm_retire_extend - rel5: value: "/System/Notification/Email/${/#ae_provider_category}VmRetireExtend?event=vm_retire_extend" diff --git a/spec/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend_spec.rb b/spec/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend_spec.rb new file mode 100644 index 000000000..ae2cb6cef --- /dev/null +++ b/spec/content/automate/ManageIQ/System/Request.class/__methods__/vm_retire_extend_spec.rb @@ -0,0 +1,69 @@ +require_domain_file + +describe ManageIQ::Automate::System::Request::VmRetireExtend do + let(:user) { FactoryGirl.create(:user_with_email_and_group) } + let(:zone) { FactoryGirl.create(:zone) } + let(:ems) { FactoryGirl.create(:ems_microsoft, :zone => zone, :tenant => Tenant.root_tenant) } + let(:miq_server) { EvmSpecHelper.local_miq_server } + let(:vm) do + FactoryGirl.create(:vm_microsoft, + :raw_power_state => "PowerOff", + :retires_on => Time.zone.now, + :evm_owner => user, + :ems_id => ems.id) + end + + let(:root_hash) do + { 'vm' => 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 + + before do + allow(ae_service).to receive(:execute) + end + + context "when vm_retire_extend_days is 14" do + it "returns a new retirement date " do + future_retires_on = Time.zone.now + 14.days + described_class.new(ae_service).main + expect(vm.retires_on.day).to eq(future_retires_on.day) + end + end + + context "when vm retires_on is nil" do + it "does not update retires_on date" do + vm.update_attributes(:retires_on => nil) + errormsg = "ERROR - VM #{vm} has no retirement date - extension bypassed. No Action taken" + expect { described_class.new(ae_service).main }.to raise_error(errormsg) + end + end + + context "when vm retired is true " do + it "does not update retires_on date" do + vm.update_attributes(:retired => true) + errormsg = "ERROR - VM #{vm} is already retired - extension bypassed. No Action taken" + expect { described_class.new(ae_service).main }.to raise_error(errormsg) + end + end + + context "when there is no vm" do + let(:root_hash) { {} } + let(:svc_model_service) { nil } + let(:vm) { nil } + it "raises error message" do + errormsg = 'ERROR - vm object not passed in' + expect { described_class.new(ae_service).main }.to raise_error(errormsg) + end + end +end