diff --git a/vmware_nsxlib/tests/unit/v3/test_router.py b/vmware_nsxlib/tests/unit/v3/test_router.py index e77f1058..e4be8bed 100644 --- a/vmware_nsxlib/tests/unit/v3/test_router.py +++ b/vmware_nsxlib/tests/unit/v3/test_router.py @@ -83,6 +83,24 @@ class TestRouter(nsxlib_testcase.NsxClientTestCase): tier1_uuid, tier0_uuid, tags)) self.assertEqual(port_create.call_count, 2) + def test_add_router_link_port_fail(self): + tags = [{'scope': 'a', 'tag': 'b'}] + tier0_uuid = uuidutils.generate_uuid() + tier1_uuid = uuidutils.generate_uuid() + tier0_link_port_id = uuidutils.generate_uuid() + with mock.patch.object(self.nsxlib.router._router_port_client, + 'create') as port_create,\ + mock.patch.object(self.nsxlib.router._router_port_client, + 'delete') as port_delete: + tier0_link_port = {'id': tier0_link_port_id} + port_create.side_effect = [tier0_link_port, + nsxlib_exc.ManagerError] + self.assertRaises( + nsxlib_exc.ManagerError, + self.nsxlib.router.add_router_link_port, + tier1_uuid, tier0_uuid, tags) + port_delete.assert_called_once_with(tier0_link_port_id) + def test_remove_router_link_port(self): tier1_uuid = uuidutils.generate_uuid() with mock.patch.object( diff --git a/vmware_nsxlib/v3/router.py b/vmware_nsxlib/v3/router.py index 03296393..6fafc36d 100644 --- a/vmware_nsxlib/v3/router.py +++ b/vmware_nsxlib/v3/router.py @@ -94,12 +94,20 @@ class RouterLib(object): # Create Tier1 logical router link port t1_tags = copy.copy(tags) t1_tags = utils.add_v3_tag(t1_tags, 'os-tier1-uuid', tier1_uuid) - tier1_link_port = self._router_port_client.create( - tier1_uuid, display_name=TIER1_ROUTER_LINK_PORT_NAME, tags=t1_tags, - resource_type=nsx_constants.LROUTERPORT_LINKONTIER1, - logical_port_id=linked_logical_port_id, - address_groups=None) - return tier0_link_port, tier1_link_port + try: + tier1_link_port = self._router_port_client.create( + tier1_uuid, display_name=TIER1_ROUTER_LINK_PORT_NAME, + tags=t1_tags, + resource_type=nsx_constants.LROUTERPORT_LINKONTIER1, + logical_port_id=linked_logical_port_id, + address_groups=None) + return tier0_link_port, tier1_link_port + except Exception as e: + LOG.warning("Failed to create tier1 link port for tier1 router " + "%s, deleting peer tier0 link port %s: %s", + tier1_uuid, linked_logical_port_id, e) + self._router_port_client.delete(linked_logical_port_id) + raise e def remove_router_link_port(self, tier1_uuid, tier0_uuid=None): # Note(asarfaty): tier0_uuid is not used by this method and can