Skip to content

Commit

Permalink
Merge pull request ManageIQ#10934 from pkliczewski/master
Browse files Browse the repository at this point in the history
Changing refresh target for vm creation
  • Loading branch information
agrare committed Oct 4, 2016
2 parents 6d556d5 + 7c2295b commit 92655f2
Show file tree
Hide file tree
Showing 17 changed files with 1,300 additions and 12 deletions.
12 changes: 12 additions & 0 deletions app/models/ems_event/automate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,18 @@ def refresh(*targets, sync)
EmsRefresh.queue_refresh(refresh_targets, nil, sync)
end

def refresh_new_target
ems = ext_management_system
if ems.supports_refresh_new_target?
ep_class = ems.class::EventParser
target_hash = ep_class.parse_new_target(full_data, message, ems)

EmsRefresh.queue_refresh_new_target(target_hash, ems)
else
EmsRefresh.queue_refresh(ems)
end
end

def policy(target_str, policy_event, param = nil)
_log.debug("ems: [#{ems_id}]")
return if ems_id.nil?
Expand Down
25 changes: 25 additions & 0 deletions app/models/ems_refresh.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,19 @@ def self.queue_refresh(target, id = nil, sync = false)
end
end

def self.queue_refresh_new_target(target_hash, ems)
MiqQueue.put(
:queue_name => MiqEmsRefreshWorker.queue_name_for_ems(ems),
:class_name => name,
:method_name => 'refresh_new_target',
:role => "ems_inventory",
:zone => ems.my_zone,
:args => [target_hash, ems.id],
:msg_timeout => queue_timeout,
:task_id => nil
)
end

def self.refresh(target, id = nil)
EmsRefresh.init_console if defined?(Rails::Console)

Expand All @@ -79,6 +92,18 @@ def self.refresh(target, id = nil)
end
end

def self.refresh_new_target(target_hash, ems_id)
ems = ExtManagementSystem.find(ems_id)

target = save_new_target(target_hash)
if target.nil?
_log.warn "Unknown target for event data: #{target_hash}."
return
end

ems.refresher.refresh(get_ar_objects(target))
end

def self.get_ar_objects(target, single_id = nil)
# Handle targets passed as a single class/id pair, an array of class/id pairs, an array of references
target = [[target, single_id]] unless single_id.nil?
Expand Down
28 changes: 28 additions & 0 deletions app/models/ems_refresh/save_inventory.rb
Original file line number Diff line number Diff line change
Expand Up @@ -309,4 +309,32 @@ def save_snapshots_inventory(vm, hashes)
def save_event_logs_inventory(os, hashes)
save_inventory_multi(os.event_logs, hashes, :use_association, [:uid])
end

def save_new_target(target_hash)
unless target_hash[:vm].nil?
vm_hash = target_hash[:vm]
existing_vm = VmOrTemplate.find_by(:ems_ref => vm_hash[:ems_ref], :ems_id => target_hash[:ems_id])
unless existing_vm.nil?
return existing_vm
end

ems = ExtManagementSystem.find_by_id(target_hash[:ems_id])
old_cluster = get_cluster(ems, target_hash[:cluster], target_hash[:resource_pools], target_hash[:folders])

vm_hash[:ems_cluster_id] = old_cluster[:id]

new_vm = ems.vms_and_templates.create!(vm_hash)

dc = old_cluster.parent_datacenter
vm_folder = dc.children.select { |folder| folder.name == "vm" }[0]
vm_folder.add_vm(new_vm)
vm_folder.save!

resource_pool = old_cluster.children.first
resource_pool.add_vm(new_vm)
resource_pool.save!

new_vm
end
end
end
18 changes: 18 additions & 0 deletions app/models/ems_refresh/save_inventory_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -149,4 +149,22 @@ def relation_values(association, target)

top_level && (target == true || target.nil? || parent == target) ? :use_association : []
end

def get_cluster(ems, cluster_hash, rp_hash, dc_hash)
cluster = EmsCluster.find_by(:ems_ref => cluster_hash[:ems_ref], :ems_id => ems.id)
if cluster.nil?
rp = ems.resource_pools.create!(rp_hash)

cluster = ems.clusters.create!(cluster_hash)

