)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"31e5900c24b58cb7b1d8ad2ed91fdbd65f291bec","unresolved":false,"context_lines":[{"line_number":10,"context_line":"attributes, No error will shown."},{"line_number":11,"context_line":"This patch added verify_attributes() in _validate_dict(), so that"},{"line_number":12,"context_line":"attributes inside a dict will also be verified."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ia859ae015642a3f8cfd8c54afe2450fa82aaef43"},{"line_number":15,"context_line":"Closes-Bug: #1535626"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dae33548_ee63cb3f","line":13,"updated":"2016-02-16 07:03:20.000000000","message":"APIImpact","commit_id":"8fd86f5f4dfce6db40c7d292e2abd628fbbc4c64"}],"neutron/api/v2/attributes.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"19f7ba40150d571ddb5469a627c94ea95dcded1e","unresolved":false,"context_lines":[{"line_number":991,"context_line":"    extra_keys \u003d set(res_dict.keys()) - set(attr_info.keys())"},{"line_number":992,"context_line":"    if extra_keys:"},{"line_number":993,"context_line":"        msg \u003d _(\"Unrecognized attribute(s) \u0027%s\u0027\") % \u0027, \u0027.join(extra_keys)"},{"line_number":994,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dae33548_c3595900","line":994,"range":{"start_line":994,"start_character":8,"end_line":994,"end_character":43},"updated":"2016-02-16 18:37:00.000000000","message":"All validators return error message when a validation error is detected and return None when it succeeds.\nRaising an exception in validators introduces another pattern.","commit_id":"3df1c046ebaf68b86cf0ab6d6be2caf21d3856ff"},{"author":{"_account_id":18785,"name":"Bo Chi","email":"bochi@tethrnet.com","username":"bochi"},"change_message_id":"18643b9b5421ca4280e07d4d0a157984c15c6894","unresolved":false,"context_lines":[{"line_number":991,"context_line":"    extra_keys \u003d set(res_dict.keys()) - set(attr_info.keys())"},{"line_number":992,"context_line":"    if extra_keys:"},{"line_number":993,"context_line":"        msg \u003d _(\"Unrecognized attribute(s) \u0027%s\u0027\") % \u0027, \u0027.join(extra_keys)"},{"line_number":994,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dae33548_900add77","line":994,"range":{"start_line":994,"start_character":8,"end_line":994,"end_character":43},"in_reply_to":"dae33548_c3595900","updated":"2016-02-17 08:08:24.000000000","message":"Done","commit_id":"3df1c046ebaf68b86cf0ab6d6be2caf21d3856ff"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8b7d38b97536c84773d0cae50e1af41a0aed5020","unresolved":false,"context_lines":[{"line_number":993,"context_line":"    extra_keys \u003d set(res_dict.keys()) - set(attr_info.keys())"},{"line_number":994,"context_line":"    if extra_keys:"},{"line_number":995,"context_line":"        msg \u003d _(\"Unrecognized attribute(s) \u0027%s\u0027\") % \u0027, \u0027.join(extra_keys)"},{"line_number":996,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_ff0e9139","line":996,"updated":"2016-02-17 09:59:25.000000000","message":"This method is used in other places too.\nI think changing this breaks others.\n\n  $ grep verify_attributes **/*.py\n  neutron/api/v2/attributes.py:def verify_attributes(res_dict, attr_info):\n  neutron/api/v2/base.py:        attributes.verify_attributes(res_dict, attr_info)\n  neutron/plugins/common/utils.py:        attributes.verify_attributes(res_dict, attr_info)\n\nYou changed neutron/api/v2/base.py, but neutron/plugins/common/utils.py is still remaining.\n\nHow about adding raise_exc\u003dTrue as an argument?\n\n  if extra_keys:\n      if raise_exc:\n           raise webob.exc.HTTPBadRequest(msg)\n      else:\n           return msg","commit_id":"a2465dbbebdec4572c9d84ade8a04d099a522058"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1af4c4f42cd8a4e2b00eaee87f18c7720fbbc3a8","unresolved":false,"context_lines":[{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    # Check whether all required keys are present"},{"line_number":454,"context_line":"    required_keys \u003d [key for key, spec in six.iteritems(key_specs)"},{"line_number":455,"context_line":"                     if spec.get(\u0027required\u0027)]"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    if required_keys:"},{"line_number":458,"context_line":"        msg \u003d _verify_dict_keys(required_keys, data, False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_fb63c13f","line":455,"updated":"2016-02-24 23:27:08.000000000","message":"if you dropped this line the _verify_dict_keys would catch your error. I suspect this was done by design.\n\nBefore we go ahead with this one let\u0027s try to figure out what regression this might introduce.","commit_id":"d5fefe0f18f2a8ad7abfe57bc4fba12b9f03db8e"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"3142e46e4448fc962be2587e1af27296af45c2ff","unresolved":false,"context_lines":[{"line_number":452,"context_line":""},{"line_number":453,"context_line":"    # Check whether all required keys are present"},{"line_number":454,"context_line":"    required_keys \u003d [key for key, spec in six.iteritems(key_specs)"},{"line_number":455,"context_line":"                     if spec.get(\u0027required\u0027)]"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    if required_keys:"},{"line_number":458,"context_line":"        msg \u003d _verify_dict_keys(required_keys, data, False)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5aef4532_3b823395","line":455,"in_reply_to":"bae84128_fb63c13f","updated":"2016-03-07 18:55:00.000000000","message":"afaict all the code in this routine after line 449 has been added with the same commit a5c101da\n\nIt seems to me that verify_keys does exactly the same job as verify_attributes here, so we might just remove line 457","commit_id":"d5fefe0f18f2a8ad7abfe57bc4fba12b9f03db8e"}],"releasenotes/notes/validate-attributes-inside-a-dict-af43b9e2aa84be28.yaml":[{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"f876cac31d47255decb3a096fcb80dc179512096","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Attributes inside a dict in the request body will be validated."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - If a user passes a dict in the request body that has attributes"},{"line_number":6,"context_line":"    unknown to neutron, this request will be denied."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"dae33548_722c4199","line":6,"range":{"start_line":2,"start_character":0,"end_line":6,"end_character":52},"updated":"2016-02-18 05:13:08.000000000","message":"I don\u0027t think this patch is new feature. What about \"fixes\"?\n\n---\nfixes:\n  - When users pass request with attributes for a resrouce, the server validates if the attributes are correct.","commit_id":"f8d34ad38705eb294ddfa6cb803b3fa6e44d3ca3"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"cbf523542e17cc650560374417c12416317b839f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Attributes inside a dict in the request body will be validated."},{"line_number":4,"context_line":"fixes:"},{"line_number":5,"context_line":"  - When users pass dict attributes that has keys unknown to neutron"},{"line_number":6,"context_line":"    in the request body, this request will be denied, instead of "}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dae33548_ab0bf022","line":3,"range":{"start_line":2,"start_character":0,"end_line":3,"end_character":67},"updated":"2016-02-18 06:41:22.000000000","message":"I guess that this prelude isn\u0027t needed like [1] but I\u0027m not sure.\n\n[1]: https://github.com/openstack/neutron/blob/master/releasenotes/notes/fail-on-missing-extensions-bc332124b780875b.yaml","commit_id":"36f1c8c5b2fa5a6ca785125aa6d30b482edbb402"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1721e57022aa9c410eec65a3ef89cdebf80d4c7f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Attributes inside a dict in the request body will be validated."},{"line_number":4,"context_line":"fixes:"},{"line_number":5,"context_line":"  - When users pass dict attributes that has keys unknown to neutron"},{"line_number":6,"context_line":"    in the request body, this request will be denied, instead of "}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dae33548_a575cbcb","line":3,"range":{"start_line":2,"start_character":0,"end_line":3,"end_character":67},"in_reply_to":"dae33548_ab0bf022","updated":"2016-02-18 13:08:26.000000000","message":"I agree, no prelude needed here.","commit_id":"36f1c8c5b2fa5a6ca785125aa6d30b482edbb402"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3b3f511f4b4c58efbb895d80ff09dbccf4d0012d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Attributes inside a dict in the request body will be validated."},{"line_number":4,"context_line":"fixes:"},{"line_number":5,"context_line":"  - When users pass dict attributes that has keys unknown to neutron"},{"line_number":6,"context_line":"    in the request body, this request will be denied, instead of "},{"line_number":7,"context_line":"    ignoring those keys."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dae33548_7d44ee48","line":4,"range":{"start_line":4,"start_character":0,"end_line":4,"end_character":5},"updated":"2016-02-18 16:05:35.000000000","message":"upgrade section looks better.\nIt is an upgrade impact change rather than a simple fix.","commit_id":"36f1c8c5b2fa5a6ca785125aa6d30b482edbb402"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"cbf523542e17cc650560374417c12416317b839f","unresolved":false,"context_lines":[{"line_number":3,"context_line":"    Attributes inside a dict in the request body will be validated."},{"line_number":4,"context_line":"fixes:"},{"line_number":5,"context_line":"  - When users pass dict attributes that has keys unknown to neutron"},{"line_number":6,"context_line":"    in the request body, this request will be denied, instead of "},{"line_number":7,"context_line":"    ignoring those keys."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dae33548_eb117853","line":6,"range":{"start_line":6,"start_character":64,"end_line":6,"end_character":65},"updated":"2016-02-18 06:41:22.000000000","message":"Please remove wrong space.","commit_id":"36f1c8c5b2fa5a6ca785125aa6d30b482edbb402"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1721e57022aa9c410eec65a3ef89cdebf80d4c7f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"fixes:"},{"line_number":5,"context_line":"  - When users pass dict attributes that has keys unknown to neutron"},{"line_number":6,"context_line":"    in the request body, this request will be denied, instead of "},{"line_number":7,"context_line":"    ignoring those keys."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dae33548_85b5277f","line":7,"updated":"2016-02-18 13:08:26.000000000","message":"This is a bit too developer oriented. How about:\n\n\"If a request contains unknown attributes the request will be denied. (Previously, unknown attributes were silently ignored.)\"","commit_id":"36f1c8c5b2fa5a6ca785125aa6d30b482edbb402"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3b3f511f4b4c58efbb895d80ff09dbccf4d0012d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"fixes:"},{"line_number":5,"context_line":"  - When users pass dict attributes that has keys unknown to neutron"},{"line_number":6,"context_line":"    in the request body, this request will be denied, instead of "},{"line_number":7,"context_line":"    ignoring those keys."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dae33548_babe81ab","line":7,"in_reply_to":"dae33548_85b5277f","updated":"2016-02-18 16:05:35.000000000","message":"+1 to Henry\u0027s suggestion.","commit_id":"36f1c8c5b2fa5a6ca785125aa6d30b482edbb402"},{"author":{"_account_id":20128,"name":"Han Chao","email":"hanchao7@lenovo.com","username":"HanChao"},"change_message_id":"3aee9e00c484704490cc09d29a476c125a2f636c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - If a request contains unknown attributes the request will be denied."},{"line_number":4,"context_line":"    (Previously, unknown attributes were silently ignored.)"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dae33548_0fb903ed","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":72},"updated":"2016-02-19 08:34:35.000000000","message":"If a request contains unknown attributes, the request will be denied.","commit_id":"1bcbe7eb96e1a914340bbe8ca65314688858ac93"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"3142e46e4448fc962be2587e1af27296af45c2ff","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - If a request contains unknown attributes, the request will be denied."},{"line_number":4,"context_line":"    (Previously, unknown attributes were silently ignored.)"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"5aef4532_5b1d7f72","line":4,"updated":"2016-03-07 18:55:00.000000000","message":"This is not entirely correct, because the unknow attribute must not just be in the request but in a dictionary attribute of the request","commit_id":"d5fefe0f18f2a8ad7abfe57bc4fba12b9f03db8e"}]}
