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

Inventory vPort entities (Nuage) into NetworkPort model (MIQ) #101

Merged
merged 1 commit into from
Jul 13, 2018
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
23 changes: 14 additions & 9 deletions app/models/manageiq/providers/nuage/inventory/collector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,20 @@ def initialize(_manager, _target)
end

def initialize_inventory_sources
@cloud_tenants = {}
@cloud_subnets = []
@l2_cloud_subnets = []
@security_groups = []
@floating_ips = []
@zones = {}
@network_routers = {}
@shared_resources = []
@cloud_networks_floating = nil
@cloud_tenants = {}
@cloud_subnets = []
@l2_cloud_subnets = []
@security_groups = []
@floating_ips = []
@zones = {}
@network_routers = {}
@shared_resources = []
@cloud_networks_floating = nil
@network_ports = []
@security_groups_per_port = {}
@vm_interfaces_per_port = {}
@container_interfaces_per_port = {}
@host_interfaces_per_port = {}
end

def vsd_client
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,29 @@ def zones
_zones.values
end

def network_ports
return @network_ports if @network_ports.any?
@network_ports.concat(network_routers.each_with_object([]) { |domain, res| res.concat(vsd_client.get_vports_for_domain(domain['ID'])) })
@network_ports.concat(l2_cloud_subnets.each_with_object([]) { |l2_domain, res| res.concat(vsd_client.get_vports_for_l2_domain(l2_domain['ID'])) })
@network_ports
end

def security_groups_for_network_port(port_ems_ref)
@security_groups_per_port[port_ems_ref] ||= vsd_client.get_policy_groups_for_vport(port_ems_ref)
end

def vm_interfaces_for_network_port(port_ems_ref)
@vm_interfaces_per_port[port_ems_ref] ||= vsd_client.get_vm_interfaces_for_vport(port_ems_ref)
end

def container_interfaces_for_network_port(port_ems_ref)
@container_interfaces_per_port[port_ems_ref] ||= vsd_client.get_container_interfaces_for_vport(port_ems_ref)
end

def host_interfaces_for_network_port(port_ems_ref)
@host_interfaces_per_port[port_ems_ref] ||= vsd_client.get_host_interfaces_for_vport(port_ems_ref)
end

def security_group(ems_ref)
security_groups.find { |sg| sg['ID'] == ems_ref }
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ def floating_ips
[] # TODO(miha-plesko): implement targeted refresh for floating ips
end

def network_ports
[] # TODO(miha-plesko): implement targeted refresh for network_ports
end

def security_groups_for_network_port(_port_ems_ref)
[] # TODO(miha-plesko): implement targeted refresh for network_ports
end

