Skip to content

Commit

Permalink
change infra targets to be single ems centric
Browse files Browse the repository at this point in the history
remove cop around exclude_storage guard vs next statement
  • Loading branch information
kbrock committed Jan 6, 2020
1 parent 265f8ae commit 5f25d71
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 40 deletions.
67 changes: 29 additions & 38 deletions app/models/manageiq/providers/infra_manager/metrics_capture.rb
Original file line number Diff line number Diff line change
@@ -1,23 +1,16 @@
class ManageIQ::Providers::InfraManager::MetricsCapture < ManageIQ::Providers::BaseManager::MetricsCapture
def capture_ems_targets(options = {})
capture_infra_targets([ems], options)
end

private

# If a Cluster, standalone Host, or Storage is not enabled, skip it.
# If a Cluster is enabled, capture all of its Hosts.
# If a Host is enabled, capture all of its Vms.
def capture_infra_targets(emses, options)
load_infra_targets_data(emses, options)
all_hosts = capture_host_targets(emses)
load_infra_targets_data(ems, options)
all_hosts = capture_host_targets(ems)
targets = enabled_hosts = only_enabled(all_hosts)
targets += capture_storage_targets(all_hosts) unless options[:exclude_storages]
targets += capture_vm_targets(emses, enabled_hosts)
targets += capture_vm_targets(ems, enabled_hosts)

targets
end

private

# Filter to enabled hosts. If it has a cluster consult that, otherwise consult the host itself.
#
# NOTE: if capture_storage takes only enabled, then move
Expand All @@ -33,9 +26,9 @@ def only_enabled(hosts)
# tags are needed for determining if it is enabled.
# ems is needed for determining queue name
# cluster is used for hierarchies
def load_infra_targets_data(emses, options)
MiqPreloader.preload(emses, preload_hash_infra_targets_data(options))
postload_infra_targets_data(emses, options)
def load_infra_targets_data(ems, options)
MiqPreloader.preload(ems, preload_hash_infra_targets_data(options))
postload_infra_targets_data(ems, options)
end

def preload_hash_infra_targets_data(options)
Expand All @@ -55,46 +48,44 @@ def preload_hash_infra_targets_data(options)
# and since we also rely upon tags and clusters, this causes unnecessary data to be downloaded
#
# so we have introduced this to work around preload not working (and inverse_of)
def postload_infra_targets_data(emses, options)
def postload_infra_targets_data(ems, options)
# populate ems (with tags / clusters)
emses.each do |ems|
ems.hosts.each do |host|
host.ems_cluster.association(:ext_management_system).target = ems if host.ems_cluster_id
unless options[:exclude_storages]
host.storages.each do |storage|
storage.ext_management_system = ems
end
end
end
host_ids = ems.hosts.index_by(&:id)
clusters = ems.hosts.flat_map(&:ems_cluster).uniq.compact.index_by(&:id)
ems.vms.each do |vm|
vm.association(:ext_management_system).target = ems if vm.ems_id
vm.association(:ems_cluster).target = clusters[vm.ems_cluster_id] if vm.ems_cluster_id
vm.association(:host).target = host_ids[vm.host_id] if vm.host_id
ems.hosts.each do |host|
host.ems_cluster.association(:ext_management_system).target = ems if host.ems_cluster_id
next if options[:exclude_storages]

host.storages.each do |storage|
storage.ext_management_system = ems
end
end
host_ids = ems.hosts.index_by(&:id)
clusters = ems.hosts.flat_map(&:ems_cluster).uniq.compact.index_by(&:id)
ems.vms.each do |vm|
vm.association(:ext_management_system).target = ems if vm.ems_id
vm.association(:ems_cluster).target = clusters[vm.ems_cluster_id] if vm.ems_cluster_id
vm.association(:host).target = host_ids[vm.host_id] if vm.host_id
end
end

def capture_host_targets(emses)
def capture_host_targets(ems)
# NOTE: if capture_storage_targets takes only enabled hosts
# merge only_enabled into this method
emses.flat_map(&:hosts)
ems.hosts
end

# @param [Host] all hosts that have an ems
# @param [Array<Host>] all hosts that have an ems
# NOTE: disabled hosts are passed in.
# @return [Array<Storage>] supported storages
# hosts preloaded storages and tags
def capture_storage_targets(hosts)
hosts.flat_map(&:storages).uniq.select { |s| Storage.supports?(s.store_type) & s.perf_capture_enabled? }
end

# @param [Array<ExtManagementSystem>] emses Typically 1 ems for this zone
# @param [Host] hosts that are enabled or cluster enabled
# @param [ExtManagementSystem] ems
# @param [Array<Host>] hosts that are enabled or cluster enabled
# we want to work with only enabled_hosts, so hosts needs to be further filtered
def capture_vm_targets(emses, hosts)
def capture_vm_targets(ems, hosts)
enabled_host_ids = hosts.select(&:perf_capture_enabled?).index_by(&:id)
emses.flat_map { |e| e.vms.select { |v| enabled_host_ids.key?(v.host_id) && v.state == 'on' && v.supports_capture? } }
ems.vms.select { |v| enabled_host_ids.key?(v.host_id) && v.state == 'on' && v.supports_capture? }
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@

describe ".capture_ems_targets" do
it "finds enabled targets" do
targets = described_class.new(nil, ems).send(:capture_ems_targets)
targets = described_class.new(nil, ems).capture_ems_targets
assert_infra_targets_enabled targets
expect(targets.map { |t| t.class.name }).to match_array(%w[ManageIQ::Providers::Vmware::InfraManager::Vm ManageIQ::Providers::Vmware::InfraManager::Host ManageIQ::Providers::Vmware::InfraManager::Host ManageIQ::Providers::Vmware::InfraManager::Vm ManageIQ::Providers::Vmware::InfraManager::Host Storage])
end

it "finds enabled targets excluding storages" do
targets = described_class.new(nil, ems).send(:capture_ems_targets, :exclude_storages => true)
targets = described_class.new(nil, ems).capture_ems_targets(:exclude_storages => true)
assert_infra_targets_enabled targets
expect(targets.map { |t| t.class.name }).to match_array(%w[ManageIQ::Providers::Vmware::InfraManager::Vm ManageIQ::Providers::Vmware::InfraManager::Host ManageIQ::Providers::Vmware::InfraManager::Host ManageIQ::Providers::Vmware::InfraManager::Vm ManageIQ::Providers::Vmware::InfraManager::Host])
end
Expand Down

0 comments on commit 5f25d71

Please sign in to comment.