diff --git a/app/models/manageiq/providers/network_manager.rb b/app/models/manageiq/providers/network_manager.rb index 7a114758609f..4775271cabc1 100644 --- a/app/models/manageiq/providers/network_manager.rb +++ b/app/models/manageiq/providers/network_manager.rb @@ -93,6 +93,11 @@ def self.supported_types_and_descriptions_hash def name "#{parent_manager.try(:name)} #{PROVIDER_NAME}" end + + def self.find_object_for_belongs_to_filter(name) + name.gsub!(" #{self::PROVIDER_NAME}", "") + includes(:parent_manager).find_by(:parent_managers_ext_management_systems => {:name => name}) + end end def self.display_name(number = 1) diff --git a/app/models/miq_filter.rb b/app/models/miq_filter.rb index e0555272df81..eabb1ca1b673 100644 --- a/app/models/miq_filter.rb +++ b/app/models/miq_filter.rb @@ -1,11 +1,38 @@ module MiqFilter + ALLOWED_DESCENDANT_CLASSES_FROM_MODEL = %w(ExtManagementSystem).freeze + def self.belongsto2object(tag) belongsto2object_list(tag).last end + def self.find_descendant_class_by(klass, name) + if ALLOWED_DESCENDANT_CLASSES_FROM_MODEL.include?(klass.to_s) && name.end_with?(ManageIQ::Providers::NetworkManager::PROVIDER_NAME) + return ManageIQ::Providers::NetworkManager + else + _log.warn("Unable to find descendant class for belongsto filter: #{klass}/#{name}") + end + + nil + end + + def self.find_object_by_special_class(klass, name) + if (descendant_class = find_descendant_class_by(klass, name)) && descendant_class.respond_to?(:find_object_for_belongs_to_filter) + return descendant_class.find_object_for_belongs_to_filter(name) + else + _log.warn("#{klass} is not supported for loading objects of descendants classes.(belongsto filter: #{klass}/#{name}, descendant class: #{descendant_class}") + end + + nil + end + def self.find_object_by_name(klass, name) klass = klass.constantize - klass.find_by(:name => name) + object = klass.find_by(:name => name) + if object.nil? + find_object_by_special_class(klass, name) + else + object + end end def self.belongsto2object_list(tag) diff --git a/spec/models/miq_filter_spec.rb b/spec/models/miq_filter_spec.rb index 3eecc0574a1b..21b463255e14 100644 --- a/spec/models/miq_filter_spec.rb +++ b/spec/models/miq_filter_spec.rb @@ -48,5 +48,15 @@ def belongsto2object_list(*args) host_object_path = [ems, datacenter, mtc, host_folder, host_1] expect(belongsto2object_list(mtc_folder_path_with_host_1)).to match_array(host_object_path) end + + context "with network manager" do + let(:ems_openstack) { FactoryBot.create(:ems_openstack) } + let(:network_manager_folder_path) { "/belongsto/ExtManagementSystem|#{ems_openstack.name} Network Manager" } + + it "converts path with network manager" do + ems_openstack.update_attributes(:name => "XXX") + expect(belongsto2object_list(network_manager_folder_path)).to match_array([ems_openstack.network_manager]) + end + end end end