def cloud_subnet(ems_ref)
return @cloud_subnets_map[ems_ref] if @cloud_subnets_map.key?(ems_ref)
@cloud_subnets_map[ems_ref] = safe_call { vsd_client.get_subnet(ems_ref) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ def parse
l2_cloud_subnets
security_groups
floating_ips
network_ports
end

private
Expand Down Expand Up @@ -89,6 +90,45 @@ def floating_ips
end
end

def network_ports
collector.network_ports.each do |port|
network_port = persister.network_ports.find_or_build(port['ID']).assign_attributes(
:name => port['name'],
:floating_ip => persister.floating_ips.lazy_find(port['associatedFloatingIPID']),
:security_groups => collector.security_groups_for_network_port(port['ID']).map { |sg| persister.security_groups.lazy_find(sg['ID']) },
:cloud_tenant => persister.cloud_subnets.lazy_find(port['parentID'], :key => :cloud_tenant)
)

# Type-specific properties.
case port['type'].to_s.upcase
when 'BRIDGE'
network_port_type = collector.manager.class.bridge_network_port_type
address = nil
when 'CONTAINER'
network_port_type = collector.manager.class.container_network_port_type
address = first_ip_address(collector.container_interfaces_for_network_port(port['ID']))
when 'HOST'
network_port_type = collector.manager.class.host_network_port_type
address = first_ip_address(collector.host_interfaces_for_network_port(port['ID']))
when 'VM'
network_port_type = collector.manager.class.vm_network_port_type
address = first_ip_address(collector.vm_interfaces_for_network_port(port['ID']))
else
network_port_type = 'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort'
address = nil
end

network_port.type = network_port_type
network_port.cloud_subnet_network_ports = [
persister.cloud_subnet_network_ports.find_or_build_by(
:cloud_subnet => persister.cloud_subnets.lazy_find(port['parentID']),
:address => address,
:network_port => network_port
)
]
end
end

def map_extra_attributes(zone_id)
if (zone = collector.zone(zone_id))
{
Expand All @@ -105,4 +145,8 @@ def to_cidr(address, netmask)
return unless address && netmask
address.to_s + '/' + netmask.to_s.split(".").map { |e| e.to_i.to_s(2).rjust(8, "0") }.join.count("1").to_s
end

def first_ip_address(interfaces)
(interfaces.first || {}).dig('IPAddress')
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,20 @@ def initialize_network_inventory_collections
security_groups
cloud_networks
floating_ips
network_ports
network_routers).each do |name|

add_collection(network, name) do |builder|
builder.add_properties(:parent => manager) # including targeted
end
end

add_cloud_subnet_network_ports
end

def add_cloud_subnet_network_ports(extra_properties = {})
add_collection(network, :cloud_subnet_network_ports, extra_properties) do |builder|
builder.add_properties(:parent => manager, :parent_inventory_collections => %i(network_ports))
end
end
end
41 changes: 30 additions & 11 deletions app/models/manageiq/providers/nuage/network_manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class ManageIQ::Providers::Nuage::NetworkManager < ManageIQ::Providers::NetworkM
require_nested :CloudSubnetL2
require_nested :SecurityGroup
require_nested :FloatingIp
require_nested :NetworkPort

supports :ems_network_new

Expand Down Expand Up @@ -41,20 +42,38 @@ def supports_authentication?(authtype)
supported_auth_types.include?(authtype.to_s)
end

def self.event_monitor_class
ManageIQ::Providers::Nuage::NetworkManager::EventCatcher
end
class << self
def event_monitor_class
ManageIQ::Providers::Nuage::NetworkManager::EventCatcher
end

def self.l2_cloud_subnet_type
'ManageIQ::Providers::Nuage::NetworkManager::CloudSubnetL2'
end
def l2_cloud_subnet_type
'ManageIQ::Providers::Nuage::NetworkManager::CloudSubnetL2'
end

def self.l3_cloud_subnet_type
'ManageIQ::Providers::Nuage::NetworkManager::CloudSubnetL3'
end
def l3_cloud_subnet_type
'ManageIQ::Providers::Nuage::NetworkManager::CloudSubnetL3'
end

def floating_cloud_network_type
'ManageIQ::Providers::Nuage::NetworkManager::CloudNetwork::Floating'
end

def bridge_network_port_type
'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Bridge'
end

def container_network_port_type
'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Container'
end

def host_network_port_type
'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Host'
end

def self.floating_cloud_network_type
'ManageIQ::Providers::Nuage::NetworkManager::CloudNetwork::Floating'
def vm_network_port_type
'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Vm'
end
end

def name
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Bridge < ::ManageIQ::Providers::Nuage::NetworkManager::NetworkPort
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Container < ::ManageIQ::Providers::Nuage::NetworkManager::NetworkPort
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Host < ::ManageIQ::Providers::Nuage::NetworkManager::NetworkPort
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Vm < ::ManageIQ::Providers::Nuage::NetworkManager::NetworkPort
end
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,22 @@ def get_policy_groups_for_domain(domain_id)
get_list("domains/#{domain_id}/policygroups")
end

def get_policy_groups_for_vport(vport_id)
get_list("vports/#{vport_id}/policygroups")
end

def get_vm_interfaces_for_vport(vport_id)
get_list("vports/#{vport_id}/vminterfaces")
end

def get_container_interfaces_for_vport(vport_id)
get_list("vports/#{vport_id}/containerinterfaces")
end

def get_host_interfaces_for_vport(vport_id)
get_list("vports/#{vport_id}/hostinterfaces")
end

def get_l2_domains
get_list('l2domains')
end
Expand All @@ -90,6 +106,14 @@ def get_sharednetworkresources
get_list('sharednetworkresources')
end

def get_vports_for_domain(domain_id)
get_list("domains/#{domain_id}/vports")
end

def get_vports_for_l2_domain(l2_domain_id)
get_list("l2domains/#{l2_domain_id}/vports")
end

private

# TODO(miha-plesko): Is this filter really supposed to be used here in client? Looks like debugging leftover,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@
let(:router_ref) { "75ad8ee8-726c-4950-94bc-6a5aab64631d" }
let(:floating_ip_ref) { "3a00891b-29ba-4f60-8f35-033d84aa1083" }
let(:network_ref) { "17b305a7-eec9-4492-acb9-20a1d63a8ba1" }
let(:cont_port_ref) { "dd9a4d57-2e24-427b-8aef-4d2925df47b2" }
let(:vm_port_ref) { "15d1369e-9553-4e83-8bb9-3a6c269f81ae" }
let(:bridge_port_ref) { "43b7faad-2c76-4945-9412-66a04bde7b6a" }
let(:host_port_ref) { "b19075d3-a797-4dcd-93be-de52b4247e46" }

ALL_REFRESH_SETTINGS.each do |settings|
context "with settings #{settings}" do
Expand Down Expand Up @@ -90,6 +94,7 @@
assert_l2_cloud_subnets
assert_floating_ips
assert_cloud_networks
assert_network_ports
end
end
end
Expand All @@ -103,7 +108,7 @@ def assert_table_counts
expect(SecurityGroup.count).to eq(1)
expect(CloudSubnet.count).to eq(6)
expect(FloatingIp.count).to eq(3)
expect(NetworkPort.count).to eq(0)
expect(NetworkPort.count).to eq(4)
expect(NetworkRouter.count).to eq(1)
end

Expand Down Expand Up @@ -270,4 +275,66 @@ def assert_cloud_networks
)
expect(net.floating_ips).to include(FloatingIp.find_by(:ems_ref => floating_ip_ref))
end

