diff --git a/vmware_nsxlib/tests/unit/v3/test_constants.py b/vmware_nsxlib/tests/unit/v3/test_constants.py index a5f925c8..43cbb1be 100644 --- a/vmware_nsxlib/tests/unit/v3/test_constants.py +++ b/vmware_nsxlib/tests/unit/v3/test_constants.py @@ -331,6 +331,15 @@ FAKE_TZ = { "host_switch_mode": "STANDARD" } +FAKE_TN_UUID = uuidutils.generate_uuid() +FAKE_TN = { + "resource_type": "TransportNode", + "revision": 0, + "id": FAKE_TZ_UUID, + "display_name": FAKE_NAME, + "transport_zone_endpoints": [{"transport_zone_id": FAKE_TZ_UUID}] +} + FAKE_MD_UUID = uuidutils.generate_uuid() FAKE_URL = "http://7.7.7.70:3500/abc" FAKE_MD = { diff --git a/vmware_nsxlib/tests/unit/v3/test_resources.py b/vmware_nsxlib/tests/unit/v3/test_resources.py index fa65a433..0e585a39 100644 --- a/vmware_nsxlib/tests/unit/v3/test_resources.py +++ b/vmware_nsxlib/tests/unit/v3/test_resources.py @@ -1277,6 +1277,19 @@ class TransportZone(BaseTestResource): self.assertEqual(tz.HOST_SWITCH_MODE_STANDARD, tz_mode) +class TransportNode(BaseTestResource): + + def setUp(self): + super(TransportNode, self).setUp(core_resources.NsxLibTransportNode) + + def test_get_transport_zones(self): + fake_tn = test_constants.FAKE_TN.copy() + tn = self.get_mocked_resource() + with mock.patch.object(tn.client, 'url_get', return_value=fake_tn): + tzs = tn.get_transport_zones(fake_tn['id']) + self.assertEqual([test_constants.FAKE_TZ_UUID], tzs) + + class MetadataProxy(BaseTestResource): def setUp(self): diff --git a/vmware_nsxlib/v3/__init__.py b/vmware_nsxlib/v3/__init__.py index 239eac99..18a5ec1e 100644 --- a/vmware_nsxlib/v3/__init__.py +++ b/vmware_nsxlib/v3/__init__.py @@ -244,6 +244,8 @@ class NsxLib(NsxLibBase): self.client, self.nsxlib_config, nsxlib=self) self.transport_zone = core_resources.NsxLibTransportZone( self.client, self.nsxlib_config, nsxlib=self) + self.transport_node = core_resources.NsxLibTransportNode( + self.client, self.nsxlib_config, nsxlib=self) self.relay_service = core_resources.NsxLibDhcpRelayService( self.client, self.nsxlib_config, nsxlib=self) self.relay_profile = core_resources.NsxLibDhcpRelayProfile( diff --git a/vmware_nsxlib/v3/core_resources.py b/vmware_nsxlib/v3/core_resources.py index 72493888..f00085a2 100644 --- a/vmware_nsxlib/v3/core_resources.py +++ b/vmware_nsxlib/v3/core_resources.py @@ -682,6 +682,13 @@ class NsxLibEdgeCluster(utils.NsxLibApiBase): def resource_type(self): return 'EdgeCluster' + def get_transport_nodes(self, uuid): + ec = self.get(uuid) + members = [] + for member in ec.get('members', []): + members.append(member.get('transport_node_id')) + return members + class NsxLibTransportZone(utils.NsxLibApiBase): @@ -711,6 +718,26 @@ class NsxLibTransportZone(utils.NsxLibApiBase): return tz.get('host_switch_mode', self.HOST_SWITCH_MODE_STANDARD) +class NsxLibTransportNode(utils.NsxLibApiBase): + + @property + def uri_segment(self): + return 'transport-nodes' + + @property + def resource_type(self): + return 'TransportNode' + + @property + def use_cache_for_get(self): + return True + + def get_transport_zones(self, uuid): + tz = self.get(uuid) + return [ep.get('transport_zone_id') for ep in + tz.get('transport_zone_endpoints', [])] + + class NsxLibDhcpProfile(utils.NsxLibApiBase): @property diff --git a/vmware_nsxlib/v3/router.py b/vmware_nsxlib/v3/router.py index ae0a7448..74e6ac4d 100644 --- a/vmware_nsxlib/v3/router.py +++ b/vmware_nsxlib/v3/router.py @@ -241,3 +241,16 @@ class RouterLib(object): return self.nsxlib.logical_router.delete_static_route_by_values( nsx_router_id, dest_cidr=route['destination'], nexthop=route['nexthop']) + + def get_tier0_router_tz(self, tier0_uuid): + lrouter = self._router_client.get(tier0_uuid) + edge_cluster_uuid = lrouter.get('edge_cluster_id') + if not edge_cluster_uuid: + return [] + tier0_transport_nodes = self.nsxlib.edge_cluster.get_transport_nodes( + edge_cluster_uuid) + tier0_tzs = [] + for tn_uuid in tier0_transport_nodes: + tier0_tzs.extend(self.nsxlib.transport_node.get_transport_zones( + tn_uuid)) + return tier0_tzs