From 106e5d91061d544e4eb592411a83f7ec678dabd4 Mon Sep 17 00:00:00 2001 From: Babu Shanmugam Date: Thu, 27 Aug 2015 09:22:30 +0000 Subject: [PATCH] Router interface added with overlapping subnets is handled properly Change-Id: I7cda4effa3f9356c0cd9a35c7225c9ba2e9b12d0 Closes-bug: #1489361 --- .../vnc_client/router_res_handler.py | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/neutron_plugin_contrail/plugins/opencontrail/vnc_client/router_res_handler.py b/neutron_plugin_contrail/plugins/opencontrail/vnc_client/router_res_handler.py index 30d4749..a5cb010 100644 --- a/neutron_plugin_contrail/plugins/opencontrail/vnc_client/router_res_handler.py +++ b/neutron_plugin_contrail/plugins/opencontrail/vnc_client/router_res_handler.py @@ -324,11 +324,16 @@ def _get_subnet_cidr(self, subnet_id, subnet_dict): if subnet['id'] == subnet_id: return subnet['cidr'] - def _check_for_dup_router_subnet(self, router_id, subnet_id, + def _check_for_dup_router_subnet(self, router_obj, subnet_id, subnet_cidr): try: - router_vmi_objs = self._vmi_handler.get_vmi_list( - back_ref_id=[router_id]) + router_vmi_objs = [] + if router_obj.get_virtual_machine_interface_refs(): + vmis = [x['uuid'] + for x in router_obj.virtual_machine_interface_refs] + router_vmi_objs = self._vnc_lib.virtual_machine_interfaces_list( + obj_uuids=vmis, detail=True, + fields=['instance_ip_back_refs']) # It's possible router ports are on the same network, but # different subnets. new_ipnet = netaddr.IPNetwork(subnet_cidr) @@ -342,12 +347,12 @@ def _check_for_dup_router_subnet(self, router_id, subnet_id, fixed_ips = self._vmi_handler.get_vmi_ip_dict(vmi_obj, vn_obj, port_req_memo) vn_subnets = ( - subnet_handler.ContrailSubnetHandler.get_vn_subnets( + subnet_handler.SubnetHandler.get_vn_subnets( vn_obj)) for ip in fixed_ips: if ip['subnet_id'] == subnet_id: msg = ("Router %s already has a port on subnet %s" - % (router_id, subnet_id)) + % (router_obj.uuid, subnet_id)) self._raise_contrail_exception( 'BadRequest', resource='router', msg=msg) sub_id = ip['subnet_id'] @@ -368,7 +373,7 @@ def _check_for_dup_router_subnet(self, router_id, subnet_id, except vnc_exc.NoIdError: pass - def _get_router_iface_vnc_info(self, context, router_id, port_id=None, + def _get_router_iface_vnc_info(self, context, router_obj, port_id=None, subnet_id=None): if port_id: vmi_obj, vn_obj, rtr_uuid, fixed_ips = self._get_vmi_info(port_id) @@ -393,7 +398,7 @@ def _get_router_iface_vnc_info(self, context, router_id, port_id=None, subnet_cidr = '%s/%s' % (subnet_vnc.subnet.get_ip_prefix(), subnet_vnc.subnet.get_ip_prefix_len()) - self._check_for_dup_router_subnet(router_id, subnet_id, subnet_cidr) + self._check_for_dup_router_subnet(router_obj, subnet_id, subnet_cidr) if not port_id: vn_obj = self._subnet_handler.get_vn_obj_for_subnet_id(subnet_id) @@ -405,7 +410,7 @@ def _get_router_iface_vnc_info(self, context, router_id, port_id=None, 'network_id': vn_obj.uuid, 'fixed_ips': [fixed_ip], 'admin_state_up': True, - 'device_id': router_id, + 'device_id': router_obj.uuid, 'device_owner': n_constants.DEVICE_OWNER_ROUTER_INTF, 'name': ''} port = self._vmi_handler.resource_create(context=context, @@ -448,7 +453,7 @@ def add_router_interface(self, context, router_id, port_id=None, msg='Either port or subnet must be specified') vmi_obj, vn_obj, subnet_id = self._get_router_iface_vnc_info( - context, router_id, port_id=port_id, subnet_id=subnet_id) + context, router_obj, port_id=port_id, subnet_id=subnet_id) vmi_obj.set_virtual_machine_interface_device_owner( n_constants.DEVICE_OWNER_ROUTER_INTF)