Skip to content

Commit

Permalink
Merge pull request #18504 from lpichler/load_network_manager_in_belon…
Browse files Browse the repository at this point in the history
…gsto_filter

Fix saving network manager in belongsto filter
  • Loading branch information
gtanzillo authored Mar 19, 2019
2 parents 736b994 + 709ff9e commit 35d745b
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 3 deletions.
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

0 comments on commit 35d745b

Please sign in to comment.