← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 2025056] [NEW] Router ports without IP addresses shouldn't be allowed to deletion using port's API directly

 

Public bug reported:

Long time ago there was bug https://bugs.launchpad.net/neutron/+bug/1104337 and as fix for this bug there was patch https://review.opendev.org/c/openstack/neutron/+/20424 proposed. This patch allowed to remove router ports without fixed IPs directly using "port delete" command.
But it may cause error 500 if port really belongs to an existing router. Steps to reproduce the issue:

1. Create network (external) and do NOT create subnet for it,
2. Create router,
3. Set network from p. 1 as external gateway for the router,
4. Try to delete external gateway's port using "openstack port delete" command - it will fail with error 500. Stacktrace in neutron server log is as below:

2023-06-22 05:41:06.672 16 DEBUG neutron.db.l3_db [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] Port 9978f00d-4be2-474d-89a7-07d9b1e797df has owner network:router_gateway, but no IP address, so it can be deleted prevent_l3_port_deletion /usr/lib/python3.9/site-packages/neutron/db/l3_db.py:1675
2023-06-22 05:41:07.085 16 DEBUG neutron.plugins.ml2.plugin [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] Calling delete_port for 9978f00d-4be2-474d-89a7-07d9b1e797df owned by network:router_gateway delete_port /usr/lib/python3.9/site-packages/neutron/plugins/ml2/plugin.py:2069
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] DELETE failed.: oslo_db.exception.DBReferenceError: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`ovs_neutron`.`routers`, CONSTRAINT `routers_ibfk_1` FOREIGN KEY (`gw_port_id`) REFERENCES `ports` (`id`))')
[SQL: DELETE FROM ports WHERE ports.id = %(id)s]
[parameters: {'id': '9978f00d-4be2-474d-89a7-07d9b1e797df'}]
(Background on this error at: http://sqlalche.me/e/13/gkpj)
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation Traceback (most recent call last):
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1276, in _execute_context
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     self.dialect.do_execute(
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     cursor.execute(statement, parameters)
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     result = self._query(query)
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     conn.query(q)
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     self._affected_rows = self._read_query_result(unbuffered=unbuffered)
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     result.read()
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     first_packet = self.connection._read_packet()
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     packet.raise_for_error()
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     err.raise_mysql_exception(self._data)
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     raise errorclass(errno, errval)
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation pymysql.err.IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`ovs_neutron`.`routers`, CONSTRAINT `routers_ibfk_1` FOREIGN KEY (`gw_port_id`) REFERENCES `ports` (`id`))')
2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation 
2023-06-22 05:41:07.381 16 DEBUG neutron.pecan_wsgi.hooks.notifier [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] No notification will be sent due to unsuccessful status code: 500 after /usr/lib/python3.9/site-packages/neutron/pecan_wsgi/hooks/notifier.py:78
2023-06-22 05:41:07.384 16 INFO neutron.wsgi [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] 10.0.10.1,172.25.1.181 "DELETE /v2.0/ports/9978f00d-4be2-474d-89a7-07d9b1e797df HTTP/1.1" status: 500  len: 344 time: 0.8368094


Originally it was done to allow cleanup of the routers and ports for which subnet was deleted first. But this is not possible currently so we shouldn't allow deletion of the ports without fixeds IPs.

Of course having ports without IP address connected to the router isn't
maybe something very common and really useful but currently we do allow
that in our API so it will be easier to block deletion of such ports
rather than change API and prevent creation of such ports at all.

** Affects: neutron
     Importance: Medium
     Assignee: Slawek Kaplonski (slaweq)
         Status: New


** Tags: l3-ipam-dhcp

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to neutron.
https://bugs.launchpad.net/bugs/2025056

Title:
  Router ports without IP addresses shouldn't be allowed to deletion
  using port's API directly

Status in neutron:
  New

Bug description:
  Long time ago there was bug https://bugs.launchpad.net/neutron/+bug/1104337 and as fix for this bug there was patch https://review.opendev.org/c/openstack/neutron/+/20424 proposed. This patch allowed to remove router ports without fixed IPs directly using "port delete" command.
  But it may cause error 500 if port really belongs to an existing router. Steps to reproduce the issue:

  1. Create network (external) and do NOT create subnet for it,
  2. Create router,
  3. Set network from p. 1 as external gateway for the router,
  4. Try to delete external gateway's port using "openstack port delete" command - it will fail with error 500. Stacktrace in neutron server log is as below:

  2023-06-22 05:41:06.672 16 DEBUG neutron.db.l3_db [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] Port 9978f00d-4be2-474d-89a7-07d9b1e797df has owner network:router_gateway, but no IP address, so it can be deleted prevent_l3_port_deletion /usr/lib/python3.9/site-packages/neutron/db/l3_db.py:1675
  2023-06-22 05:41:07.085 16 DEBUG neutron.plugins.ml2.plugin [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] Calling delete_port for 9978f00d-4be2-474d-89a7-07d9b1e797df owned by network:router_gateway delete_port /usr/lib/python3.9/site-packages/neutron/plugins/ml2/plugin.py:2069
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] DELETE failed.: oslo_db.exception.DBReferenceError: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`ovs_neutron`.`routers`, CONSTRAINT `routers_ibfk_1` FOREIGN KEY (`gw_port_id`) REFERENCES `ports` (`id`))')
  [SQL: DELETE FROM ports WHERE ports.id = %(id)s]
  [parameters: {'id': '9978f00d-4be2-474d-89a7-07d9b1e797df'}]
  (Background on this error at: http://sqlalche.me/e/13/gkpj)
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation Traceback (most recent call last):
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/base.py", line 1276, in _execute_context
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     self.dialect.do_execute(
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib64/python3.9/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     cursor.execute(statement, parameters)
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 163, in execute
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     result = self._query(query)
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/cursors.py", line 321, in _query
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     conn.query(q)
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 505, in query
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 724, in _read_query_result
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     result.read()
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 1069, in read
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     first_packet = self.connection._read_packet()
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/connections.py", line 676, in _read_packet
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     packet.raise_for_error()
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/protocol.py", line 223, in raise_for_error
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     err.raise_mysql_exception(self._data)
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.9/site-packages/pymysql/err.py", line 107, in raise_mysql_exception
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation     raise errorclass(errno, errval)
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation pymysql.err.IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`ovs_neutron`.`routers`, CONSTRAINT `routers_ibfk_1` FOREIGN KEY (`gw_port_id`) REFERENCES `ports` (`id`))')
  2023-06-22 05:41:07.360 16 ERROR neutron.pecan_wsgi.hooks.translation 
  2023-06-22 05:41:07.381 16 DEBUG neutron.pecan_wsgi.hooks.notifier [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] No notification will be sent due to unsuccessful status code: 500 after /usr/lib/python3.9/site-packages/neutron/pecan_wsgi/hooks/notifier.py:78
  2023-06-22 05:41:07.384 16 INFO neutron.wsgi [req-a261d22f-9243-4b22-8d40-a5e7bcd63453 abd0fab2837040f383c986b6a723fbec 39e32a986a4d4f42bce967634a308f99 - default default] 10.0.10.1,172.25.1.181 "DELETE /v2.0/ports/9978f00d-4be2-474d-89a7-07d9b1e797df HTTP/1.1" status: 500  len: 344 time: 0.8368094

  
  Originally it was done to allow cleanup of the routers and ports for which subnet was deleted first. But this is not possible currently so we shouldn't allow deletion of the ports without fixeds IPs.

  Of course having ports without IP address connected to the router
  isn't maybe something very common and really useful but currently we
  do allow that in our API so it will be easier to block deletion of
  such ports rather than change API and prevent creation of such ports
  at all.

To manage notifications about this bug go to:
https://bugs.launchpad.net/neutron/+bug/2025056/+subscriptions



Follow ups