Skip to content

Commit

Permalink
Inventory vPort entities (Nuage) into NetworkPort model (MIQ)
Browse files Browse the repository at this point in the history
With this commit we inventory NetworkPorts that can be of different
types in Nuage:

- Bridge vPort
- Host vPort
- VM vPort
- Container vPort

Each of them has a unique way of retrieving IP address by
performing additional API request, hence the case-when statement
in the parser.

BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1574927
Signed-off-by: Miha Pleško <[email protected]>
  • Loading branch information
miha-plesko committed Jul 12, 2018
1 parent b7b3991 commit b097af3
Show file tree
Hide file tree
Showing 13 changed files with 2,148 additions and 21 deletions.
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
24 changes: 24 additions & 0 deletions app/models/manageiq/providers/nuage/network_manager/vsd_client.rb
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

0 comments on commit b097af3

Please sign in to comment.