mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-22 18:50:08 +03:00
M #~: improve network list in vcenter (#284)
Signed-off-by: Carlos Herrera <cherrera@opennebula.io>
This commit is contained in:
parent
2159fe3479
commit
9ddd72499c
@ -372,12 +372,18 @@ class DatacenterFolder
|
||||
end
|
||||
|
||||
# Determine if a network must be excluded from the list
|
||||
def exclude_network?(vc_network, one_host, args)
|
||||
def exclude_network?(vc_network, one_host, args, vc_network_hash)
|
||||
|
||||
vc_network_ref = vc_network_hash[:vc_network_ref]
|
||||
vc_network_name = vc_network_hash[:vc_network_name]
|
||||
vc_network_host = vc_network_hash[:vc_network_host]
|
||||
vc_network_tag = vc_network_hash[:vc_network_tag]
|
||||
|
||||
# Exclude some networks if filter = true
|
||||
if args[:filter]
|
||||
if ( one_host && one_host['TEMPLATE/NSX_PASSWORD'].nil?)
|
||||
# Only NSX-V and NSX-T can be excluded
|
||||
network_type = VCenterDriver::Network.get_network_type(vc_network)
|
||||
network_type = VCenterDriver::Network.get_network_type(vc_network, vc_network_name)
|
||||
if network_type == VCenterDriver::Network::NETWORK_TYPE_NSXT ||\
|
||||
network_type == VCenterDriver::Network::NETWORK_TYPE_NSXV
|
||||
|
||||
@ -385,17 +391,17 @@ class DatacenterFolder
|
||||
end
|
||||
end
|
||||
# Exclude networks without hosts
|
||||
if vc_network['host'].empty?
|
||||
if vc_network_host.empty?
|
||||
return true
|
||||
end
|
||||
# Exclude DVS uplinks
|
||||
unless vc_network['tag'].empty?
|
||||
if vc_network['tag'][0][:key] == 'SYSTEM/DVS.UPLINKPG'
|
||||
unless vc_network_tag.empty?
|
||||
if vc_network_tag[0][:key] == 'SYSTEM/DVS.UPLINKPG'
|
||||
return true
|
||||
end
|
||||
end
|
||||
# Exclude portgroup used for VXLAN communication in NSX
|
||||
if vc_network['name'].match(/^vxw-vmknicPg-dvs-(.*)/)
|
||||
if vc_network_name.match(/^vxw-vmknicPg-dvs-(.*)/)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
@ -413,71 +419,83 @@ class DatacenterFolder
|
||||
|
||||
full_process = !args[:short]
|
||||
|
||||
vc_network_ref = vc_network._ref
|
||||
vc_network_name = vc_network.name
|
||||
vc_network_host = vc_network['host']
|
||||
vc_network_tag = vc_network['tag']
|
||||
|
||||
vc_network_hash = {}
|
||||
vc_network_hash[:vc_network_ref] = vc_network_ref
|
||||
vc_network_hash[:vc_network_name] = vc_network_name
|
||||
vc_network_hash[:vc_network_host] = vc_network_host
|
||||
vc_network_hash[:vc_network_tag] = vc_network_tag
|
||||
|
||||
# Initialize network hash
|
||||
network = {}
|
||||
# Add name to network hash
|
||||
network[vc_network._ref] = {'name' => vc_network.name}
|
||||
network[vc_network_ref] = {'name' => vc_network_name}
|
||||
# By default no network is excluded
|
||||
network[vc_network._ref][:excluded] = false
|
||||
network[vc_network_ref][:excluded] = false
|
||||
|
||||
# Initialize opts hash used to inject data into one template
|
||||
opts = {}
|
||||
|
||||
if full_process
|
||||
# Add network type to network hash
|
||||
network_type = VCenterDriver::Network.get_network_type(vc_network)
|
||||
network[vc_network._ref][:network_type] = network_type
|
||||
network_type = VCenterDriver::Network.get_network_type(vc_network, vc_network_name)
|
||||
network[vc_network_ref][:network_type] = network_type
|
||||
end
|
||||
|
||||
# Determine if the network must be excluded
|
||||
network[vc_network._ref][:excluded] = exclude_network?(vc_network,
|
||||
network[vc_network_ref][:excluded] = exclude_network?(vc_network,
|
||||
one_host,
|
||||
args)
|
||||
return nil if network[vc_network._ref][:excluded] == true
|
||||
args,
|
||||
vc_network_hash)
|
||||
return nil if network[vc_network_ref][:excluded] == true
|
||||
|
||||
if full_process
|
||||
case network[vc_network._ref][:network_type]
|
||||
case network[vc_network_ref][:network_type]
|
||||
# Distributed PortGroups
|
||||
when VCenterDriver::Network::NETWORK_TYPE_DPG
|
||||
network[vc_network._ref][:sw_name] = \
|
||||
network[vc_network_ref][:sw_name] = \
|
||||
vc_network.config.distributedVirtualSwitch.name
|
||||
# For DistributedVirtualPortgroups there is networks and uplinks
|
||||
network[vc_network._ref][:uplink] = \
|
||||
network[vc_network_ref][:uplink] = \
|
||||
vc_network.config.uplink
|
||||
#network[vc_network._ref][:uplink] = false
|
||||
#network[vc_network_ref][:uplink] = false
|
||||
# NSX-V PortGroups
|
||||
when VCenterDriver::Network::NETWORK_TYPE_NSXV
|
||||
network[vc_network._ref][:sw_name] = \
|
||||
network[vc_network_ref][:sw_name] = \
|
||||
vc_network.config.distributedVirtualSwitch.name
|
||||
# For NSX-V ( is the same as DistributedVirtualPortgroups )
|
||||
# there is networks and uplinks
|
||||
network[vc_network._ref][:uplink] = \
|
||||
network[vc_network_ref][:uplink] = \
|
||||
vc_network.config.uplink
|
||||
network[vc_network._ref][:uplink] = false
|
||||
network[vc_network_ref][:uplink] = false
|
||||
# Standard PortGroups
|
||||
when VCenterDriver::Network::NETWORK_TYPE_PG
|
||||
# There is no uplinks for standard portgroups, so all Standard
|
||||
# PortGroups are networks and no uplinks
|
||||
network[vc_network._ref][:uplink] = false
|
||||
network[vc_network._ref][:sw_name] = vSwitch(vc_network)
|
||||
network[vc_network_ref][:uplink] = false
|
||||
network[vc_network_ref][:sw_name] = vSwitch(vc_network)
|
||||
# NSX-T PortGroups
|
||||
when VCenterDriver::Network::NETWORK_TYPE_NSXT
|
||||
network[vc_network._ref][:sw_name] = \
|
||||
network[vc_network_ref][:sw_name] = \
|
||||
vc_network.summary.opaqueNetworkType
|
||||
# There is no uplinks for NSX-T networks, so all NSX-T networks
|
||||
# are networks and no uplinks
|
||||
network[vc_network._ref][:uplink] = false
|
||||
network[vc_network_ref][:uplink] = false
|
||||
else
|
||||
raise 'Unknown network type: ' \
|
||||
"#{network[vc_network._ref][:network_type]}"
|
||||
"#{network[vc_network_ref][:network_type]}"
|
||||
end
|
||||
end
|
||||
|
||||
# Multicluster nets support
|
||||
network[vc_network._ref][:clusters] = {}
|
||||
network[vc_network._ref][:clusters][:refs] = []
|
||||
network[vc_network._ref][:clusters][:one_ids] = []
|
||||
network[vc_network._ref][:clusters][:names] = []
|
||||
network[vc_network_ref][:clusters] = {}
|
||||
network[vc_network_ref][:clusters][:refs] = []
|
||||
network[vc_network_ref][:clusters][:one_ids] = []
|
||||
network[vc_network_ref][:clusters][:names] = []
|
||||
|
||||
# Get hosts related to this network and add them if is not
|
||||
# excluded
|
||||
@ -485,47 +503,50 @@ class DatacenterFolder
|
||||
vc_hosts.each do |vc_host|
|
||||
# Get vCenter Cluster
|
||||
vc_cluster = vc_host.parent
|
||||
vc_cluster_ref = vc_cluster._ref
|
||||
vc_cluster_name = vc_cluster.name
|
||||
# Get one host from each vCenter cluster
|
||||
one_host = VCenterDriver::VIHelper
|
||||
.find_by_ref(OpenNebula::HostPool,
|
||||
"TEMPLATE/VCENTER_CCR_REF",
|
||||
vc_cluster._ref,
|
||||
vc_cluster_ref,
|
||||
vcenter_uuid)
|
||||
# Check if network is excluded from each host
|
||||
next if exclude_network?(vc_network,one_host,args)
|
||||
next if exclude_network?(vc_network,one_host,args, vc_network_hash)
|
||||
# Insert vCenter cluster ref
|
||||
network[vc_network._ref][:clusters][:refs] << vc_cluster._ref
|
||||
network[vc_network_ref][:clusters][:refs] << vc_cluster_ref
|
||||
# Insert OpenNebula cluster id
|
||||
cluster_id = one_cluster_id(one_host)
|
||||
network[vc_network._ref][:clusters][:one_ids] << cluster_id
|
||||
network[vc_network_ref][:clusters][:one_ids] << cluster_id
|
||||
# Insert vCenter cluster name
|
||||
network[vc_network._ref][:clusters][:names] << vc_cluster.name
|
||||
opts[:dc_name] = vc_cluster.name
|
||||
network[vc_network_ref][:clusters][:names] << vc_cluster_name
|
||||
|
||||
opts[:dc_name] = vc_cluster_name
|
||||
end
|
||||
|
||||
# Remove duplicate entries
|
||||
network[vc_network._ref][:clusters][:refs].uniq!
|
||||
network[vc_network._ref][:clusters][:one_ids].uniq!
|
||||
network[vc_network._ref][:clusters][:names].uniq!
|
||||
network[vc_network_ref][:clusters][:refs].uniq!
|
||||
network[vc_network_ref][:clusters][:one_ids].uniq!
|
||||
network[vc_network_ref][:clusters][:names].uniq!
|
||||
|
||||
# Mark network as processed
|
||||
network[vc_network._ref][:processed] = true
|
||||
network[vc_network_ref][:processed] = true
|
||||
|
||||
if full_process
|
||||
# General net_info related to datacenter
|
||||
opts[:vcenter_uuid] = vcenter_uuid
|
||||
opts[:vcenter_instance_name] = vcenter_instance_name
|
||||
opts[:network_name] = network[vc_network._ref]['name']
|
||||
opts[:network_name] = network[vc_network_ref]['name']
|
||||
opts[:network_ref] = network.keys.first
|
||||
opts[:network_type] = network[vc_network._ref][:network_type]
|
||||
opts[:sw_name] = network[vc_network._ref][:sw_name]
|
||||
opts[:network_type] = network[vc_network_ref][:network_type]
|
||||
opts[:sw_name] = network[vc_network_ref][:sw_name]
|
||||
|
||||
network[vc_network._ref] = \
|
||||
network[vc_network._ref].merge(VCenterDriver::Network
|
||||
network[vc_network_ref] = \
|
||||
network[vc_network_ref].merge(VCenterDriver::Network
|
||||
.to_one_template(opts))
|
||||
else
|
||||
network[vc_network._ref][:ref] = vc_network._ref
|
||||
network[vc_network._ref][:name] = network[vc_network._ref]['name']
|
||||
network[vc_network_ref][:ref] = vc_network_ref
|
||||
network[vc_network_ref][:name] = network[vc_network_ref]['name']
|
||||
end
|
||||
|
||||
network
|
||||
|
@ -248,10 +248,10 @@ class Network
|
||||
one_vn
|
||||
end
|
||||
|
||||
def self.get_network_type(network)
|
||||
def self.get_network_type(network, network_name)
|
||||
case network
|
||||
when RbVmomi::VIM::DistributedVirtualPortgroup
|
||||
if network['name']
|
||||
if network_name
|
||||
.match(/^vxw-dvs-(.*)-virtualwire-(.*)-sid-(.*)/)
|
||||
VCenterDriver::Network::NETWORK_TYPE_NSXV
|
||||
else
|
||||
@ -383,7 +383,7 @@ class NetImporter < VCenterDriver::VcImporter
|
||||
end
|
||||
|
||||
def get_list(args = {})
|
||||
dc_folder = VCenterDriver::DatacenterFolder.new(@vi_client)
|
||||
dc_folder = VCenterDriver::DatacenterFolder.new(@vi_client)
|
||||
|
||||
# OpenNebula's VirtualNetworkPool
|
||||
npool = VCenterDriver::VIHelper.one_pool(OpenNebula::VirtualNetworkPool, false)
|
||||
|
@ -835,7 +835,7 @@ class Template
|
||||
|
||||
res[:net_name] = deviceNetwork.name
|
||||
res[:net_ref] = deviceNetwork._ref
|
||||
res[:pg_type] = VCenterDriver::Network.get_network_type(deviceNetwork)
|
||||
res[:pg_type] = VCenterDriver::Network.get_network_type(deviceNetwork, res[:net_name])
|
||||
res[:network] = deviceNetwork
|
||||
|
||||
res
|
||||
|
Loading…
x
Reference in New Issue
Block a user