From ac01b7c7aee05b823422f56c441b03148913ea5f Mon Sep 17 00:00:00 2001 From: sbalineni Date: Thu, 3 Mar 2016 16:46:14 -0800 Subject: [PATCH] api-server: Do not allow to configure routes with duplicate prefixes Change-Id: Iecf6d3a934152db548615c2b9f157e0930cac3b8 Closes-Bug: #1546887 --- .../api-server/tests/test_logical_router.py | 33 +++++++++++++++++++ src/config/api-server/vnc_cfg_api_server.py | 2 ++ src/config/api-server/vnc_cfg_types.py | 27 +++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/config/api-server/tests/test_logical_router.py b/src/config/api-server/tests/test_logical_router.py index 5b7cefaa0f0..b6ecc6cfb06 100644 --- a/src/config/api-server/tests/test_logical_router.py +++ b/src/config/api-server/tests/test_logical_router.py @@ -343,6 +343,39 @@ def test_lr_v6_subnets(self): self._vnc_lib.domain_delete(id=domain.uuid) #end + def test_route_table_prefixes(self): + rt = RouteTable("rt1") + routes = RouteTableType() + route1 = RouteType(prefix="1.1.1.1/0", next_hop="10.10.10.10", next_hop_type="ip-address") + route2 = RouteType(prefix="1.1.1.1/0", next_hop="20.20.20.20", next_hop_type="ip-address") + routes.add_route(route1) + routes.add_route(route2) + rt.set_routes(routes) + try: + self._vnc_lib.route_table_create(rt) + self.assertTrue(False, 'Create succeeded unexpectedly - duplicate prefixe routes') + except cfgm_common.exceptions.BadRequest as e: + pass + + routes.delete_route(route2) + route2 = RouteType(prefix="1.1.1.2/0", next_hop="20.20.20.20", next_hop_type="ip-address") + routes.add_route(route2) + rt.set_routes(routes) + try: + self._vnc_lib.route_table_create(rt) + except: + self.assertTrue(False, 'Create failed') + + routes.delete_route(route2) + route2 = RouteType(prefix="1.1.1.1/0", next_hop="20.20.20.20", next_hop_type="ip-address") + routes.add_route(route2) + rt.set_routes(routes) + try: + self._vnc_lib.route_table_update(rt) + self.assertTrue(False, 'Update succeeded unexpectedly - duplicate prefixe routes') + except cfgm_common.exceptions.BadRequest as e: + pass + #end test_route_table_prefixes #end diff --git a/src/config/api-server/vnc_cfg_api_server.py b/src/config/api-server/vnc_cfg_api_server.py index ac668467605..b5189f12bad 100644 --- a/src/config/api-server/vnc_cfg_api_server.py +++ b/src/config/api-server/vnc_cfg_api_server.py @@ -1213,6 +1213,8 @@ def __init__(self, args_str=None): vnc_cfg_types.LogicalInterfaceServer) self.set_resource_class('physical-interface', vnc_cfg_types.PhysicalInterfaceServer) + self.set_resource_class('route-table', + vnc_cfg_types.RouteTableServer) self.set_resource_class('virtual-ip', vnc_cfg_types.VirtualIpServer) self.set_resource_class('loadbalancer-healthmonitor', diff --git a/src/config/api-server/vnc_cfg_types.py b/src/config/api-server/vnc_cfg_types.py index e29c2b1f9cf..e6854b9d7d8 100644 --- a/src/config/api-server/vnc_cfg_types.py +++ b/src/config/api-server/vnc_cfg_types.py @@ -1463,6 +1463,33 @@ def _check_vlan(cls, obj_dict, db_conn): # end class LogicalInterfaceServer +class RouteTableServer(Resource, RouteTable): + + @classmethod + def pre_dbe_create(cls, tenant_name, obj_dict, db_conn): + return cls._check_prefixes(obj_dict) + # end pre_dbe_create + + @classmethod + def pre_dbe_update(cls, id, fq_name, obj_dict, db_conn, **kwargs): + return cls._check_prefixes(obj_dict) + # end pre_dbe_update + + @classmethod + def _check_prefixes(cls, obj_dict): + routes = obj_dict.get('routes') or {} + in_routes = routes.get("route") or [] + in_prefixes = [r.get('prefix') for r in in_routes] + in_prefixes_set = set(in_prefixes) + if len(in_prefixes) != len(in_prefixes_set): + return (False, (400, 'duplicate prefixes not ' + 'allowed: %s' % obj_dict.get('uuid'))) + + return (True, "") + # end _check_prefixes + +# end class RouteTableServer + class PhysicalInterfaceServer(Resource, PhysicalInterface): @classmethod