From e01e164b05d49441a9cdb1525ac5628670eb71a0 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Mon, 1 Jun 2020 09:14:59 -0400 Subject: [PATCH 1/2] Extract NetworkManager parent_manager to a mixin Extract the logic for a NetworkManager belonging to a CloudManager parent out of the base NetworkManager class and move it to a mixin. --- .../manageiq/providers/network_manager.rb | 56 ------------------- .../mixins/belongs_to_parent_manager_mixin.rb | 54 ++++++++++++++++++ spec/factories/ext_management_system.rb | 16 ++++-- 3 files changed, 64 insertions(+), 62 deletions(-) create mode 100644 app/models/mixins/belongs_to_parent_manager_mixin.rb diff --git a/app/models/manageiq/providers/network_manager.rb b/app/models/manageiq/providers/network_manager.rb index 7bbafb0693b..c97abe8f10b 100644 --- a/app/models/manageiq/providers/network_manager.rb +++ b/app/models/manageiq/providers/network_manager.rb @@ -2,14 +2,11 @@ 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" } end - supports_not :ems_network_new # cloud_subnets are defined on base class, because of virtual_total performance has_many :floating_ips, :foreign_key => :ems_id, :dependent => :destroy has_many :security_groups, :foreign_key => :ems_id, :dependent => :destroy @@ -34,61 +31,8 @@ class << model_name alias all_cloud_networks cloud_networks - belongs_to :parent_manager, - :foreign_key => :parent_ems_id, - :class_name => "ManageIQ::Providers::BaseManager", - :autosave => true - - has_many :availability_zones, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :flavors, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_tenants, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_database_flavors, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_tenants, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_resource_quotas, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_volumes, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_volume_types, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_volume_backups, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_volume_snapshots, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_object_store_containers, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_object_store_objects, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_services, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :cloud_databases, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :hosts, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :vms, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :miq_templates, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - has_many :vms_and_templates, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id - - virtual_total :total_vms, :vms - virtual_total :total_miq_templates, :miq_templates - virtual_total :total_vms_and_templates, :vms_and_templates - - # Relationships delegated to parent manager - virtual_delegate :orchestration_stacks, - :orchestration_stacks_resources, - :direct_orchestration_stacks, - :resource_groups, - :key_pairs, - :to => :parent_manager, - :allow_nil => true, - :default => [] - def self.display_name(number = 1) n_('Network Manager', 'Network Managers', number) end - - def self.supported_types_and_descriptions_hash - supported_subclasses.select(&:supports_ems_network_new?).each_with_object({}) do |klass, hash| - hash[klass.ems_type] = klass.description - end - end - - 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 end diff --git a/app/models/mixins/belongs_to_parent_manager_mixin.rb b/app/models/mixins/belongs_to_parent_manager_mixin.rb new file mode 100644 index 00000000000..1441ac3b6a6 --- /dev/null +++ b/app/models/mixins/belongs_to_parent_manager_mixin.rb @@ -0,0 +1,54 @@ +module BelongsToParentManagerMixin + extend ActiveSupport::Concern + + PROVIDER_NAME = "Network Manager".freeze + + included do + belongs_to :parent_manager, + :foreign_key => :parent_ems_id, + :class_name => "ManageIQ::Providers::BaseManager", + :autosave => true + + has_many :availability_zones, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :flavors, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_tenants, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_database_flavors, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_tenants, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_resource_quotas, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_volumes, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_volume_types, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_volume_backups, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_volume_snapshots, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_object_store_containers, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_object_store_objects, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_services, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :cloud_databases, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :hosts, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :vms, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :miq_templates, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + has_many :vms_and_templates, -> { where.not(:ems_id => nil) }, :primary_key => :parent_ems_id, :foreign_key => :ems_id + + virtual_total :total_vms, :vms + virtual_total :total_miq_templates, :miq_templates + virtual_total :total_vms_and_templates, :vms_and_templates + + # Relationships delegated to parent manager + virtual_delegate :orchestration_stacks, + :orchestration_stacks_resources, + :direct_orchestration_stacks, + :resource_groups, + :key_pairs, + :to => :parent_manager, + :allow_nil => true, + :default => [] + + 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 +end diff --git a/spec/factories/ext_management_system.rb b/spec/factories/ext_management_system.rb index 9dda77e4c92..c5210a586dc 100644 --- a/spec/factories/ext_management_system.rb +++ b/spec/factories/ext_management_system.rb @@ -93,9 +93,7 @@ factory :ems_network, :aliases => ["manageiq/providers/network_manager"], :class => "ManageIQ::Providers::Openstack::NetworkManager", - :parent => :ext_management_system do - parent_manager { FactoryBot.create(:ext_management_system) } - end + :parent => :ext_management_system factory :ems_storage, :aliases => ["manageiq/providers/storage_manager"], @@ -239,7 +237,7 @@ :aliases => ["manageiq/providers/vmware/network_manager"], :class => "ManageIQ::Providers::Vmware::NetworkManager", :parent => :ems_cloud do - parent_manager { FactoryBot.create(:ext_management_system) } + parent_manager { FactoryBot.create(:ems_vmware_cloud) } end # Leaf classes for ems_cloud @@ -256,6 +254,7 @@ :class => "ManageIQ::Providers::Amazon::NetworkManager", :parent => :ems_network do provider_region { "us-east-1" } + parent_manager { FactoryBot.create(:ems_amazon) } end factory :ems_amazon_with_authentication, @@ -282,6 +281,7 @@ :class => "ManageIQ::Providers::Azure::NetworkManager", :parent => :ems_network do provider_region { "eastus" } + parent_manager { FactoryBot.create(:ems_azure) } end factory :ems_azure_with_authentication, @@ -304,7 +304,9 @@ factory :ems_openstack_network, :aliases => ["manageiq/providers/openstack/network_manager"], :class => "ManageIQ::Providers::Openstack::NetworkManager", - :parent => :ems_network + :parent => :ems_network do + parent_manager { FactoryBot.create(:ems_openstack) } + end factory :ems_nuage_network, :aliases => ["manageiq/providers/nuage/network_manager"], @@ -324,7 +326,9 @@ factory :ems_google_network, :aliases => ["manageiq/providers/google/network_manager"], :class => "ManageIQ::Providers::Google::NetworkManager", - :parent => :ems_network + :parent => :ems_network do + parent_manager { FactoryBot.create(:ems_google) } + end # Leaf classes for ems_container From 832ac8ab31a67947c83308ae743562951abf4b21 Mon Sep 17 00:00:00 2001 From: Adam Grare Date: Tue, 2 Jun 2020 08:37:54 -0400 Subject: [PATCH 2/2] Attempt to fix find_object_for_belongs_to_filter --- app/models/manageiq/providers/network_manager.rb | 5 +++++ app/models/mixins/belongs_to_parent_manager_mixin.rb | 5 ----- spec/models/miq_filter_spec.rb | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/models/manageiq/providers/network_manager.rb b/app/models/manageiq/providers/network_manager.rb index c97abe8f10b..280292c2ac9 100644 --- a/app/models/manageiq/providers/network_manager.rb +++ b/app/models/manageiq/providers/network_manager.rb @@ -34,5 +34,10 @@ class << model_name def self.display_name(number = 1) n_('Network Manager', 'Network Managers', number) end + + def self.find_object_for_belongs_to_filter(name) + ems = self.find_by(:name => name) + ems&.parent_manager_id&.present? ? self.find(ems.parent_manager_id) : ems + end end end diff --git a/app/models/mixins/belongs_to_parent_manager_mixin.rb b/app/models/mixins/belongs_to_parent_manager_mixin.rb index 1441ac3b6a6..01afcffef24 100644 --- a/app/models/mixins/belongs_to_parent_manager_mixin.rb +++ b/app/models/mixins/belongs_to_parent_manager_mixin.rb @@ -45,10 +45,5 @@ module BelongsToParentManagerMixin 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 end diff --git a/spec/models/miq_filter_spec.rb b/spec/models/miq_filter_spec.rb index 4b5378cd09b..cea30bfa9e5 100644 --- a/spec/models/miq_filter_spec.rb +++ b/spec/models/miq_filter_spec.rb @@ -54,7 +54,6 @@ def belongsto2object_list(*args) let(:network_manager_folder_path) { "/belongsto/ExtManagementSystem|#{ems_openstack.name} Network Manager" } it "converts path with network manager" do - ems_openstack.update(:name => "XXX") expect(belongsto2object_list(network_manager_folder_path)).to match_array([ems_openstack.network_manager]) end end