From f069348820f65b190e322847d6283ae5a0dc14ae Mon Sep 17 00:00:00 2001 From: lpichler Date: Thu, 28 Feb 2019 18:40:45 +0100 Subject: [PATCH 1/3] Use constant for string "Network Manager" for reusing in NetworkManager --- app/models/manageiq/providers/network_manager.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/manageiq/providers/network_manager.rb b/app/models/manageiq/providers/network_manager.rb index ff96c9d0328..7a114758609 100644 --- a/app/models/manageiq/providers/network_manager.rb +++ b/app/models/manageiq/providers/network_manager.rb @@ -1,6 +1,9 @@ module ManageIQ::Providers class NetworkManager < BaseManager include SupportsFeatureMixin + + PROVIDER_NAME = "Network Manager".freeze + class << model_name define_method(:route_key) { "ems_networks" } define_method(:singular_route_key) { "ems_network" } @@ -88,7 +91,7 @@ def self.supported_types_and_descriptions_hash end def name - "#{parent_manager.try(:name)} Network Manager" + "#{parent_manager.try(:name)} #{PROVIDER_NAME}" end end From 228756014a1b92ca463be3bfe05a159753eed257 Mon Sep 17 00:00:00 2001 From: lpichler Date: Thu, 28 Feb 2019 18:47:50 +0100 Subject: [PATCH 2/3] Extract method to get object by name in MiqFilter --- app/models/miq_filter.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/models/miq_filter.rb b/app/models/miq_filter.rb index d89e210f680..e0555272df8 100644 --- a/app/models/miq_filter.rb +++ b/app/models/miq_filter.rb @@ -3,6 +3,11 @@ def self.belongsto2object(tag) belongsto2object_list(tag).last end + def self.find_object_by_name(klass, name) + klass = klass.constantize + klass.find_by(:name => name) + end + def self.belongsto2object_list(tag) # /belongsto/ExtManagementSystem|/EmsCluster|/EmsFolder| raise _("invalid tag: %{tag}") % {:tag => tag} unless tag.starts_with?("/belongsto/ExtManagementSystem") @@ -10,8 +15,7 @@ def self.belongsto2object_list(tag) # root object klass, name = parts.shift.split("|") - klass = klass.constantize - obj = klass.find_by(:name => name) + obj = find_object_by_name(klass, name) if obj.nil? _log.warn("lookup for klass=#{klass.to_s.inspect} with name=#{name.inspect} failed in tag=#{tag.inspect}") From 709ff9e4f83ba0dacce17311b5e3541b4381fc0f Mon Sep 17 00:00:00 2001 From: lpichler Date: Fri, 1 Mar 2019 14:06:56 +0100 Subject: [PATCH 3/3] Count with Network Manager in decoding object from belongsto filter in MiqFillter methods handling with this special case behaviour has added also --- app/models/ext_management_system.rb | 9 ++++++ .../manageiq/providers/network_manager.rb | 5 ++++ app/models/miq_filter.rb | 29 ++++++++++++++++++- spec/models/miq_filter_spec.rb | 10 +++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/app/models/ext_management_system.rb b/app/models/ext_management_system.rb index 5f13321b9c7..ae5859bee2d 100644 --- a/app/models/ext_management_system.rb +++ b/app/models/ext_management_system.rb @@ -339,6 +339,15 @@ def self.provision_workflow_class self::ProvisionWorkflow end + BELONGS_TO_DESCENDANTS_CLASSES_BY_NAME = { + 'Network Manager' => 'ManageIQ::Providers::NetworkManager' + }.freeze + + def self.belongsto_descendant_class(name) + return unless (descendant = BELONGS_TO_DESCENDANTS_CLASSES_BY_NAME.keys.detect { |x| name.end_with?(x) }) + BELONGS_TO_DESCENDANTS_CLASSES_BY_NAME[descendant] + end + # UI methods for determining availability of fields def supports_port? false diff --git a/app/models/manageiq/providers/network_manager.rb b/app/models/manageiq/providers/network_manager.rb index 7a114758609..4775271cabc 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 e0555272df8..764a3fcafee 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) && (descendant_class = klass.try(:belongsto_descendant_class, name)) + return descendant_class.constantize + 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 3eecc0574a1..21b463255e1 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