Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix saving network manager in belongsto filter #18504

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions app/models/ext_management_system.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 9 additions & 1 deletion app/models/manageiq/providers/network_manager.rb
Original file line number Diff line number Diff line change
@@ -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" }
Expand Down Expand Up @@ -88,7 +91,12 @@ def self.supported_types_and_descriptions_hash
end

def name
"#{parent_manager.try(:name)} Network Manager"
"#{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

Expand Down
35 changes: 33 additions & 2 deletions app/models/miq_filter.rb
Original file line number Diff line number Diff line change
@@ -1,17 +1,48 @@
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
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)
# /belongsto/ExtManagementSystem|<name>/EmsCluster|<name>/EmsFolder|<name>
raise _("invalid tag: %{tag}") % {:tag => tag} unless tag.starts_with?("/belongsto/ExtManagementSystem")
parts = tag.split("/")[2..-1]

# 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}")
Expand Down
10 changes: 10 additions & 0 deletions spec/models/miq_filter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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