NSX: allow multiple networks with same vlan on different phy_net
Previously, the NSX plugin prevented one from creating multiple networks on the same vlan even if they were being created on different physical_networks. This patch corrects this issue and allows this to now occur. Closes-bug: 1367034 Change-Id: I343449648304328dffdd5ba070491e05686ee22d
This commit is contained in:
parent
e2be33f3b1
commit
8c9fbf8dfd
@ -33,10 +33,11 @@ def get_network_bindings(session, network_id):
|
|||||||
all())
|
all())
|
||||||
|
|
||||||
|
|
||||||
def get_network_bindings_by_vlanid(session, vlan_id):
|
def get_network_bindings_by_vlanid_and_physical_net(session, vlan_id,
|
||||||
|
phy_uuid):
|
||||||
session = session or db.get_session()
|
session = session or db.get_session()
|
||||||
return (session.query(models.TzNetworkBinding).
|
return (session.query(models.TzNetworkBinding).
|
||||||
filter_by(vlan_id=vlan_id).
|
filter_by(vlan_id=vlan_id, phy_uuid=phy_uuid).
|
||||||
all())
|
all())
|
||||||
|
|
||||||
|
|
||||||
|
@ -755,10 +755,15 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
|||||||
for segment in segments:
|
for segment in segments:
|
||||||
network_type = segment.get(pnet.NETWORK_TYPE)
|
network_type = segment.get(pnet.NETWORK_TYPE)
|
||||||
physical_network = segment.get(pnet.PHYSICAL_NETWORK)
|
physical_network = segment.get(pnet.PHYSICAL_NETWORK)
|
||||||
|
physical_network_set = attr.is_attr_set(physical_network)
|
||||||
segmentation_id = segment.get(pnet.SEGMENTATION_ID)
|
segmentation_id = segment.get(pnet.SEGMENTATION_ID)
|
||||||
network_type_set = attr.is_attr_set(network_type)
|
network_type_set = attr.is_attr_set(network_type)
|
||||||
segmentation_id_set = attr.is_attr_set(segmentation_id)
|
segmentation_id_set = attr.is_attr_set(segmentation_id)
|
||||||
|
|
||||||
|
# If the physical_network_uuid isn't passed in use the default one.
|
||||||
|
if not physical_network_set:
|
||||||
|
physical_network = cfg.CONF.default_tz_uuid
|
||||||
|
|
||||||
err_msg = None
|
err_msg = None
|
||||||
if not network_type_set:
|
if not network_type_set:
|
||||||
err_msg = _("%s required") % pnet.NETWORK_TYPE
|
err_msg = _("%s required") % pnet.NETWORK_TYPE
|
||||||
@ -781,8 +786,11 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
|||||||
'max_id': constants.MAX_VLAN_TAG})
|
'max_id': constants.MAX_VLAN_TAG})
|
||||||
else:
|
else:
|
||||||
# Verify segment is not already allocated
|
# Verify segment is not already allocated
|
||||||
bindings = nsx_db.get_network_bindings_by_vlanid(
|
bindings = (
|
||||||
context.session, segmentation_id)
|
nsx_db.get_network_bindings_by_vlanid_and_physical_net(
|
||||||
|
context.session, segmentation_id,
|
||||||
|
physical_network)
|
||||||
|
)
|
||||||
if bindings:
|
if bindings:
|
||||||
raise n_exc.VlanIdInUse(
|
raise n_exc.VlanIdInUse(
|
||||||
vlan_id=segmentation_id,
|
vlan_id=segmentation_id,
|
||||||
|
@ -47,6 +47,15 @@ class TestProvidernet(test_nsx_plugin.NsxPluginV2TestCase):
|
|||||||
self.assertEqual(net['network'][pnet.SEGMENTATION_ID], 411)
|
self.assertEqual(net['network'][pnet.SEGMENTATION_ID], 411)
|
||||||
self.assertEqual(net['network'][pnet.PHYSICAL_NETWORK], 'physnet1')
|
self.assertEqual(net['network'][pnet.PHYSICAL_NETWORK], 'physnet1')
|
||||||
|
|
||||||
|
# Test that we can create another provider network using the same
|
||||||
|
# vlan_id on another physical network.
|
||||||
|
data['network'][pnet.PHYSICAL_NETWORK] = 'physnet2'
|
||||||
|
network_req = self.new_create_request('networks', data, self.fmt)
|
||||||
|
net = self.deserialize(self.fmt, network_req.get_response(self.api))
|
||||||
|
self.assertEqual(net['network'][pnet.NETWORK_TYPE], 'vlan')
|
||||||
|
self.assertEqual(net['network'][pnet.SEGMENTATION_ID], 411)
|
||||||
|
self.assertEqual(net['network'][pnet.PHYSICAL_NETWORK], 'physnet2')
|
||||||
|
|
||||||
|
|
||||||
class TestMultiProviderNetworks(test_nsx_plugin.NsxPluginV2TestCase):
|
class TestMultiProviderNetworks(test_nsx_plugin.NsxPluginV2TestCase):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user