def assert_network_ports
container_port = NetworkPort.find_by(:ems_ref => cont_port_ref)
expect(container_port).to have_attributes(
:name => 'Container VPort 1ea3d199',
:type => 'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Container',
:floating_ip => nil,
:security_groups => [SecurityGroup.find_by(:ems_ref => security_group_ref)],
:cloud_tenant => CloudTenant.find_by(:ems_ref => tenant_ref2)
)
expect(container_port.cloud_subnet_network_ports.size).to eq(1)
expect(container_port.cloud_subnet_network_ports.first).to have_attributes(
:cloud_subnet => CloudSubnet.find_by(:ems_ref => cloud_subnet_ref1),
:network_port => container_port,
:address => '10.98.80.100'
)

vm_port = NetworkPort.find_by(:ems_ref => vm_port_ref)
expect(vm_port).to have_attributes(
:name => 'VM VPort 70e41192',
:type => 'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Vm',
:floating_ip => nil,
:security_groups => [SecurityGroup.find_by(:ems_ref => security_group_ref)],
:cloud_tenant => CloudTenant.find_by(:ems_ref => tenant_ref2)
)
expect(vm_port.cloud_subnet_network_ports.size).to eq(1)
expect(vm_port.cloud_subnet_network_ports.first).to have_attributes(
:cloud_subnet => CloudSubnet.find_by(:ems_ref => cloud_subnet_ref1),
:network_port => vm_port,
:address => '10.98.78.179'
)

bridge_port = NetworkPort.find_by(:ems_ref => bridge_port_ref)
expect(bridge_port).to have_attributes(
:name => 'Bridge VPort ad817d5a',
:type => 'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Bridge',
:floating_ip => nil,
:security_groups => [SecurityGroup.find_by(:ems_ref => security_group_ref)],
:cloud_tenant => CloudTenant.find_by(:ems_ref => tenant_ref2)
)
expect(bridge_port.cloud_subnet_network_ports.size).to eq(1)
expect(bridge_port.cloud_subnet_network_ports.first).to have_attributes(
:cloud_subnet => CloudSubnet.find_by(:ems_ref => cloud_subnet_ref1),
:network_port => bridge_port,
:address => nil
)

host_port = NetworkPort.find_by(:ems_ref => host_port_ref)
expect(host_port).to have_attributes(
:name => 'Host VPort 25772231',
:type => 'ManageIQ::Providers::Nuage::NetworkManager::NetworkPort::Host',
:floating_ip => FloatingIp.find_by(:ems_ref => floating_ip_ref),
:security_groups => [SecurityGroup.find_by(:ems_ref => security_group_ref)],
:cloud_tenant => CloudTenant.find_by(:ems_ref => tenant_ref2)
)
expect(host_port.cloud_subnet_network_ports.size).to eq(1)
expect(host_port.cloud_subnet_network_ports.first).to have_attributes(
:cloud_subnet => CloudSubnet.find_by(:ems_ref => cloud_subnet_ref1),
:network_port => host_port,
:address => '10.98.77.179'
)
end
end
Loading