ManageIQ/manageiq-automation_engine

View on GitHub
lib/miq_automation_engine/service_models/miq_ae_service_vm_or_template.rb

Summary

Maintainability
A
1 hr
Test Coverage
D
62%
module MiqAeMethodService
  class MiqAeServiceVmOrTemplate < MiqAeServiceModelBase
    require_relative "mixins/miq_ae_service_ems_operations_mixin"
    include MiqAeServiceEmsOperationsMixin
    require_relative "mixins/miq_ae_service_retirement_mixin"
    include MiqAeServiceRetirementMixin
    require_relative "mixins/miq_ae_service_inflector_mixin"
    include MiqAeServiceInflectorMixin
    require_relative "mixins/miq_ae_service_custom_attribute_mixin"
    include MiqAeServiceCustomAttributeMixin
    require_relative "mixins/miq_ae_service_remove_from_vmdb_mixin"
    include MiqAeServiceRemoveFromVmdb

    expose :ems_folder,            :association => true, :method => :parent_folder
    expose :ems_blue_folder,       :association => true, :method => :parent_blue_folder
    expose :resource_pool,         :association => true, :method => :parent_resource_pool
    expose :datacenter,            :association => true, :method => :parent_datacenter
    expose :registered?
    expose :to_s
    expose :event_threshold?
    expose :event_log_threshold?
    expose :performances_maintains_value_for_duration?
    expose :reconfigured_hardware_value?
    expose :changed_vm_value?
    expose :refresh, :method => :refresh_ems
    expose :evacuate

    METHODS_WITH_NO_ARGS = %w[start stop suspend unregister collect_running_processes shutdown_guest standby_guest reboot_guest].freeze
    METHODS_WITH_NO_ARGS.each do |m|
      define_method(m) do
        sync_or_async_ems_operation(false, m)
        true
      end
    end

    def migrate(host, pool = nil, priority = "defaultPriority", state = nil)
      raise "Host Class must be MiqAeServiceHost, but is <#{host.class.name}>" unless host.kind_of?(MiqAeServiceHost)
      raise "Pool Class must be MiqAeServiceResourcePool, but is <#{pool.class.name}>" unless pool.nil? || pool.kind_of?(MiqAeServiceResourcePool)

      args = []
      args << host['id']
      args << (pool.nil? ? nil : pool['id'])
      args << priority
      args << state

      sync_or_async_ems_operation(false, "migrate_via_ids", args)
      true
    end

    def owner
      evm_owner = object_send(:evm_owner)
      wrap_results(evm_owner)
    end
    association :owner

    # Used to return string object instead of VimString to automate methods which end up with a DrbUnknow object.
    def ems_ref_string
      object_send(:ems_ref)
    end

    def scan(scan_categories = nil)
      options = scan_categories.nil? ? {} : {:categories => scan_categories}
      job = object_send(:scan, "system", options)
      wrap_results(job)
    end

    def unlink_storage
      _log.info("Unlinking storage on #{@object.class.name} id:<#{@object.id}>, name:<#{@object.name}>")
      object_send(:update, :storage_id => nil)
      true
    end

    def ems_custom_keys
      ar_method do
        @object.ems_custom_attributes.collect(&:name)
      end
    end

    def ems_custom_get(key)
      ar_method do
        c1 = @object.ems_custom_attributes.find_by(:name => key.to_s)
        c1.try(:value)
      end
    end

    def ems_custom_set(attribute, value)
      _log.info("Setting EMS Custom Key on #{@object.class.name} id:<#{@object.id}>, name:<#{@object.name}> with key=#{attribute.inspect} to #{value.inspect}")
      sync_or_async_ems_operation(false, "set_custom_field", [attribute, value])
      true
    end

    def owner=(owner)
      raise ArgumentError, "owner must be nil or a MiqAeServiceUser" unless owner.nil? || owner.kind_of?(MiqAeMethodService::MiqAeServiceUser)

      ar_method do
        @object.evm_owner = owner && owner.instance_variable_get("@object")
        _log.info("Setting EVM Owning User on #{@object.class.name} id:<#{@object.id}>, name:<#{@object.name}> to #{@object.evm_owner.inspect}")
        @object.save
      end
    end

    def group=(group)
      raise ArgumentError, "group must be nil or a MiqAeServiceMiqGroup" unless group.nil? || group.kind_of?(MiqAeMethodService::MiqAeServiceMiqGroup)

      ar_method do
        @object.miq_group = group && group.instance_variable_get("@object")
        _log.info("Setting EVM Owning Group on #{@object.class.name} id:<#{@object.id}>, name:<#{@object.name}> to #{@object.miq_group.inspect}")
        @object.save
      end
    end

    def remove_from_disk(sync = true)
      sync_or_async_ems_operation(sync, "vm_destroy")
    end

    def show_url
      URI.join(MiqRegion.my_region.remote_ui_url, "vm/show/#{@object.id}").to_s
    end
  end
end