cluster.add_resource_pool(rp)
cluster.save!

dc = Datacenter.find_by(:ems_ref => dc_hash[:ems_ref], :ems_id => ems.id)
dc.add_cluster(cluster)
dc.save!
end

cluster
end
end
1 change: 1 addition & 0 deletions app/models/manageiq/providers/redhat/infra_manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class ManageIQ::Providers::Redhat::InfraManager < ManageIQ::Providers::InfraMana
include_concern :ApiIntegration

supports :provisioning
supports :refresh_new_target

def self.ems_type
@ems_type ||= "rhevm".freeze
Expand Down
45 changes: 45 additions & 0 deletions app/models/manageiq/providers/redhat/infra_manager/event_parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,49 @@ def self.ems_ref_from_object_in_event(data)
return nil unless data.respond_to?(:[])
ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(data[:href])
end

def self.parse_new_target(full_data, message, ems)
cluster = full_data[:cluster]
cluster_ref = ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(cluster[:href])

cluster_name = ems.with_provider_connection do |rhevm|
Ovirt::Cluster.find_by_href(rhevm, cluster_ref).try(:[], :name)
end

{
:ems_id => ems.id,
:vm => parse_new_vm(full_data[:vm], message),
:cluster => parse_new_cluster(cluster_ref, cluster[:id], cluster_name),
:resource_pools => parse_new_rp(cluster[:id], cluster_name),
:folders => parse_new_dc(full_data[:data_center])
}
end

def self.parse_new_vm(vm, message)
ems_ref = ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(vm[:href])

ManageIQ::Providers::Redhat::InfraManager::RefreshParser.create_vm_hash(
ems_ref.include?('/templates/'), ems_ref, vm[:id], message.split(/\s/)[1])
end

def self.parse_new_cluster(cluster_ref, cluster_id, cluster_name)
{
:ems_ref => cluster_ref,
:ems_ref_obj => cluster_ref,
:uid_ems => cluster_id,
:name => cluster_name
}
end

def self.parse_new_rp(cluster_id, cluster_name)
{
:name => "Default for Cluster #{cluster_name}",
:uid_ems => "#{cluster_id}_respool",
:is_default => true,
}
end

