Merge "VMware: ensure that provider networks work for type 'portgroup'"

This commit is contained in:
Zuul 2017-11-23 00:07:23 +00:00 committed by Gerrit Code Review
commit 98b53fee26
4 changed files with 57 additions and 4 deletions

View File

@ -208,3 +208,16 @@ class GetVlanIdAndVswitchForPortgroupTestCase(test.NoDBTestCase):
response = fake.DataObject() response = fake.DataObject()
response.HostPortGroup = [port_group] response.HostPortGroup = [port_group]
return response return response
class GetDVSNetworkNameTestCase(test.NoDBTestCase):
def test__get_name_from_dvs_name(self):
vxw = 'vxw-dvs-22-virtualwire-89-sid-5008-'
uuid = '2425c130-fd39-45a6-91d8-bf7ebe66b77c'
cases = [('name', 'name'),
('%sname' % vxw, 'name'),
('%s%s' % (vxw, uuid), uuid)]
for (dvsname, expected) in cases:
self.assertEqual(expected,
network_util._get_name_from_dvs_name(dvsname))

View File

@ -366,3 +366,22 @@ class VMwareVifTestCase(test.NoDBTestCase):
version_arg_found = True version_arg_found = True
break break
self.assertTrue(version_arg_found) self.assertTrue(version_arg_found)
@mock.patch.object(network_util, 'get_network_with_the_name')
def test_get_neutron_network_dvs_provider(self, mock_network_name):
fake_network_obj = {'type': 'DistributedVirtualPortgroup',
'dvpg': 'fake-key',
'dvsw': 'fake-props'}
mock_network_name.side_effect = [None, fake_network_obj]
vif_info = network_model.NetworkInfo([
network_model.VIF(type=network_model.VIF_TYPE_DVS,
address='DE:AD:BE:EF:00:00',
network=self._network)]
)[0]
network_ref = vif._get_neutron_network('fake-session',
'fake-cluster',
vif_info)
calls = [mock.call('fake-session', 'fa0', 'fake-cluster'),
mock.call('fake-session', 'fake', 'fake-cluster')]
mock_network_name.assert_has_calls(calls)
self.assertEqual(fake_network_obj, network_ref)

View File

@ -17,6 +17,8 @@
""" """
Utility functions for ESX Networking. Utility functions for ESX Networking.
""" """
import re
from oslo_log import log as logging from oslo_log import log as logging
from oslo_vmware import exceptions as vexc from oslo_vmware import exceptions as vexc
from oslo_vmware import vim_util as vutil from oslo_vmware import vim_util as vutil
@ -28,6 +30,20 @@ from nova.virt.vmwareapi import vm_util
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
# a virtual wire will have the following format:
# vxw-<dvs-moref>-<virtualwire-moref>-<sid-moref>-<name>
# Examples:
# - vxw-dvs-22-virtualwire-89-sid-5008-NAME
# - vxw-dvs-22-virtualwire-89-sid-5008-UUID
VWIRE_REGEX = re.compile('vxw-dvs-(\d+)-virtualwire-(\d+)-sid-(\d+)-(.*)')
def _get_name_from_dvs_name(dvs_name):
vwire = VWIRE_REGEX.match(dvs_name)
if not vwire:
return dvs_name
return vwire.group(4)
def _get_network_obj(session, network_objects, network_name): def _get_network_obj(session, network_objects, network_name):
"""Gets the network object for the requested network. """Gets the network object for the requested network.
@ -64,10 +80,8 @@ def _get_network_obj(session, network_objects, network_name):
"config") "config")
# NOTE(asomya): This only works on ESXi if the port binding # NOTE(asomya): This only works on ESXi if the port binding
# is set to ephemeral # is set to ephemeral
# For a VLAN the network name will be the UUID. For a VXLAN net_name = _get_name_from_dvs_name(props.name)
# network this will have a VXLAN prefix and then the if network_name in net_name:
# network name.
if network_name in props.name:
network_obj['type'] = 'DistributedVirtualPortgroup' network_obj['type'] = 'DistributedVirtualPortgroup'
network_obj['dvpg'] = props.key network_obj['dvpg'] = props.key
dvs_props = session._call_method(vutil, dvs_props = session._call_method(vutil,

View File

@ -138,6 +138,13 @@ def _get_neutron_network(session, cluster, vif):
network_id = vif['network']['bridge'] network_id = vif['network']['bridge']
network_ref = network_util.get_network_with_the_name( network_ref = network_util.get_network_with_the_name(
session, network_id, cluster) session, network_id, cluster)
if not network_ref:
# We may have a provider network for a portgroup. The portgroup
# will have the same name as the network 'label'. This is enforced
# when the provider network is created
network_id = vif['network']['label']
network_ref = network_util.get_network_with_the_name(
session, network_id, cluster)
if not network_ref: if not network_ref:
raise exception.NetworkNotFoundForBridge(bridge=network_id) raise exception.NetworkNotFoundForBridge(bridge=network_id)
if vif.get('details') and vif['details'].get('dvs_port_key'): if vif.get('details') and vif['details'].get('dvs_port_key'):