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

[WIP] Extract NetworkManager parent_manager to a mixin #20229

Closed
Closed
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
55 changes: 2 additions & 53 deletions app/models/manageiq/providers/network_manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -34,61 +31,13 @@ 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})
ems = self.find_by(:name => name)
ems&.parent_manager_id&.present? ? self.find(ems.parent_manager_id) : ems
end
end
end
49 changes: 49 additions & 0 deletions app/models/mixins/belongs_to_parent_manager_mixin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
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,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

different PR:

would be nice if we used has_many :through instead.
Though, that will not work for virtual relationships on the manager model

: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
end
end
16 changes: 10 additions & 6 deletions spec/factories/ext_management_system.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"],
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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"],
Expand All @@ -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

Expand Down
1 change: 0 additions & 1 deletion spec/models/miq_filter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down