def self.parse_new_dc(dc)
{:ems_ref => ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(dc[:href])}
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -401,19 +401,13 @@ def self.vm_inv_to_hashes(inv, _storage_inv, storage_uids, cluster_uids, host_ui

ems_ref = ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(vm_inv[:href])

new_result = {
:type => template ? "ManageIQ::Providers::Redhat::InfraManager::Template" : "ManageIQ::Providers::Redhat::InfraManager::Vm",
:ems_ref => ems_ref,
:ems_ref_obj => ems_ref,
:uid_ems => vm_inv[:id],
new_result = create_vm_hash(template, ems_ref, vm_inv[:id], URI.decode(vm_inv[:name]))

additional = {
:memory_reserve => vm_memory_reserve(vm_inv),
:name => URI.decode(vm_inv[:name]),
:vendor => "redhat",
:raw_power_state => raw_power_state,
:location => "#{vm_inv[:id]}.ovf",
:boot_time => boot_time,
:connection_state => 'connected',
:template => template,
:host => host,
:ems_cluster => ems_cluster,
:storages => storages,
Expand All @@ -423,6 +417,7 @@ def self.vm_inv_to_hashes(inv, _storage_inv, storage_uids, cluster_uids, host_ui
:custom_attributes => vm_inv_to_custom_attribute_hashes(vm_inv),
:snapshots => vm_inv_to_snapshot_hashes(vm_inv),
}
new_result.merge!(additional)

# Attach to the cluster's default resource pool
ems_cluster[:ems_children][:resource_pools].first[:ems_children][:vms] << new_result if ems_cluster && !template
Expand All @@ -433,6 +428,19 @@ def self.vm_inv_to_hashes(inv, _storage_inv, storage_uids, cluster_uids, host_ui
return result, result_uids
end

def self.create_vm_hash(template, ems_ref, vm_id, name)
{
:type => template ? "ManageIQ::Providers::Redhat::InfraManager::Template" : "ManageIQ::Providers::Redhat::InfraManager::Vm",
:ems_ref => ems_ref,
:ems_ref_obj => ems_ref,
:uid_ems => vm_id,
:vendor => "redhat",
:name => name,
:location => "#{vm_id}.ovf",
:template => template,
}
end

def self.vm_inv_to_hardware_hash(inv)
return nil if inv.nil?

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def collect_inventory_for_targets(ems, targets)
:data_center => target.parent_datacenter.ems_ref,
:vm => vm,
:template => "/api/templates?search=vm.id=#{vm_id}",
:storage => target.storages.map(&:ems_ref)
:storage => target.storages.empty? ? {:storagedomains => "storage_domain"} : target.storages.map(&:ems_ref)
},
:secondary => {
:vm => [:disks, :snapshots, :nics],
Expand Down
1 change: 1 addition & 0 deletions app/models/mixins/supports_feature_mixin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ module SupportsFeatureMixin
:provisioning => 'Provisioning',
:reboot_guest => 'Reboot Guest Operation',
:reconfigure => 'Reconfiguration',
:refresh_new_target => 'Refresh non-existing record',
:regions => 'Regions of a Provider',
:resize => 'Resizing',
:retire => 'Retirement',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ object:
description:
fields:
- rel5:
value: "/System/event_handlers/event_action_refresh?target=src_ems_cluster"
value: "/System/event_handlers/event_action_refresh_new_target?target=src_vm"
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ object:
description:
fields:
- rel4:
value: "/System/event_handlers/event_action_refresh?target=ems"
value: "/System/event_handlers/event_action_refresh_new_target?target=src_vm"
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
object_type: method
version: 1.0
object:
attributes:
name: event_action_refresh_new_target
display_name:
description:
scope: instance
language: ruby
location: builtin
inputs:
- field:
aetype:
name: target
display_name:
datatype: string
priority: 1
owner:
default_value:
substitute: true
message: create
visibility:
collect:
scope:
description:
condition:
on_entry:
on_exit:
on_error:
max_retries:
max_time:
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
object_type: instance
version: 1.0
object:
attributes:
display_name:
name: event_action_refresh_new_target
inherits:
description:
fields:
- meth1:
value: event_action_refresh_new_target
4 changes: 4 additions & 0 deletions lib/miq_automation_engine/engine/miq_ae_builtin_method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ def self.miq_event_action_refresh_sync(obj, inputs)
event_object_from_workspace(obj).refresh(inputs['target'], true)
end

def self.miq_event_action_refresh_new_target(obj, _inputs)
event_object_from_workspace(obj).refresh_new_target
end

def self.miq_event_action_policy(obj, inputs)
event_object_from_workspace(obj).policy(inputs['target'], inputs['policy_event'], inputs['param'])
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ def refresh(*targets, sync)
ar_method { @object.refresh(*targets, sync) } unless targets.blank?
end

def refresh_new_target
ar_method { @object.refresh_new_target }
end

def policy(target_str, policy_event, param)
ar_method { @object.policy(target_str, policy_event, param) }
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,29 @@
assert_storage(storage, vm)
end

it "should refresh new vm" do
vm = FactoryGirl.create(:vm_redhat,
:ext_management_system => @ems,
:uid_ems => "4f6dd4c3-5241-494f-8afc-f1c67254bf77",
:ems_cluster => @cluster,
:ems_ref => "/api/vms/4f6dd4c3-5241-494f-8afc-f1c67254bf77")
vm.with_relationship_type("ems_metadata") { vm.parent = @rp }

VCR.use_cassette("#{described_class.name.underscore}_target_new_vm") do
EmsRefresh.refresh(vm)
end

assert_table_counts

storage = Storage.find_by(:ems_ref => "/api/storagedomains/ee745353-c069-4de8-8d76-ec2e155e2ca0")
assert_vm(vm, storage)

hardware = Hardware.find_by(:vm_or_template_id => vm.id)
assert_vm_rels(vm, hardware, storage)
assert_cluster
assert_storage(storage, vm)
end

def assert_table_counts
expect(ExtManagementSystem.count).to eq(1)
expect(EmsCluster.count).to eq(1)
Expand Down

0 comments on commit 92655f2

Please sign in to comment.