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:
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()) >=
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user