diff --git a/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status.rb b/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status.rb index 8e9a3f023..bcdf79c72 100644 --- a/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status.rb +++ b/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status.rb @@ -46,10 +46,11 @@ def service_action end end - def update_status(service) - # Get status from input field status - status = @handle.inputs['status'] + def error + @handle.root['ae_result'] == "error" + end + def updated_message(service, status) updated_message = "Server [#{@handle.root['miq_server'].name}] " updated_message += "Service [#{service.name}] #{service_action} " updated_message += "Step [#{@handle.root['ae_state']}] " @@ -57,13 +58,22 @@ def update_status(service) updated_message += "Current Retry Number [#{@handle.root['ae_state_retries']}]"\ if @handle.root['ae_result'] == 'retry' @handle.log(:info, "Status message: #{updated_message} ") - update_task(updated_message, status) + updated_message + end - if @handle.root['ae_result'] == "error" - @handle.create_notification(:level => "error", - :subject => service, - :message => "Generic Service Error: #{updated_message}") - end + def error_handling(service, message) + @handle.create_notification(:level => "error", + :subject => service, + :message => "Generic Service Error: #{message}") + service.on_error(service_action) + end + + def update_status(service) + # Get status from input field status + status = @handle.inputs['status'] + message = updated_message(service, status) + update_task(message, status) + error_handling(service, message) if error end end end diff --git a/spec/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status_spec.rb b/spec/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status_spec.rb index fbd324c19..334783046 100644 --- a/spec/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status_spec.rb +++ b/spec/content/automate/ManageIQ/Service/Generic/StateMachines/GenericLifecycle.class/__methods__/update_status_spec.rb @@ -10,15 +10,17 @@ let(:svc_task) { MiqAeMethodService::MiqAeServiceServiceTemplateProvisionTask.find(task.id) } let(:svc_service) { MiqAeMethodService::MiqAeServiceServiceAnsibleTower.find(service_ansible_tower.id) } let(:root_object) do - Spec::Support::MiqAeMockObject.new('service' => svc_service, - 'service_action' => 'Provision', - 'miq_server' => svc_model_miq_server) + Spec::Support::MiqAeMockObject.new('service' => service_object, + 'service_action' => service_action, + 'service_template_provision_task' => svc_task, + 'miq_server' => svc_model_miq_server) end let(:ae_service) { Spec::Support::MiqAeMockService.new(root_object) } - let(:errormsg) { "simple error" } let(:svc_model_request) { MiqAeMethodService::MiqAeServiceServiceTemplateProvisionRequest.find(request.id) } let(:miq_server) { EvmSpecHelper.local_miq_server } let(:svc_model_miq_server) { MiqAeMethodService::MiqAeServiceMiqServer.find(miq_server.id) } + let(:service_action) { 'Provision' } + let(:service_object) { svc_service } shared_examples_for "update_status_error" do it "error" do @@ -29,33 +31,30 @@ end end + shared_examples_for "update_status_on_error" do + it "on_error" do + allow(svc_task).to receive(:destination).and_return(svc_service) + root_object['ae_result'] = 'error' + allow(ae_service).to receive(:create_notification) + allow(ae_service).to receive(:inputs) { {'status' => "fred"} } + expect(svc_service).to receive(:on_error).with(service_action) + described_class.new(ae_service).main + end + end + context "invalid service_action" do let(:errormsg) { 'Invalid service_action' } - let(:root_object) do - Spec::Support::MiqAeMockObject.new('service' => svc_service, - 'service_action' => 'fred', - 'miq_server' => svc_model_miq_server) - end + let(:service_action) { 'fred' } it_behaves_like "update_status_error" end context "service not found" do let(:errormsg) { 'Service not found' } - let(:root_object) do - Spec::Support::MiqAeMockObject.new('service_template_provision_task' => task, - 'service_action' => 'Provision', - 'miq_server' => svc_model_miq_server) - end + let(:service_object) { nil } it_behaves_like "update_status_error" end context "update_status" do - let(:root_object) do - Spec::Support::MiqAeMockObject.new('service_template_provision_task' => task, - 'service_action' => 'Provision', - 'service' => svc_service, - 'miq_server' => svc_model_miq_server) - end it "successful scenario" do allow(svc_task).to receive(:destination).and_return(svc_service) allow(svc_service).to receive(:update_status).and_return(nil) @@ -65,6 +64,17 @@ msg = "Server [#{miq_server.name}] Service [#{svc_service.name}] Provision Step [] Status [fred] " expect(svc_model_request.reload.message).to eq(msg) + expect(svc_service).not_to receive(:on_error) end end + + context "on_error provisioning" do + let(:service_action) { 'Provision' } + it_behaves_like "update_status_on_error" + end + + context "on_error retirement" do + let(:service_action) { 'Retirement' } + it_behaves_like "update_status_on_error" + end end