diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index 85751a0cf0..a8a0613fc2 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -413,11 +413,11 @@ class L3_NAT_db_mixin(l3.RouterPluginBase): return DEVICE_OWNER_ROUTER_INTF def _validate_interface_info(self, interface_info): - if not interface_info: + port_id_specified = interface_info and 'port_id' in interface_info + subnet_id_specified = interface_info and 'subnet_id' in interface_info + if not (port_id_specified or subnet_id_specified): msg = _("Either subnet_id or port_id must be specified") raise n_exc.BadRequest(resource='router', msg=msg) - port_id_specified = 'port_id' in interface_info - subnet_id_specified = 'subnet_id' in interface_info if port_id_specified and subnet_id_specified: msg = _("Cannot specify both subnet-id and port-id") raise n_exc.BadRequest(resource='router', msg=msg) diff --git a/neutron/tests/unit/test_l3_plugin.py b/neutron/tests/unit/test_l3_plugin.py index 5ecb53f7ba..ccce434800 100644 --- a/neutron/tests/unit/test_l3_plugin.py +++ b/neutron/tests/unit/test_l3_plugin.py @@ -789,6 +789,13 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): None, p['port']['id']) + def test_router_add_interface_empty_port_and_subnet_ids(self): + with self.router() as r: + self._router_interface_action('add', r['router']['id'], + None, None, + expected_code=exc. + HTTPBadRequest.code) + def test_router_add_interface_port_bad_tenant_returns_404(self): with mock.patch('neutron.context.Context.to_dict') as tdict: admin_context = {'roles': ['admin']}