From 42aebe6f06fc61bae548b0f8007d4784211e942c Mon Sep 17 00:00:00 2001 From: d-m-u Date: Thu, 1 Feb 2018 13:30:58 -0500 Subject: [PATCH] Add skeleton task and request for vm migrate --- app/models/miq_request.rb | 3 + app/models/mixins/retirement_mixin.rb | 10 ++- app/models/vm_retire_request.rb | 17 +++++ app/models/vm_retire_task.rb | 106 ++++++++++++++++++++++++++ spec/factories/vm_retire_request.rb | 3 + spec/factories/vm_retire_task.rb | 3 + spec/models/miq_request_spec.rb | 1 + 7 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 app/models/vm_retire_request.rb create mode 100644 app/models/vm_retire_task.rb create mode 100644 spec/factories/vm_retire_request.rb create mode 100644 spec/factories/vm_retire_task.rb diff --git a/app/models/miq_request.rb b/app/models/miq_request.rb index 06c31853abf..99849847e27 100644 --- a/app/models/miq_request.rb +++ b/app/models/miq_request.rb @@ -77,6 +77,9 @@ class MiqRequest < ApplicationRecord :VmMigrateRequest => { :vm_migrate => N_("VM Migrate") }, + :VmRetireRequest => { + :vm_retire => N_("VM Retire") + }, :ServiceTemplateProvisionRequest => { :clone_to_service => N_("Service Provision") }, diff --git a/app/models/mixins/retirement_mixin.rb b/app/models/mixins/retirement_mixin.rb index a2ee2e75c65..3c894398a1f 100644 --- a/app/models/mixins/retirement_mixin.rb +++ b/app/models/mixins/retirement_mixin.rb @@ -125,11 +125,13 @@ def retire_now(requester = nil) return if retired_validated? _log.info("#{retirement_object_title}: [#{name}], Retires On: [#{retires_on.strftime("%x %R %Z")}], was previously retired, but currently #{retired_invalid_reason}") else - update_attributes(:retirement_requester => requester) - event_name = "request_#{retirement_event_prefix}_retire" - _log.info("calling #{event_name}") + _log.info("Creating request for #{self.class.name} #{id}") begin - raise_retirement_event(event_name, requester) + options = {:src_ids => id} + VmRetireRequest.make_request(@request_id, options, User.current_user.try(:userid)) + + # still need the next line for orchestration and services + # raise_retirement_event(event_name, requester) rescue => err _log.log_backtrace(err) end diff --git a/app/models/vm_retire_request.rb b/app/models/vm_retire_request.rb new file mode 100644 index 00000000000..18052362387 --- /dev/null +++ b/app/models/vm_retire_request.rb @@ -0,0 +1,17 @@ +class VmRetireRequest < MiqRequest + TASK_DESCRIPTION = 'VM Retire'.freeze + SOURCE_CLASS_NAME = 'Vm'.freeze + ACTIVE_STATES = %w(retired) + base_class::ACTIVE_STATES + + validates :request_state, :inclusion => { :in => %w(pending finished) + ACTIVE_STATES, :message => "should be pending, #{ACTIVE_STATES.join(", ")} or finished" } + validate :must_have_user + + def my_zone + vm = Vm.find_by(:id => options[:src_ids]) + vm.nil? ? super : vm.my_zone + end + + def my_role + 'ems_operations' + end +end diff --git a/app/models/vm_retire_task.rb b/app/models/vm_retire_task.rb new file mode 100644 index 00000000000..4476e2c10e5 --- /dev/null +++ b/app/models/vm_retire_task.rb @@ -0,0 +1,106 @@ +class VmRetireTask < MiqRequestTask + alias_attribute :vm, :source + + validate :validate_request_type, :validate_state + + AUTOMATE_DRIVES = true + + def self.base_model + VmRetireTask + end + + def self.get_description(req_obj) + name = nil + if req_obj.source.nil? + # Single source has not been selected yet + if req_obj.options[:src_ids].length == 1 + v = Vm.find_by(:id => req_obj.options[:src_ids].first) + name = v.nil? ? "" : v.name + else + name = "Multiple VMs" + end + else + name = req_obj.source.name + end + + new_settings = [] + "#{request_class::TASK_DESCRIPTION} for: #{name} - #{new_settings.join(", ")}" + end + + def after_request_task_create + update_attribute(:description, get_description) + end + + def after_ae_delivery(ae_result) + _log.info("ae_result=#{ae_result.inspect}") + reload + + return if ae_result == 'retry' + return if miq_request.state == 'finished' + + if ae_result == 'ok' + update_and_notify_parent(:state => "finished", :status => "Ok", :message => display_message("#{request_class::TASK_DESCRIPTION} completed")) + else + mark_pending_items_as_finished + update_and_notify_parent(:state => "finished", :status => "Error", :message => display_message("#{request_class::TASK_DESCRIPTION} failed")) + end + end + + def deliver_to_automate(req_type = request_type, zone = nil) + task_check_on_delivery + + _log.info("Queuing #{request_class::TASK_DESCRIPTION}: [#{description}]...") + + if self.class::AUTOMATE_DRIVES + args = { + :object_type => self.class.name, + :object_id => id, + :attrs => {"request" => req_type}, + :instance_name => "AUTOMATION", + :user_id => get_user.id, + :miq_group_id => get_user.current_group.id, + :tenant_id => get_user.current_tenant.id, + } + + args[:attrs].merge!(MiqAeEngine.create_automation_attributes(source.class.base_model.name => source)) + + zone ||= source.respond_to?(:my_zone) ? source.my_zone : MiqServer.my_zone + MiqQueue.put( + :class_name => 'MiqAeEngine', + :method_name => 'deliver', + :args => [args], + :role => 'automate', + :zone => options.fetch(:miq_zone, zone), + :tracking_label => my_task_id, + ) + update_and_notify_parent(:state => "pending", :status => "Ok", :message => "Automation Starting") + else + execute_queue + end + end + + def before_ae_starts(_options) + reload + if state.to_s.downcase.in?(%w(pending queued)) + _log.info("Executing #{request_class::TASK_DESCRIPTION} request: [#{description}]") + update_and_notify_parent(:state => "active", :status => "Ok", :message => "In Process") + end + end + + def update_and_notify_parent(*args) + prev_state = state + super + task_finished if state == "finished" && prev_state != "finished" + end + + def task_finished + end + + def mark_pending_items_as_finished + miq_request.miq_request_tasks.each do |s| + if s.state == 'pending' + s.update_and_notify_parent(:state => "finished", :status => "Warn", :message => "Error in Request: #{miq_request.id}. Setting pending Task: #{id} to finished.") unless id == s.id + end + end + end +end diff --git a/spec/factories/vm_retire_request.rb b/spec/factories/vm_retire_request.rb new file mode 100644 index 00000000000..dfe5e507d63 --- /dev/null +++ b/spec/factories/vm_retire_request.rb @@ -0,0 +1,3 @@ +FactoryGirl.define do + factory :vm_retire_request +end diff --git a/spec/factories/vm_retire_task.rb b/spec/factories/vm_retire_task.rb new file mode 100644 index 00000000000..455c528008d --- /dev/null +++ b/spec/factories/vm_retire_task.rb @@ -0,0 +1,3 @@ +FactoryGirl.define do + factory :vm_retire_task +end diff --git a/spec/models/miq_request_spec.rb b/spec/models/miq_request_spec.rb index adc42414a48..36036ba2468 100644 --- a/spec/models/miq_request_spec.rb +++ b/spec/models/miq_request_spec.rb @@ -14,6 +14,7 @@ :VmReconfigureRequest => {:vm_reconfigure => "VM Reconfigure"}, :VmCloudReconfigureRequest => {:vm_cloud_reconfigure => "VM Cloud Reconfigure"}, :VmMigrateRequest => {:vm_migrate => "VM Migrate"}, + :VmRetireRequest => {:vm_retire => "VM Retire"}, :AutomationRequest => {:automation => "Automation"}, :ServiceTemplateProvisionRequest => {:clone_to_service => "Service Provision"}, :ServiceReconfigureRequest => {:service_reconfigure => "Service Reconfigure"},