Skip to content

Commit

Permalink
Add skeleton task and request for vm migrate
Browse files Browse the repository at this point in the history
  • Loading branch information
d-m-u committed Mar 23, 2018
1 parent 4d6b447 commit 42aebe6
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 4 deletions.
3 changes: 3 additions & 0 deletions app/models/miq_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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")
},
Expand Down
10 changes: 6 additions & 4 deletions app/models/mixins/retirement_mixin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 17 additions & 0 deletions app/models/vm_retire_request.rb
Original file line number Diff line number Diff line change
@@ -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
106 changes: 106 additions & 0 deletions app/models/vm_retire_task.rb
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions spec/factories/vm_retire_request.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
FactoryGirl.define do
factory :vm_retire_request
end
3 changes: 3 additions & 0 deletions spec/factories/vm_retire_task.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
FactoryGirl.define do
factory :vm_retire_task
end
1 change: 1 addition & 0 deletions spec/models/miq_request_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"},
Expand Down

0 comments on commit 42aebe6

Please sign in to comment.