Skip to content

Commit

Permalink
Merge pull request #101 from miha-plesko/inventory-vports
Browse files Browse the repository at this point in the history
Inventory vPort entities (Nuage) into NetworkPort model (MIQ)
  • Loading branch information
Ladas authored Jul 13, 2018
2 parents b7b3991 + a0d7b24 commit 2441d10
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 2441d10

Please sign in to comment.