Add router transport zone field

In NSX 2.2 & up, there is a logical router advanced config of
an overlay transport-zone-id.
Also adding a router api to get the tier0 router overlay TZ to
be used here.

Change-Id: I3a447202785b7b6ac320ddbb6a3f2cdeac1f78aa
This commit is contained in:
Adit Sarfaty
2018-03-06 12:44:32 +02:00
parent 67785ec020
commit e26d32376b
6 changed files with 65 additions and 5 deletions

View File

@@ -117,6 +117,9 @@ FAKE_ROUTER = {
"target_type": "FirewallSection",
"target_id": FAKE_ROUTER_FW_SEC_UUID
}],
"advanced_config": {
"external_transit_networks": ["100.64.0.0/10"],
},
}
FAKE_ROUTER_PORT_UUID = uuidutils.generate_uuid()

View File

@@ -589,14 +589,16 @@ class LogicalRouterTestCase(BaseTestResource):
router = self.get_mocked_resource()
tier0_router = True
description = 'dummy'
tz_id = 'tz_id'
router.create(fake_router['display_name'], None, None, tier0_router,
description=description)
description=description, transport_zone_id=tz_id)
data = {
'display_name': fake_router['display_name'],
'router_type': 'TIER0' if tier0_router else 'TIER1',
'tags': None,
'description': description
'description': description,
'advanced_config': {'transport_zone_id': tz_id}
}
test_client.assert_json_call(
@@ -605,6 +607,33 @@ class LogicalRouterTestCase(BaseTestResource):
data=jsonutils.dumps(data, sort_keys=True),
headers=self.default_headers())
def test_update_logical_router(self):
fake_router = test_constants.FAKE_ROUTER.copy()
router = self.get_mocked_resource()
uuid = fake_router['id']
name = 'dummy'
description = 'dummy'
edge_cluster_id = 'ec_id'
tz_id = 'tz_id'
with mock.patch.object(router.client, 'get',
return_value=fake_router),\
mock.patch("vmware_nsxlib.v3.NsxLib.get_version",
return_value='2.2.0'):
router.update(uuid, display_name=name, description=description,
edge_cluster_id=edge_cluster_id,
transport_zone_id=tz_id)
fake_router["display_name"] = name
fake_router["description"] = description
fake_router["edge_cluster_id"] = edge_cluster_id
fake_router["advanced_config"]['transport_zone_id'] = tz_id
test_client.assert_json_call(
'put', router,
'https://1.2.3.4/api/v1/logical-routers/%s' % uuid,
data=jsonutils.dumps(fake_router, sort_keys=True),
headers=self.default_headers())
def test_force_delete_logical_router(self):
"""Test force deleting router"""
router = self.get_mocked_resource()

View File

@@ -314,7 +314,8 @@ class NsxLib(NsxLibBase):
feature == nsx_constants.FEATURE_IPSEC_VPN or
feature == nsx_constants.FEATURE_ON_BEHALF_OF or
feature == nsx_constants.FEATURE_RATE_LIMIT or
feature == nsx_constants.FEATURE_TRUNK_VLAN):
feature == nsx_constants.FEATURE_TRUNK_VLAN or
feature == nsx_constants.FEATURE_ROUTER_TRANSPORT_ZONE):
return True
if (version.LooseVersion(self.get_version()) >=

View File

@@ -625,7 +625,7 @@ class NsxLibLogicalRouter(utils.NsxLibApiBase):
return self.client.get(resource)
def create(self, display_name, tags, edge_cluster_uuid=None, tier_0=False,
description=None):
description=None, transport_zone_id=None):
# TODO(salv-orlando): If possible do not manage edge clusters
# in the main plugin logic.
router_type = (nsx_constants.ROUTER_TYPE_TIER0 if tier_0 else
@@ -637,6 +637,9 @@ class NsxLibLogicalRouter(utils.NsxLibApiBase):
body['edge_cluster_id'] = edge_cluster_uuid
if description:
body['description'] = description
if transport_zone_id:
body['advanced_config'] = {
'transport_zone_id': transport_zone_id}
return self.client.create(self.get_path(), body=body)
def delete(self, lrouter_id, force=False):
@@ -646,7 +649,16 @@ class NsxLibLogicalRouter(utils.NsxLibApiBase):
return self.client.delete(self.get_path(url))
def update(self, lrouter_id, *args, **kwargs):
return self._update_with_retry(lrouter_id, kwargs)
body = {}
for arg in kwargs:
# special care for transport_zone_id
if arg == 'transport_zone_id':
body['advanced_config'] = {
'transport_zone_id': kwargs['transport_zone_id']}
else:
body[arg] = kwargs[arg]
return self._update_with_retry(lrouter_id, body)
def get_firewall_section_id(self, lrouter_id, router_body=None):
"""Return the id of the auto created firewall section of the router

View File

@@ -140,3 +140,4 @@ FEATURE_RATE_LIMIT = 'Requests Rate Limit'
FEATURE_IPSEC_VPN = 'IPSec VPN'
FEATURE_ON_BEHALF_OF = 'On Behalf Of'
FEATURE_TRUNK_VLAN = 'Trunk Vlan'
FEATURE_ROUTER_TRANSPORT_ZONE = 'Router Transport Zone'

View File

@@ -165,6 +165,10 @@ class RouterLib(object):
return self._router_client.update(nsx_router_id,
edge_cluster_id=edge_cluster_uuid)
def update_router_transport_zone(self, nsx_router_id, transport_zone_id):
return self._router_client.update(nsx_router_id,
transport_zone_id=transport_zone_id)
def create_logical_router_intf_port_by_ls_id(self, logical_router_id,
display_name,
tags,
@@ -254,3 +258,13 @@ class RouterLib(object):
tier0_tzs.extend(self.nsxlib.transport_node.get_transport_zones(
tn_uuid))
return tier0_tzs
def get_tier0_router_overlay_tz(self, tier0_uuid):
tz_uuids = self.get_tier0_router_tz(tier0_uuid)
for tz_uuid in tz_uuids:
# look for the overlay tz
backend_type = self.nsxlib.transport_zone.get_transport_type(
tz_uuid)
if (backend_type ==
self.nsxlib.transport_zone.TRANSPORT_TYPE_OVERLAY):
return tz_uuid