← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 1956785] Re: Duplicate validator TypeError for dict values

 

Reviewed:  https://review.opendev.org/c/openstack/neutron-lib/+/823857
Committed: https://opendev.org/openstack/neutron-lib/commit/88b755c0e86414ce8d6b57d6335d22bb892eaffb
Submitter: "Zuul (22348)"
Branch:    master

commit 88b755c0e86414ce8d6b57d6335d22bb892eaffb
Author: Harald Jensås <hjensas@xxxxxxxxxx>
Date:   Fri Jan 7 19:21:58 2022 +0100

    Fix collect duplicates TypeError for dict values
    
    The _collect_duplicates uses a set for duplicates. This
    does not work when the values in the list are dictionaries.
    
    Instead of using a set, use a list and extend the condition to
    only add to the list if seen and not already in dups.
    
    Closes-Bug: #1956785
    Change-Id: Iad627bcfb95699febd504d7dc7fc9e8a7d813a9e


** Changed in: neutron
       Status: In Progress => Fix Released

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

Title:
  Duplicate validator TypeError for dict values

Status in neutron:
  Fix Released

Bug description:
  In the below logs I observe that a port update is attempted with
  duplicate extra_dhcp_opts. Since the values for extra_dhcp_opts are
  dicts the _collect_duplicates() method[1] fails as it attempts to add
  dict's to a set.

  [1] https://opendev.org/openstack/neutron-
  lib/src/branch/master/neutron_lib/api/validators/__init__.py#L76-L91

  
  2022-01-07 12:18:22.854 27 DEBUG neutron.api.v2.base [req-67d0c767-16c3-4bd6-8c7d-455becccaa96 - fake_project_id - - -] Request body: {'port': {'extra_dhcp_opts': [{'opt_name': 'tag:!ipxe6,59', 'opt_value': 'tftp://[fd00:fd00:fd00::1]/undionly.kpxe', 'ip_version': 6}, {'opt_name': 'tag:ipxe6,59', 'opt_value': 'http://[fd00:fd00:fd00::1]:8088/boot.ipxe', 'ip_version': 6}, {'opt_name': 'tag:!ipxe6,59', 'opt_value': 'tftp://[fd00:fd00:fd00::1]/undionly.kpxe', 'ip_version': 6}, {'opt_name': 'tag:ipxe6,59', 'opt_value': 'http://[fd00:fd00:fd00::1]:8088/boot.ipxe', 'ip_version': 6}, {'opt_name': 'tag:!ipxe6,59', 'opt_value': 'tftp://[fd00:fd00:fd00::1]/undionly.kpxe', 'ip_version': 6}, {'opt_name': 'tag:ipxe6,59', 'opt_value': 'http://[fd00:fd00:fd00::1]:8088/boot.ipxe', 'ip_version': 6}, {'opt_name': 'tag:!ipxe6,59', 'opt_value': 'tftp://[fd00:fd00:fd00::1]/undionly.kpxe', 'ip_version': 6}, {'opt_name': 'tag:ipxe6,59', 'opt_value': 'http://[fd00:fd00:fd00::1]:8088/boot.ipxe', 'ip_version': 6}]}} prepare_request_body /usr/lib/python3.6/site-packages/neutron/api/v2/base.py:729

  2022-01-07 12:18:22.856 27 WARNING neutron.pecan_wsgi.hooks.body_validation [req-67d0c767-16c3-4bd6-8c7d-455becccaa96 - fake_project_id - - -] An exception happened while processing the request body. The exception message is [unhashable type: 'dict'].
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation [req-67d0c767-16c3-4bd6-8c7d-455becccaa96 - fake_project_id - - -] PUT failed.: TypeError: unhashable type: 'dict'
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation Traceback (most recent call last):
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/pecan/core.py", line 682, in __call__
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     controller, args, kwargs = self.find_controller(state)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/pecan/core.py", line 858, in find_controller
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     controller, args, kw = super(Pecan, self).find_controller(_state)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/pecan/core.py", line 550, in find_controller
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     self.handle_hooks(self.determine_hooks(controller), 'before', state)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/pecan/core.py", line 865, in handle_hooks
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     return super(Pecan, self).handle_hooks(hooks, *args, **kw)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/pecan/core.py", line 342, in handle_hooks
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     result = getattr(hook, hook_type)(*args)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/neutron/pecan_wsgi/hooks/body_validation.py", line 71, in before
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     raise e
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/neutron/pecan_wsgi/hooks/body_validation.py", line 67, in before
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     allow_bulk=is_create)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/neutron/api/v2/base.py", line 776, in prepare_request_body
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     attr_ops.convert_values(res_dict, exc_cls=webob.exc.HTTPBadRequest)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/neutron_lib/api/attributes.py", line 233, in convert_values
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     attr_vals['validate'][rule])
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/neutron_lib/api/validators/__init__.py", line 513, in validate_any_key_specs_or_none
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     msg = _validate_list_of_items(dict_validator, data)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/neutron_lib/api/validators/__init__.py", line 110, in _validate_list_of_items
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     dups = _collect_duplicates(data)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation   File "/usr/lib/python3.6/site-packages/neutron_lib/api/validators/__init__.py", line 88, in _collect_duplicates
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation     dups.add(datum)
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation TypeError: unhashable type: 'dict'
  2022-01-07 12:18:22.858 27 ERROR neutron.pecan_wsgi.hooks.translation

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



References