From 4444d75c07078ad89455caada436bfc052a7bce4 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 09:20:30 -0500 Subject: [PATCH 01/14] Add a mode param to control disconnects --- app/models/ems_refresh/save_inventory.rb | 6 +++--- .../ems_refresh/save_inventory_infra.rb | 20 +++++++++---------- .../save_inventory_orchestration_stacks.rb | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/models/ems_refresh/save_inventory.rb b/app/models/ems_refresh/save_inventory.rb index 5f032656bf3..d95c9fc9581 100644 --- a/app/models/ems_refresh/save_inventory.rb +++ b/app/models/ems_refresh/save_inventory.rb @@ -1,5 +1,5 @@ module EmsRefresh::SaveInventory - def save_ems_inventory(ems, hashes, target = nil) + def save_ems_inventory(ems, hashes, target = nil, mode = :refresh) if hashes.kind_of?(Array) ManagerRefresh::SaveInventory.save_inventory(ems, hashes) return @@ -7,7 +7,7 @@ def save_ems_inventory(ems, hashes, target = nil) case ems when EmsCloud then save_ems_cloud_inventory(ems, hashes, target) - when EmsInfra then save_ems_infra_inventory(ems, hashes, target) + when EmsInfra then save_ems_infra_inventory(ems, hashes, target, mode) when EmsPhysicalInfra then save_ems_physical_infra_inventory(ems, hashes, target) when ManageIQ::Providers::AutomationManager then save_automation_manager_inventory(ems, hashes, target) when ManageIQ::Providers::ConfigurationManager then save_configuration_manager_inventory(ems, hashes, target) @@ -22,7 +22,7 @@ def save_ems_inventory(ems, hashes, target = nil) # Shared between Cloud and Infra # - def save_vms_inventory(ems, hashes, target = nil) + def save_vms_inventory(ems, hashes, target = nil, mode = :refresh) return if hashes.nil? target = ems if target.nil? log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" diff --git a/app/models/ems_refresh/save_inventory_infra.rb b/app/models/ems_refresh/save_inventory_infra.rb index 51261b477d1..bd9eb83da87 100644 --- a/app/models/ems_refresh/save_inventory_infra.rb +++ b/app/models/ems_refresh/save_inventory_infra.rb @@ -34,7 +34,7 @@ # module EmsRefresh::SaveInventoryInfra - def save_ems_infra_inventory(ems, hashes, target = nil) + def save_ems_infra_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" @@ -66,7 +66,7 @@ def save_ems_infra_inventory(ems, hashes, target = nil) ] # Save and link other subsections - save_child_inventory(ems, hashes, child_keys, target) + save_child_inventory(ems, hashes, child_keys, target, mode) link_floating_ips_to_network_ports(hashes[:floating_ips]) if hashes.key?(:floating_ips) link_cloud_subnets_to_network_routers(hashes[:cloud_subnets]) if hashes.key?(:cloud_subnets) @@ -83,7 +83,7 @@ def save_ems_infra_inventory(ems, hashes, target = nil) ems end - def save_storages_inventory(ems, hashes, target = nil) + def save_storages_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" @@ -113,7 +113,7 @@ def save_storages_inventory(ems, hashes, target = nil) end end - def save_hosts_inventory(ems, hashes, target = nil) + def save_hosts_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" @@ -219,7 +219,7 @@ def save_hosts_inventory(ems, hashes, target = nil) end end - def save_host_storages_inventory(host, hashes, target = nil) + def save_host_storages_inventory(host, hashes, target = nil, mode = :refresh) target = host if target.nil? # Update the associated ids @@ -239,7 +239,7 @@ def save_host_storages_inventory(host, hashes, target = nil) save_inventory_multi(host.host_storages, hashes, deletes, [:host_id, :storage_id], nil, [:storage]) end - def save_folders_inventory(ems, hashes, target = nil) + def save_folders_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? ems.ems_folders.reset @@ -254,7 +254,7 @@ def save_folders_inventory(ems, hashes, target = nil) end alias_method :save_ems_folders_inventory, :save_folders_inventory - def save_clusters_inventory(ems, hashes, target = nil) + def save_clusters_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? ems.ems_clusters.reset @@ -269,7 +269,7 @@ def save_clusters_inventory(ems, hashes, target = nil) end alias_method :save_ems_clusters_inventory, :save_clusters_inventory - def save_resource_pools_inventory(ems, hashes, target = nil) + def save_resource_pools_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? ems.resource_pools.reset @@ -285,7 +285,7 @@ def save_resource_pools_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.resource_pools, hashes, :uid_ems) end - def save_storage_profiles_inventory(ems, hashes, target = nil) + def save_storage_profiles_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? ems.storage_profiles.reset @@ -312,7 +312,7 @@ def save_storage_profile_storages_inventory(storage_profile, storages) [], [:storage_profile_id, :storage_id]) end - def save_customization_specs_inventory(ems, hashes, _target = nil) + def save_customization_specs_inventory(ems, hashes, _target = nil, _mode = :refresh) save_inventory_multi(ems.customization_specs, hashes, :use_association, [:name]) end diff --git a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb index dc88de0b4a5..7d1daca3f4e 100644 --- a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb +++ b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb @@ -8,7 +8,7 @@ module EmsRefresh module SaveInventoryOrchestrationStacks - def save_orchestration_templates_inventory(_ems, hashes, _target = nil) + def save_orchestration_templates_inventory(_ems, hashes, _target = nil, _mode = :refresh) # cloud_stack_template does not belong to an ems; # only to create new if necessary, but not to update existing template templates = OrchestrationTemplate.find_or_create_by_contents(hashes) @@ -28,7 +28,7 @@ def save_orchestration_templates_catalog_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.orchestration_templates, hashes, :ems_ref) end - def save_orchestration_stacks_inventory(ems, hashes, target = nil) + def save_orchestration_stacks_inventory(ems, hashes, target = nil, mode = :refresh) target = ems if target.nil? deletes = target == ems ? :use_association : [] From 55568e5b51a2d3f610bc4c7fdd0f4de838e106a3 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 09:23:15 -0500 Subject: [PATCH 02/14] Don't disconnect anything unless mode is refresh --- app/models/ems_refresh/metadata_relats.rb | 5 +++-- app/models/ems_refresh/save_inventory.rb | 2 +- app/models/ems_refresh/save_inventory_infra.rb | 16 ++++++++-------- .../save_inventory_orchestration_stacks.rb | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/models/ems_refresh/metadata_relats.rb b/app/models/ems_refresh/metadata_relats.rb index 9e41f7ed1dc..56e0852a673 100644 --- a/app/models/ems_refresh/metadata_relats.rb +++ b/app/models/ems_refresh/metadata_relats.rb @@ -5,9 +5,10 @@ module EmsRefresh::MetadataRelats # TODO: Replace with more efficient lookup methods using new relationships def vmdb_relats(target, relats = nil) - _log.info "Getting VMDB relationships for #{target.class} [#{target.name}] id: [#{target.id}]..." - relats ||= default_relats_hash + return relats if target.nil? + + _log.info "Getting VMDB relationships for #{target.class} [#{target.name}] id: [#{target.id}]..." if target.kind_of?(ExtManagementSystem) vmdb_relats_ems(target, relats) else diff --git a/app/models/ems_refresh/save_inventory.rb b/app/models/ems_refresh/save_inventory.rb index d95c9fc9581..dc526c21851 100644 --- a/app/models/ems_refresh/save_inventory.rb +++ b/app/models/ems_refresh/save_inventory.rb @@ -24,7 +24,7 @@ def save_ems_inventory(ems, hashes, target = nil, mode = :refresh) def save_vms_inventory(ems, hashes, target = nil, mode = :refresh) return if hashes.nil? - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" disconnects = if target.kind_of?(ExtManagementSystem) || target.kind_of?(Host) diff --git a/app/models/ems_refresh/save_inventory_infra.rb b/app/models/ems_refresh/save_inventory_infra.rb index bd9eb83da87..633dd2755e0 100644 --- a/app/models/ems_refresh/save_inventory_infra.rb +++ b/app/models/ems_refresh/save_inventory_infra.rb @@ -35,7 +35,7 @@ module EmsRefresh::SaveInventoryInfra def save_ems_infra_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" # Check if the data coming in reflects a complete removal from the ems @@ -84,7 +84,7 @@ def save_ems_infra_inventory(ems, hashes, target = nil, mode = :refresh) end def save_storages_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" # Query for all of the storages ahead of time @@ -114,7 +114,7 @@ def save_storages_inventory(ems, hashes, target = nil, mode = :refresh) end def save_hosts_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" disconnects = if (target == ems) @@ -220,7 +220,7 @@ def save_hosts_inventory(ems, hashes, target = nil, mode = :refresh) end def save_host_storages_inventory(host, hashes, target = nil, mode = :refresh) - target = host if target.nil? + target = host if target.nil? && mode == :refresh # Update the associated ids hashes.each do |h| @@ -240,7 +240,7 @@ def save_host_storages_inventory(host, hashes, target = nil, mode = :refresh) end def save_folders_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh ems.ems_folders.reset deletes = if (target == ems) @@ -255,7 +255,7 @@ def save_folders_inventory(ems, hashes, target = nil, mode = :refresh) alias_method :save_ems_folders_inventory, :save_folders_inventory def save_clusters_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh ems.ems_clusters.reset deletes = if (target == ems) @@ -270,7 +270,7 @@ def save_clusters_inventory(ems, hashes, target = nil, mode = :refresh) alias_method :save_ems_clusters_inventory, :save_clusters_inventory def save_resource_pools_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh ems.resource_pools.reset deletes = if (target == ems) @@ -286,7 +286,7 @@ def save_resource_pools_inventory(ems, hashes, target = nil, mode = :refresh) end def save_storage_profiles_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh ems.storage_profiles.reset deletes = diff --git a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb index 7d1daca3f4e..2fc22716766 100644 --- a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb +++ b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb @@ -29,7 +29,7 @@ def save_orchestration_templates_catalog_inventory(ems, hashes, target = nil) end def save_orchestration_stacks_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? + target = ems if target.nil? && mode == :refresh deletes = target == ems ? :use_association : [] From 0accaeba1f38f16b39eca47018c8fc0aa5e4608a Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 09:32:16 -0500 Subject: [PATCH 03/14] Add a way to find the new target to refresh_new_target --- app/models/ems_event/automate.rb | 4 ++-- app/models/ems_refresh.rb | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/models/ems_event/automate.rb b/app/models/ems_event/automate.rb index d00e7c1d34b..a814ac04016 100644 --- a/app/models/ems_event/automate.rb +++ b/app/models/ems_event/automate.rb @@ -27,9 +27,9 @@ 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, event_type) + target_hash, target_class, target_find = ep_class.parse_new_target(full_data, message, ems, event_type) - EmsRefresh.queue_refresh_new_target(target_hash, ems) + EmsRefresh.queue_refresh_new_target(ems, target_hash, target_class, target_find) else EmsRefresh.queue_refresh(ems) end diff --git a/app/models/ems_refresh.rb b/app/models/ems_refresh.rb index eda9713ada8..d9ada8ebf8e 100644 --- a/app/models/ems_refresh.rb +++ b/app/models/ems_refresh.rb @@ -63,14 +63,14 @@ def self.queue_refresh(target, id = nil, opts = {}) return task_ids if opts[:create_task] end - def self.queue_refresh_new_target(target_hash, ems) + def self.queue_refresh_new_target(ems, target_hash, target_class, target_find) 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], + :args => [ems.id, target_hash, target_class, target_find], :msg_timeout => queue_timeout, :task_id => nil ) @@ -98,10 +98,12 @@ def self.refresh(target, id = nil) end end - def self.refresh_new_target(target_hash, ems_id) + def self.refresh_new_target(ems_id, target_hash, target_class, target_find) ems = ExtManagementSystem.find(ems_id) - target = save_new_target(ems, target_hash) + save_new_target(target_hash) + + target = target_class.find_by(target_find) if target.nil? _log.warn "Unknown target for event data: #{target_hash}." return From c3b5ad269147d42e8e43d0228d7d10b7dd4dbb08 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 09:50:59 -0500 Subject: [PATCH 04/14] Use save_ems_inventory in refresh_new_target --- app/models/ems_refresh.rb | 2 +- spec/models/ems_refresh_spec.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/models/ems_refresh.rb b/app/models/ems_refresh.rb index d9ada8ebf8e..d564c2b06b6 100644 --- a/app/models/ems_refresh.rb +++ b/app/models/ems_refresh.rb @@ -101,7 +101,7 @@ def self.refresh(target, id = nil) def self.refresh_new_target(ems_id, target_hash, target_class, target_find) ems = ExtManagementSystem.find(ems_id) - save_new_target(target_hash) + save_ems_inventory(ems, target_hash, nil, :refresh_new_target) target = target_class.find_by(target_find) if target.nil? diff --git a/spec/models/ems_refresh_spec.rb b/spec/models/ems_refresh_spec.rb index 9e85db3537a..5f774881348 100644 --- a/spec/models/ems_refresh_spec.rb +++ b/spec/models/ems_refresh_spec.rb @@ -178,6 +178,32 @@ def assert_queue_item(expected_targets) end end + context '.refresh_new_target' do + let(:ems) { FactoryGirl.create(:ems_vmware) } + + context 'targeting a new vm' do + let(:vm_hash) do + { + :type => ManageIQ::Providers::InfraManager::Vm.name, + :ems_ref => 'vm-123', + :ems_ref_obj => 'vm-123', + :uid_ems => 'vm-123', + :name => 'new-vm', + :vendor => 'unknown' + } + end + + it 'creates the new record' do + target_hash = {:vms => [vm_hash]} + target_klass = vm_hash[:type].constantize + target_find = {:uid_ems => vm_hash[:uid_ems]} + + expect(ems.refresher).to receive(:refresh) + described_class.refresh_new_target(ems.id, target_hash, target_klass, target_find) + end + end + end + context '.queue_merge' do let(:ems) { FactoryGirl.create(:ems_vmware, :name => "ems_vmware1") } let(:vm) { FactoryGirl.create(:vm_vmware, :name => "vm_vmware1", :ext_management_system => ems) } From d71a8a57512c5310c383b1ee2c4bdde4ad2d2625 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 10:01:50 -0500 Subject: [PATCH 05/14] Remove save_new_target method --- app/models/ems_refresh/save_inventory.rb | 29 ------------------- .../ems_refresh/save_inventory_helper.rb | 18 ------------ 2 files changed, 47 deletions(-) diff --git a/app/models/ems_refresh/save_inventory.rb b/app/models/ems_refresh/save_inventory.rb index dc526c21851..583885ac62b 100644 --- a/app/models/ems_refresh/save_inventory.rb +++ b/app/models/ems_refresh/save_inventory.rb @@ -352,35 +352,6 @@ def save_event_logs_inventory(os, hashes) save_inventory_multi(os.event_logs, hashes, :use_association, [:uid]) end - def save_new_target(ems, target_hash) - if target_hash[:vm] - 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 - - 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 - elsif target_hash[:folder] - ems.ems_folders.create!(target_hash[:folder]) - end - end - # # Storage managers can support many different types of storages. We thus rely # on the supports feature of the manager to choose which parts of the diff --git a/app/models/ems_refresh/save_inventory_helper.rb b/app/models/ems_refresh/save_inventory_helper.rb index 9d6e32e9a9f..1869d5cd4b3 100644 --- a/app/models/ems_refresh/save_inventory_helper.rb +++ b/app/models/ems_refresh/save_inventory_helper.rb @@ -177,22 +177,4 @@ 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 From 0e65a3d8c5beb5f3f055c2f062c849faa55893d3 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 10:25:55 -0500 Subject: [PATCH 06/14] Add test to link up new VM to existing host --- spec/models/ems_refresh_spec.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spec/models/ems_refresh_spec.rb b/spec/models/ems_refresh_spec.rb index 5f774881348..e4b8a45741f 100644 --- a/spec/models/ems_refresh_spec.rb +++ b/spec/models/ems_refresh_spec.rb @@ -200,6 +200,31 @@ def assert_queue_item(expected_targets) expect(ems.refresher).to receive(:refresh) described_class.refresh_new_target(ems.id, target_hash, target_klass, target_find) + + new_vm = target_klass.find_by(target_find) + expect(new_vm).to have_attributes(vm_hash) + end + + context 'on an existing host' do + let(:host) { FactoryGirl.create(:host_with_ref, :ext_management_system => ems) } + + it 'links the new vm to the existing host' do + target_hash = { + :hosts => [{:ems_ref => host.ems_ref}] + } + + vm_hash[:host] = target_hash[:hosts].first + target_hash[:vms] = [vm_hash] + + target_find = {:uid_ems => vm_hash[:uid_ems]} + target_klass = vm_hash[:type].constantize + + expect(ems.refresher).to receive(:refresh) + described_class.refresh_new_target(ems.id, target_hash, target_klass, target_find) + + new_vm = target_klass.find_by(target_find) + expect(new_vm.host).to eq(host) + end end end end From 36b33effe00bd19624423be59576b5deb4fd7d5e Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 12:55:41 -0500 Subject: [PATCH 07/14] Add test targeting an existing vm --- spec/models/ems_refresh_spec.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/spec/models/ems_refresh_spec.rb b/spec/models/ems_refresh_spec.rb index e4b8a45741f..b488720f710 100644 --- a/spec/models/ems_refresh_spec.rb +++ b/spec/models/ems_refresh_spec.rb @@ -227,6 +227,26 @@ def assert_queue_item(expected_targets) end end end + + context 'targeting an existing vm' do + let(:vm) { FactoryGirl.create(:vm_with_ref, :ext_management_system => ems) } + + it "doesn't try to create a new record" do + vm_hash = { + :ems_ref => vm.ems_ref, + :uid_ems => vm.uid_ems, + :type => vm.class.name + } + target_hash = {:vms => [vm_hash]} + target_klass = vm_hash[:type].constantize + target_find = {:uid_ems => vm_hash[:uid_ems]} + + expect(ems.vms_and_templates.klass).not_to receive(:new) + expect(ems.refresher).to receive(:refresh) + + described_class.refresh_new_target(ems.id, target_hash, target_klass, target_find) + end + end end context '.queue_merge' do From 049e7314001975a79267a5b643449e0a56e978ad Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 9 Mar 2017 13:10:25 -0500 Subject: [PATCH 08/14] Test adopting an archived vm in refresh_new_target --- spec/models/ems_refresh_spec.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spec/models/ems_refresh_spec.rb b/spec/models/ems_refresh_spec.rb index b488720f710..b234939980d 100644 --- a/spec/models/ems_refresh_spec.rb +++ b/spec/models/ems_refresh_spec.rb @@ -247,6 +247,28 @@ def assert_queue_item(expected_targets) described_class.refresh_new_target(ems.id, target_hash, target_klass, target_find) end end + + context 'targeting an archived vm' do + let(:vm) { FactoryGirl.create(:vm_with_ref, :ems_id => nil) } + + it 'adopts the existing vm' do + vm_hash = { + :ems_ref => vm.ems_ref, + :uid_ems => vm.uid_ems, + :type => vm.class.name + } + target_hash = {:vms => [vm_hash]} + target_klass = vm_hash[:type].constantize + target_find = {:uid_ems => vm_hash[:uid_ems]} + + expect(ems.refresher).to receive(:refresh) + + described_class.refresh_new_target(ems.id, target_hash, target_klass, target_find) + + vm.reload + expect(vm.ext_management_system).to eq(ems) + end + end end context '.queue_merge' do From 9d0a94d3530b6fee0e2a9fbac74df60228ebcbca Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Tue, 18 Apr 2017 15:37:14 -0400 Subject: [PATCH 09/14] Add save_ems_inventory_no_disconnect method --- app/models/ems_refresh.rb | 2 +- app/models/ems_refresh/save_inventory.rb | 12 ++++--- .../ems_refresh/save_inventory_infra.rb | 36 +++++++++---------- .../save_inventory_orchestration_stacks.rb | 6 ++-- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/app/models/ems_refresh.rb b/app/models/ems_refresh.rb index d564c2b06b6..c707d869e3c 100644 --- a/app/models/ems_refresh.rb +++ b/app/models/ems_refresh.rb @@ -101,7 +101,7 @@ def self.refresh(target, id = nil) def self.refresh_new_target(ems_id, target_hash, target_class, target_find) ems = ExtManagementSystem.find(ems_id) - save_ems_inventory(ems, target_hash, nil, :refresh_new_target) + save_ems_inventory_no_disconnect(ems, target_hash) target = target_class.find_by(target_find) if target.nil? diff --git a/app/models/ems_refresh/save_inventory.rb b/app/models/ems_refresh/save_inventory.rb index 583885ac62b..7c6d812c199 100644 --- a/app/models/ems_refresh/save_inventory.rb +++ b/app/models/ems_refresh/save_inventory.rb @@ -1,5 +1,5 @@ module EmsRefresh::SaveInventory - def save_ems_inventory(ems, hashes, target = nil, mode = :refresh) + def save_ems_inventory(ems, hashes, target = nil, disconnect = true) if hashes.kind_of?(Array) ManagerRefresh::SaveInventory.save_inventory(ems, hashes) return @@ -7,7 +7,7 @@ def save_ems_inventory(ems, hashes, target = nil, mode = :refresh) case ems when EmsCloud then save_ems_cloud_inventory(ems, hashes, target) - when EmsInfra then save_ems_infra_inventory(ems, hashes, target, mode) + when EmsInfra then save_ems_infra_inventory(ems, hashes, target, disconnect) when EmsPhysicalInfra then save_ems_physical_infra_inventory(ems, hashes, target) when ManageIQ::Providers::AutomationManager then save_automation_manager_inventory(ems, hashes, target) when ManageIQ::Providers::ConfigurationManager then save_configuration_manager_inventory(ems, hashes, target) @@ -18,13 +18,17 @@ def save_ems_inventory(ems, hashes, target = nil, mode = :refresh) end end + def save_ems_inventory_no_disconnect(ems, hashes, target = nil) + save_ems_inventory(ems, hashes, target, false) + end + # # Shared between Cloud and Infra # - def save_vms_inventory(ems, hashes, target = nil, mode = :refresh) + def save_vms_inventory(ems, hashes, target = nil, disconnect = true) return if hashes.nil? - target = ems if target.nil? && mode == :refresh + target = ems if target.nil? && disconnect log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" disconnects = if target.kind_of?(ExtManagementSystem) || target.kind_of?(Host) diff --git a/app/models/ems_refresh/save_inventory_infra.rb b/app/models/ems_refresh/save_inventory_infra.rb index 633dd2755e0..cf933951a52 100644 --- a/app/models/ems_refresh/save_inventory_infra.rb +++ b/app/models/ems_refresh/save_inventory_infra.rb @@ -34,8 +34,8 @@ # module EmsRefresh::SaveInventoryInfra - def save_ems_infra_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_ems_infra_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" # Check if the data coming in reflects a complete removal from the ems @@ -66,7 +66,7 @@ def save_ems_infra_inventory(ems, hashes, target = nil, mode = :refresh) ] # Save and link other subsections - save_child_inventory(ems, hashes, child_keys, target, mode) + save_child_inventory(ems, hashes, child_keys, target, disconnect) link_floating_ips_to_network_ports(hashes[:floating_ips]) if hashes.key?(:floating_ips) link_cloud_subnets_to_network_routers(hashes[:cloud_subnets]) if hashes.key?(:cloud_subnets) @@ -83,8 +83,8 @@ def save_ems_infra_inventory(ems, hashes, target = nil, mode = :refresh) ems end - def save_storages_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_storages_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" # Query for all of the storages ahead of time @@ -113,8 +113,8 @@ def save_storages_inventory(ems, hashes, target = nil, mode = :refresh) end end - def save_hosts_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_hosts_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" disconnects = if (target == ems) @@ -219,8 +219,8 @@ def save_hosts_inventory(ems, hashes, target = nil, mode = :refresh) end end - def save_host_storages_inventory(host, hashes, target = nil, mode = :refresh) - target = host if target.nil? && mode == :refresh + def save_host_storages_inventory(host, hashes, target = nil, disconnect = true) + target = host if target.nil? && disconnect # Update the associated ids hashes.each do |h| @@ -239,8 +239,8 @@ def save_host_storages_inventory(host, hashes, target = nil, mode = :refresh) save_inventory_multi(host.host_storages, hashes, deletes, [:host_id, :storage_id], nil, [:storage]) end - def save_folders_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_folders_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect ems.ems_folders.reset deletes = if (target == ems) @@ -254,8 +254,8 @@ def save_folders_inventory(ems, hashes, target = nil, mode = :refresh) end alias_method :save_ems_folders_inventory, :save_folders_inventory - def save_clusters_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_clusters_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect ems.ems_clusters.reset deletes = if (target == ems) @@ -269,8 +269,8 @@ def save_clusters_inventory(ems, hashes, target = nil, mode = :refresh) end alias_method :save_ems_clusters_inventory, :save_clusters_inventory - def save_resource_pools_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_resource_pools_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect ems.resource_pools.reset deletes = if (target == ems) @@ -285,8 +285,8 @@ def save_resource_pools_inventory(ems, hashes, target = nil, mode = :refresh) store_ids_for_new_records(ems.resource_pools, hashes, :uid_ems) end - def save_storage_profiles_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_storage_profiles_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect ems.storage_profiles.reset deletes = @@ -312,7 +312,7 @@ def save_storage_profile_storages_inventory(storage_profile, storages) [], [:storage_profile_id, :storage_id]) end - def save_customization_specs_inventory(ems, hashes, _target = nil, _mode = :refresh) + def save_customization_specs_inventory(ems, hashes, _target = nil, _disconnect = true) save_inventory_multi(ems.customization_specs, hashes, :use_association, [:name]) end diff --git a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb index 2fc22716766..cd9023c21a7 100644 --- a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb +++ b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb @@ -8,7 +8,7 @@ module EmsRefresh module SaveInventoryOrchestrationStacks - def save_orchestration_templates_inventory(_ems, hashes, _target = nil, _mode = :refresh) + def save_orchestration_templates_inventory(_ems, hashes, _target = nil, _disconnect = true) # cloud_stack_template does not belong to an ems; # only to create new if necessary, but not to update existing template templates = OrchestrationTemplate.find_or_create_by_contents(hashes) @@ -28,8 +28,8 @@ def save_orchestration_templates_catalog_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.orchestration_templates, hashes, :ems_ref) end - def save_orchestration_stacks_inventory(ems, hashes, target = nil, mode = :refresh) - target = ems if target.nil? && mode == :refresh + def save_orchestration_stacks_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? && disconnect deletes = target == ems ? :use_association : [] From 74c63495818a28fbe198a0cba4b39f7d3aed316c Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Wed, 19 Apr 2017 09:22:13 -0400 Subject: [PATCH 10/14] Add disconnect to save_inventory_cloud --- app/models/ems_refresh/save_inventory.rb | 2 +- .../ems_refresh/save_inventory_cloud.rb | 32 +++++++++---------- .../ems_refresh/save_inventory_infra.rb | 8 ++--- .../save_inventory_orchestration_stacks.rb | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/models/ems_refresh/save_inventory.rb b/app/models/ems_refresh/save_inventory.rb index 7c6d812c199..f5c78c636ed 100644 --- a/app/models/ems_refresh/save_inventory.rb +++ b/app/models/ems_refresh/save_inventory.rb @@ -6,7 +6,7 @@ def save_ems_inventory(ems, hashes, target = nil, disconnect = true) end case ems - when EmsCloud then save_ems_cloud_inventory(ems, hashes, target) + when EmsCloud then save_ems_cloud_inventory(ems, hashes, target, disconnect) when EmsInfra then save_ems_infra_inventory(ems, hashes, target, disconnect) when EmsPhysicalInfra then save_ems_physical_infra_inventory(ems, hashes, target) when ManageIQ::Providers::AutomationManager then save_automation_manager_inventory(ems, hashes, target) diff --git a/app/models/ems_refresh/save_inventory_cloud.rb b/app/models/ems_refresh/save_inventory_cloud.rb index 8d868ad4a3e..2f09d65ba37 100644 --- a/app/models/ems_refresh/save_inventory_cloud.rb +++ b/app/models/ems_refresh/save_inventory_cloud.rb @@ -29,13 +29,13 @@ # module EmsRefresh::SaveInventoryCloud - def save_ems_cloud_inventory(ems, hashes, target = nil) + def save_ems_cloud_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" # Check if the data coming in reflects a complete removal from the ems if hashes.blank? - target.disconnect_inv + target.disconnect_inv if disconnect return end @@ -66,7 +66,7 @@ def save_ems_cloud_inventory(ems, hashes, target = nil) ] # Save and link other subsections - save_child_inventory(ems, hashes, child_keys, target) + save_child_inventory(ems, hashes, child_keys, target, disconnect) link_volumes_to_base_snapshots(hashes[:cloud_volumes]) if hashes.key?(:cloud_volumes) link_parents_to_cloud_tenant(hashes[:cloud_tenants]) if hashes.key?(:cloud_tenants) @@ -79,7 +79,7 @@ def save_ems_cloud_inventory(ems, hashes, target = nil) ems end - def save_flavors_inventory(ems, hashes, target = nil) + def save_flavors_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.flavors.reset @@ -97,7 +97,7 @@ def save_flavors_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.flavors, hashes, :ems_ref) end - def save_availability_zones_inventory(ems, hashes, target = nil) + def save_availability_zones_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.availability_zones.reset @@ -111,7 +111,7 @@ def save_availability_zones_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.availability_zones, hashes, :ems_ref) end - def save_host_aggregates_inventory(ems, hashes, target = nil) + def save_host_aggregates_inventory(ems, hashes, target = nil, disconnect = true) target ||= ems ems.host_aggregates.reset @@ -126,7 +126,7 @@ def save_host_aggregates_inventory(ems, hashes, target = nil) # FIXME: what about hosts? end - def save_cloud_tenants_inventory(ems, hashes, target = nil) + def save_cloud_tenants_inventory(ems, hashes, target = nil, disconnect = true) target ||= ems ems.cloud_tenants.reset @@ -140,7 +140,7 @@ def save_cloud_tenants_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.cloud_tenants, hashes, :ems_ref) end - def save_cloud_resource_quotas_inventory(ems, hashes, target = nil) + def save_cloud_resource_quotas_inventory(ems, hashes, target = nil, disconnect = true) target ||= ems ems.cloud_resource_quotas.reset @@ -158,7 +158,7 @@ def save_cloud_resource_quotas_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.cloud_resource_quotas, hashes, [:ems_ref, :name]) end - def save_key_pairs_inventory(ems, hashes, target = nil) + def save_key_pairs_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.key_pairs.reset @@ -172,7 +172,7 @@ def save_key_pairs_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.key_pairs, hashes, :name) end - def save_cloud_volumes_inventory(ems, hashes, target = nil) + def save_cloud_volumes_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_volumes.reset @@ -193,7 +193,7 @@ def save_cloud_volumes_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.cloud_volumes, hashes, :ems_ref) end - def save_cloud_volume_backups_inventory(ems, hashes, target = nil) + def save_cloud_volume_backups_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_volume_backups.reset @@ -214,7 +214,7 @@ def save_cloud_volume_backups_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.cloud_volume_backups, hashes, :ems_ref) end - def save_cloud_volume_snapshots_inventory(ems, hashes, target = nil) + def save_cloud_volume_snapshots_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_volume_snapshots.reset @@ -261,7 +261,7 @@ def link_parents_to_cloud_tenant(hashes) end end - def save_cloud_object_store_containers_inventory(ems, hashes, target = nil) + def save_cloud_object_store_containers_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_object_store_containers.reset @@ -280,7 +280,7 @@ def save_cloud_object_store_containers_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.cloud_object_store_containers, hashes, :ems_ref) end - def save_cloud_object_store_objects_inventory(ems, hashes, target = nil) + def save_cloud_object_store_objects_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_object_store_objects.reset @@ -300,7 +300,7 @@ def save_cloud_object_store_objects_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.cloud_object_store_objects, hashes, :ems_ref) end - def save_resource_groups_inventory(ems, hashes, target = nil) + def save_resource_groups_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.resource_groups.reset @@ -314,7 +314,7 @@ def save_resource_groups_inventory(ems, hashes, target = nil) store_ids_for_new_records(ems.resource_groups, hashes, :ems_ref) end - def save_cloud_services_inventory(ems, hashes, target = nil) + def save_cloud_services_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_services.reset diff --git a/app/models/ems_refresh/save_inventory_infra.rb b/app/models/ems_refresh/save_inventory_infra.rb index cf933951a52..3e0066b15a5 100644 --- a/app/models/ems_refresh/save_inventory_infra.rb +++ b/app/models/ems_refresh/save_inventory_infra.rb @@ -35,12 +35,12 @@ module EmsRefresh::SaveInventoryInfra def save_ems_infra_inventory(ems, hashes, target = nil, disconnect = true) - target = ems if target.nil? && disconnect + target = ems if target.nil? log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" # Check if the data coming in reflects a complete removal from the ems if hashes.blank? || (hashes[:hosts].blank? && hashes[:vms].blank? && hashes[:storages].blank? && hashes[:folders].blank?) - target.disconnect_inv + target.disconnect_inv if disconnect return end @@ -83,8 +83,8 @@ def save_ems_infra_inventory(ems, hashes, target = nil, disconnect = true) ems end - def save_storages_inventory(ems, hashes, target = nil, disconnect = true) - target = ems if target.nil? && disconnect + def save_storages_inventory(ems, hashes, target = nil, _disconnect = true) + target = ems if target.nil? log_header = "EMS: [#{ems.name}], id: [#{ems.id}]" # Query for all of the storages ahead of time diff --git a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb index cd9023c21a7..321717ab2d1 100644 --- a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb +++ b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb @@ -15,7 +15,7 @@ def save_orchestration_templates_inventory(_ems, hashes, _target = nil, _disconn hashes.zip(templates).each { |hash, template| hash[:id] = template.id } end - def save_orchestration_templates_catalog_inventory(ems, hashes, target = nil) + def save_orchestration_templates_catalog_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? deletes = target == ems ? :use_association : [] From 278af66456bafeed157ed6863c3c3d7d2f158870 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Wed, 19 Apr 2017 09:48:11 -0400 Subject: [PATCH 11/14] Add disconnect with assoc helper method --- .../ems_refresh/save_inventory_cloud.rb | 78 ++++--------------- .../ems_refresh/save_inventory_helper.rb | 8 ++ .../ems_refresh/save_inventory_infra.rb | 45 ++++------- .../save_inventory_orchestration_stacks.rb | 6 +- 4 files changed, 41 insertions(+), 96 deletions(-) diff --git a/app/models/ems_refresh/save_inventory_cloud.rb b/app/models/ems_refresh/save_inventory_cloud.rb index 2f09d65ba37..cf6552532d3 100644 --- a/app/models/ems_refresh/save_inventory_cloud.rb +++ b/app/models/ems_refresh/save_inventory_cloud.rb @@ -83,11 +83,7 @@ def save_flavors_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.flavors.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:cloud_tenant_ids] = (h.delete(:cloud_tenants) || []).compact.map { |x| x[:id] }.uniq @@ -101,11 +97,7 @@ def save_availability_zones_inventory(ems, hashes, target = nil, disconnect = tr target = ems if target.nil? ems.availability_zones.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.availability_zones, hashes, deletes, [:ems_ref]) store_ids_for_new_records(ems.availability_zones, hashes, :ems_ref) @@ -115,11 +107,7 @@ def save_host_aggregates_inventory(ems, hashes, target = nil, disconnect = true) target ||= ems ems.host_aggregates.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.host_aggregates, hashes, deletes, [:ems_ref]) store_ids_for_new_records(ems.host_aggregates, hashes, :ems_ref) @@ -130,11 +118,7 @@ def save_cloud_tenants_inventory(ems, hashes, target = nil, disconnect = true) target ||= ems ems.cloud_tenants.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.cloud_tenants, hashes, deletes, [:ems_ref], nil, [:parent_id]) store_ids_for_new_records(ems.cloud_tenants, hashes, :ems_ref) @@ -144,11 +128,7 @@ def save_cloud_resource_quotas_inventory(ems, hashes, target = nil, disconnect = target ||= ems ems.cloud_resource_quotas.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:cloud_tenant_id] = h.fetch_path(:cloud_tenant, :id) @@ -162,11 +142,7 @@ def save_key_pairs_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.key_pairs.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.key_pairs, hashes, deletes, [:name]) store_ids_for_new_records(ems.key_pairs, hashes, :name) @@ -176,11 +152,7 @@ def save_cloud_volumes_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_volumes.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:ems_id] = ems.id @@ -197,11 +169,7 @@ def save_cloud_volume_backups_inventory(ems, hashes, target = nil, disconnect = target = ems if target.nil? ems.cloud_volume_backups.reset - deletes = if target == ems - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:ems_id] = ems.id @@ -218,11 +186,7 @@ def save_cloud_volume_snapshots_inventory(ems, hashes, target = nil, disconnect target = ems if target.nil? ems.cloud_volume_snapshots.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:ems_id] = ems.id @@ -265,11 +229,7 @@ def save_cloud_object_store_containers_inventory(ems, hashes, target = nil, disc target = ems if target.nil? ems.cloud_object_store_containers.reset - deletes = if target == ems - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:ems_id] = ems.id @@ -284,11 +244,7 @@ def save_cloud_object_store_objects_inventory(ems, hashes, target = nil, disconn target = ems if target.nil? ems.cloud_object_store_objects.reset - deletes = if target == ems - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:ems_id] = ems.id @@ -304,11 +260,7 @@ def save_resource_groups_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.resource_groups.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.resource_groups, hashes, deletes, [:ems_ref]) store_ids_for_new_records(ems.resource_groups, hashes, :ems_ref) @@ -318,11 +270,7 @@ def save_cloud_services_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? ems.cloud_services.reset - deletes = if target == ems - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.cloud_services, hashes, deletes, [:ems_ref]) store_ids_for_new_records(ems.cloud_services, hashes, :ems_ref) diff --git a/app/models/ems_refresh/save_inventory_helper.rb b/app/models/ems_refresh/save_inventory_helper.rb index 1869d5cd4b3..c2269650290 100644 --- a/app/models/ems_refresh/save_inventory_helper.rb +++ b/app/models/ems_refresh/save_inventory_helper.rb @@ -177,4 +177,12 @@ def relation_values(association, target) top_level && (target == true || target.nil? || parent == target) ? :use_association : [] end + + def determine_deletes_using_association(ems, target, disconnect = true) + if disconnect && target == ems + :use_association + else + [] + end + end end diff --git a/app/models/ems_refresh/save_inventory_infra.rb b/app/models/ems_refresh/save_inventory_infra.rb index 3e0066b15a5..8a82e3c1518 100644 --- a/app/models/ems_refresh/save_inventory_infra.rb +++ b/app/models/ems_refresh/save_inventory_infra.rb @@ -220,7 +220,7 @@ def save_hosts_inventory(ems, hashes, target = nil, disconnect = true) end def save_host_storages_inventory(host, hashes, target = nil, disconnect = true) - target = host if target.nil? && disconnect + target = host if target.nil? # Update the associated ids hashes.each do |h| @@ -229,25 +229,20 @@ def save_host_storages_inventory(host, hashes, target = nil, disconnect = true) end host.host_storages(true) - deletes = - if target == host - host.host_storages.dup - else - [] - end + deletes = if disconnect && target == host + host.host_storages.dup + else + [] + end save_inventory_multi(host.host_storages, hashes, deletes, [:host_id, :storage_id], nil, [:storage]) end def save_folders_inventory(ems, hashes, target = nil, disconnect = true) - target = ems if target.nil? && disconnect + target = ems if target.nil? ems.ems_folders.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.ems_folders, hashes, deletes, [:uid_ems], nil, :ems_children) store_ids_for_new_records(ems.ems_folders, hashes, :uid_ems) @@ -255,14 +250,10 @@ def save_folders_inventory(ems, hashes, target = nil, disconnect = true) alias_method :save_ems_folders_inventory, :save_folders_inventory def save_clusters_inventory(ems, hashes, target = nil, disconnect = true) - target = ems if target.nil? && disconnect + target = ems if target.nil? ems.ems_clusters.reset - deletes = if (target == ems) - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.ems_clusters, hashes, deletes, [:uid_ems], nil, :ems_children) store_ids_for_new_records(ems.ems_clusters, hashes, :uid_ems) @@ -286,15 +277,10 @@ def save_resource_pools_inventory(ems, hashes, target = nil, disconnect = true) end def save_storage_profiles_inventory(ems, hashes, target = nil, disconnect = true) - target = ems if target.nil? && disconnect + target = ems if target.nil? ems.storage_profiles.reset - deletes = - if target == ems - :use_association - else - [] - end + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.storage_profiles, hashes, deletes, [:ems_ref], [:storage_profile_storages]) store_ids_for_new_records(ems.storage_profiles, hashes, [:ems_ref]) @@ -312,8 +298,11 @@ def save_storage_profile_storages_inventory(storage_profile, storages) [], [:storage_profile_id, :storage_id]) end - def save_customization_specs_inventory(ems, hashes, _target = nil, _disconnect = true) - save_inventory_multi(ems.customization_specs, hashes, :use_association, [:name]) + def save_customization_specs_inventory(ems, hashes, target = nil, disconnect = true) + target = ems if target.nil? + + deletes = determine_deletes_using_association(ems, target, disconnect) + save_inventory_multi(ems.customization_specs, hashes, deletes, [:name]) end def save_miq_scsi_targets_inventory(guest_device, hashes) diff --git a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb index 321717ab2d1..d30967bfda4 100644 --- a/app/models/ems_refresh/save_inventory_orchestration_stacks.rb +++ b/app/models/ems_refresh/save_inventory_orchestration_stacks.rb @@ -18,7 +18,7 @@ def save_orchestration_templates_inventory(_ems, hashes, _target = nil, _disconn def save_orchestration_templates_catalog_inventory(ems, hashes, target = nil, disconnect = true) target = ems if target.nil? - deletes = target == ems ? :use_association : [] + deletes = determine_deletes_using_association(ems, target, disconnect) save_inventory_multi(ems.orchestration_templates, hashes, @@ -29,9 +29,9 @@ def save_orchestration_templates_catalog_inventory(ems, hashes, target = nil, di end def save_orchestration_stacks_inventory(ems, hashes, target = nil, disconnect = true) - target = ems if target.nil? && disconnect + target = ems if target.nil? - deletes = target == ems ? :use_association : [] + deletes = determine_deletes_using_association(ems, target, disconnect) hashes.each do |h| h[:orchestration_template_id] = h.fetch_path(:orchestration_template, :id) From 3bff1aa1d517f84d37435f01aad8f06f31ae2e5c Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Tue, 25 Apr 2017 14:22:34 -0400 Subject: [PATCH 12/14] Update obj_event_to_hash for new refresh_new_target args --- app/models/miq_vim_broker_worker/runner.rb | 4 ++-- spec/models/miq_vim_broker_worker/runner_spec.rb | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/models/miq_vim_broker_worker/runner.rb b/app/models/miq_vim_broker_worker/runner.rb index 085e7a86003..311f41680c2 100644 --- a/app/models/miq_vim_broker_worker/runner.rb +++ b/app/models/miq_vim_broker_worker/runner.rb @@ -162,12 +162,12 @@ def drain_event }.freeze def on_create_event(ems_id, event) - target_hash = ManageIQ::Providers::Vmware::InfraManager::EventParser.obj_update_to_hash(event) + target_hash, target_class, target_find = ManageIQ::Providers::Vmware::InfraManager::EventParser.obj_update_to_hash(event) if target_hash.nil? _log.debug("Ignoring refresh for EMS id: [#{ems_id}] on event [#{event[:objType]}-create]") else ems = ExtManagementSystem.find(ems_id) - EmsRefresh.queue_refresh_new_target(target_hash, ems) + EmsRefresh.queue_refresh_new_target(ems, target_hash, target_class, target_find) end end diff --git a/spec/models/miq_vim_broker_worker/runner_spec.rb b/spec/models/miq_vim_broker_worker/runner_spec.rb index 46175ec20f6..bc635015d59 100644 --- a/spec/models/miq_vim_broker_worker/runner_spec.rb +++ b/spec/models/miq_vim_broker_worker/runner_spec.rb @@ -250,20 +250,24 @@ end it "will handle create events properly" do + mor = "group-v123" + klass = "EmsFolder" + find_opts = {:uid_ems => mor} + event = { :server => @ems.address, :username => @ems.authentication_userid, :objType => "Folder", :op => "create", - :mor => "group-v123" + :mor => mor } expected_folder_hash = { :folder => { - :type => "EmsFolder", - :ems_ref => "group-v123", - :ems_ref_obj => "group-v123", - :uid_ems => "group-v123" + :type => klass, + :ems_ref => mor, + :ems_ref_obj => mor, + :uid_ems => mor } } @@ -274,7 +278,7 @@ q = MiqQueue.first expect(q.class_name).to eq("EmsRefresh") expect(q.method_name).to eq("refresh_new_target") - expect(q.args).to eq([expected_folder_hash, @ems.id]) + expect(q.args).to eq([@ems.id, expected_folder_hash, klass, find_opts]) end it "will ignore updates to unknown properties" do From 39d9c0c1a0c40f60b9ad820b12683864b493733a Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 4 May 2017 09:31:59 -0400 Subject: [PATCH 13/14] Constantize target_class and return new target --- app/models/ems_refresh.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/models/ems_refresh.rb b/app/models/ems_refresh.rb index c707d869e3c..434a79850dc 100644 --- a/app/models/ems_refresh.rb +++ b/app/models/ems_refresh.rb @@ -100,6 +100,7 @@ def self.refresh(target, id = nil) def self.refresh_new_target(ems_id, target_hash, target_class, target_find) ems = ExtManagementSystem.find(ems_id) + target_class = target_class.constantize if target_class.kind_of? String save_ems_inventory_no_disconnect(ems, target_hash) @@ -110,6 +111,8 @@ def self.refresh_new_target(ems_id, target_hash, target_class, target_find) end ems.refresher.refresh(get_target_objects(target)) + + target end def self.get_target_objects(target, single_id = nil) From bf433bbfd2bd91524134a77185085a89581da342 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Thu, 4 May 2017 13:45:15 -0400 Subject: [PATCH 14/14] Use parse_new_target for miq_vim_broker new event --- app/models/miq_vim_broker_worker/runner.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/miq_vim_broker_worker/runner.rb b/app/models/miq_vim_broker_worker/runner.rb index 311f41680c2..b6c0fc2656c 100644 --- a/app/models/miq_vim_broker_worker/runner.rb +++ b/app/models/miq_vim_broker_worker/runner.rb @@ -162,7 +162,7 @@ def drain_event }.freeze def on_create_event(ems_id, event) - target_hash, target_class, target_find = ManageIQ::Providers::Vmware::InfraManager::EventParser.obj_update_to_hash(event) + target_hash, target_class, target_find = ManageIQ::Providers::Vmware::InfraManager::EventParser.parse_new_target(event) if target_hash.nil? _log.debug("Ignoring refresh for EMS id: [#{ems_id}] on event [#{event[:objType]}-create]") else