From 38e2ffaf6d636a5e82c00fbe8f3b64b9ae970678 Mon Sep 17 00:00:00 2001 From: Bob Melander Date: Wed, 31 May 2017 14:14:48 +0200 Subject: [PATCH] Takes hosting information into account when determining updated routers In some (rare) cases a vrf is removed because the cfg agent is not taking hosting device into account when determining routers that have been deleted by the user. This patch fixes this issue. AKA: DE3934 Change-Id: I34b2883f322bdf492db18c155fff635281f7bfdb Closes-Bug: #1694674 --- .../service_helpers/routing_svc_helper.py | 11 ++++++++--- .../cisco/cfg_agent/test_routing_svc_helper.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/networking_cisco/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py b/networking_cisco/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py index 92f3419..3c65303 100755 --- a/networking_cisco/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py +++ b/networking_cisco/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py @@ -597,11 +597,16 @@ class RoutingServiceHelper(object): :return: None """ try: + ids_previously_hosted_routers = ( + set(r_id for r_id, rdata in self.router_info.items() + if rdata.router.get('hosting_device', + {}).get('id') == device_id)) + if all_routers: - prev_router_ids = set(self.router_info) + prev_router_ids = ids_previously_hosted_routers else: - prev_router_ids = set(self.router_info) & set( - [router['id'] for router in routers]) + prev_router_ids = (ids_previously_hosted_routers & + set([router['id'] for router in routers])) cur_router_ids = set() deleted_routerids_list = [] diff --git a/networking_cisco/tests/unit/cisco/cfg_agent/test_routing_svc_helper.py b/networking_cisco/tests/unit/cisco/cfg_agent/test_routing_svc_helper.py index 7015fe6..ab6abce 100644 --- a/networking_cisco/tests/unit/cisco/cfg_agent/test_routing_svc_helper.py +++ b/networking_cisco/tests/unit/cisco/cfg_agent/test_routing_svc_helper.py @@ -871,6 +871,22 @@ class TestBasicRoutingOperations(base.BaseTestCase): self.routing_helper._router_removed.assert_any_call(router2['id']) self.routing_helper._process_router.assert_called_with(ri1) + def test_process_routers_skips_routers_on_other_hosting_devices(self): + router1, port1 = prepare_router_data() + r1_id = router1['id'] + r1_info = routing_svc_helper.RouterInfo(r1_id, router1) + router2, port2 = prepare_router_data() + r2_id = router2['id'] + self.routing_helper.router_info = { + r1_id: r1_info, + r2_id: routing_svc_helper.RouterInfo(r2_id, router2)} + self.routing_helper._process_router = mock.Mock() + self.routing_helper._router_removed = mock.Mock() + self.routing_helper._process_routers([router1], [], + router1['hosting_device']['id']) + self.routing_helper._process_router.assert_called_once_with(r1_info) + self.assertEqual(0, self.routing_helper._router_removed.call_count) + class TestDeviceSyncOperations(base.BaseTestCase):