)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6a92f3f346b0da89a70b1b83dccdcda068bbbaa9","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Commit 07077bebb69da29994257d061d3a8d7ea9598c3d removed"},{"line_number":10,"context_line":"enforcing that a subnet should be defined on a network. In"},{"line_number":11,"context_line":"the case of IPv6 this is cool, but for V4 is is problematic."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The patch adds in a callback that enables the plugin to"},{"line_number":14,"context_line":"determine validation policy."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5a5ae5dd_9c240bc7","line":11,"updated":"2016-02-09 06:25:23.000000000","message":"nit %s/is/it\u0027s/g","commit_id":"550da4534243dfc5f4663f14b5e71e9d697062ef"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"65a5df55441ec8a3f472608b4d3bd7fad26dd98d","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Commit 07077bebb69da29994257d061d3a8d7ea9598c3d removed"},{"line_number":10,"context_line":"enforcing that a subnet should be defined on a network. In"},{"line_number":11,"context_line":"the case of IPv6 this is cool, but for V4 is is problematic."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The patch adds in a callback that enables the plugin to"},{"line_number":14,"context_line":"determine validation policy."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5a5ae5dd_ad850fae","line":11,"in_reply_to":"5a5ae5dd_9c240bc7","updated":"2016-02-09 07:42:05.000000000","message":"Done","commit_id":"550da4534243dfc5f4663f14b5e71e9d697062ef"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d88195e238fd320d8dcc18344504c21e21e7c6c7","unresolved":false,"context_lines":[{"line_number":11,"context_line":"the case of IPv6 this is cool, but for V4 it is problematic."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The patch adds in a callback that enables the plugin to"},{"line_number":14,"context_line":"determine validation policy."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"The callback will be invoked prior to creating the gateway"},{"line_number":17,"context_line":"port."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a57f1b5_2d8db57b","line":14,"updated":"2016-02-09 18:18:36.000000000","message":"The use of callbacks is sound, and I guess it\u0027s fine to add a callback regardless of this issue you\u0027re trying to solve.\n\nThat said, I wonder under what circumstances this is meant to be plugin specific. I don\u0027t actually understand what you mean by \u0027problematic\u0027. All I see is a stacktrace in nsx that could be dealt with differently, and I know for a fact that for other plugins setting an external gateway from a network without a subnet doesn\u0027t hurt.\n\nSo in a nutshell, I think this patch may stand in its own merit, but I am dubious it\u0027s the right approach to solve the referenced bug.\n\nCan you elaborate a bit more?","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"}],"neutron/db/l3_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"6a92f3f346b0da89a70b1b83dccdcda068bbbaa9","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                kwargs \u003d {\u0027context\u0027: context, \u0027router_id\u0027: router_id,"},{"line_number":396,"context_line":"                          \u0027network_id\u0027: new_network_id, \u0027subnets\u0027: subnets}"},{"line_number":397,"context_line":"                registry.notify("},{"line_number":398,"context_line":"                    resources.ROUTER_GATEWAY, events.BEFORE_CREATE, self,"},{"line_number":399,"context_line":"                    **kwargs)"},{"line_number":400,"context_line":"            except exceptions.CallbackFailure as e:"},{"line_number":401,"context_line":"                # raise the underlying exception"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a5ae5dd_02fe7205","line":398,"updated":"2016-02-09 06:25:23.000000000","message":"couldn\u0027t find the subscription for ROUTER_GATEWAY @L1688. Am I missing anything?","commit_id":"550da4534243dfc5f4663f14b5e71e9d697062ef"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"65a5df55441ec8a3f472608b4d3bd7fad26dd98d","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                kwargs \u003d {\u0027context\u0027: context, \u0027router_id\u0027: router_id,"},{"line_number":396,"context_line":"                          \u0027network_id\u0027: new_network_id, \u0027subnets\u0027: subnets}"},{"line_number":397,"context_line":"                registry.notify("},{"line_number":398,"context_line":"                    resources.ROUTER_GATEWAY, events.BEFORE_CREATE, self,"},{"line_number":399,"context_line":"                    **kwargs)"},{"line_number":400,"context_line":"            except exceptions.CallbackFailure as e:"},{"line_number":401,"context_line":"                # raise the underlying exception"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a5ae5dd_8d01333c","line":398,"in_reply_to":"5a5ae5dd_02fe7205","updated":"2016-02-09 07:42:05.000000000","message":"the subscription is done by external plugins - for example https://review.openstack.org/277340","commit_id":"550da4534243dfc5f4663f14b5e71e9d697062ef"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f27295c72d0dfc7f173a926d258778723df44a80","unresolved":false,"context_lines":[{"line_number":396,"context_line":"                          \u0027network_id\u0027: new_network_id, \u0027subnets\u0027: subnets}"},{"line_number":397,"context_line":"                registry.notify("},{"line_number":398,"context_line":"                    resources.ROUTER_GATEWAY, events.BEFORE_CREATE, self,"},{"line_number":399,"context_line":"                    **kwargs)"},{"line_number":400,"context_line":"            except exceptions.CallbackFailure as e:"},{"line_number":401,"context_line":"                # raise the underlying exception"},{"line_number":402,"context_line":"                raise e.errors[0].error"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_b816c153","line":399,"range":{"start_line":399,"start_character":22,"end_line":399,"end_character":28},"updated":"2016-02-09 18:55:20.000000000","message":"nit:  Why bother with **kwargs.  Why don\u0027t we just pass the arguments directly?\n\n  registry.notify(\n      resources.ROUTER_GATEWAY, events.BEFORE_CREATE, self,\n      context\u003dcontext,\n      router_id\u003drouter_id,\n      network_id\u003dnet_network_id,\n      subnets\u003dsubnets)\n\nI marked this a nit (and therefore won\u0027t -1) because -- looking through this file -- I see that we\u0027re split on this matter.  It doesn\u0027t change the behavior so it isn\u0027t something I\u0027ll hold the patch up for.","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"130bff8f39f2229d2d9d4971e15dc27c6ba81446","unresolved":false,"context_lines":[{"line_number":396,"context_line":"                          \u0027network_id\u0027: new_network_id, \u0027subnets\u0027: subnets}"},{"line_number":397,"context_line":"                registry.notify("},{"line_number":398,"context_line":"                    resources.ROUTER_GATEWAY, events.BEFORE_CREATE, self,"},{"line_number":399,"context_line":"                    **kwargs)"},{"line_number":400,"context_line":"            except exceptions.CallbackFailure as e:"},{"line_number":401,"context_line":"                # raise the underlying exception"},{"line_number":402,"context_line":"                raise e.errors[0].error"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_33d8b21d","line":399,"range":{"start_line":399,"start_character":22,"end_line":399,"end_character":28},"in_reply_to":"3a57f1b5_b816c153","updated":"2016-02-09 18:56:54.000000000","message":"this is something we could debate indefinitely, I hope we\u0027ll have a good answer for this once the neutron-lib version for this gets to a closure.","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"}],"neutron/tests/unit/extensions/test_l3.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d88195e238fd320d8dcc18344504c21e21e7c6c7","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"                    errors \u003d ["},{"line_number":1626,"context_line":"                        exceptions.NotificationError("},{"line_number":1627,"context_line":"                            \u0027foo_callback_id\u0027,"},{"line_number":1628,"context_line":"                            n_exc.InvalidInput(error_message\u003d\u0027forbidden\u0027)),"},{"line_number":1629,"context_line":"                    ]"},{"line_number":1630,"context_line":"                    notify.side_effect \u003d exceptions.CallbackFailure("},{"line_number":1631,"context_line":"                        errors\u003derrors)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_6a22b3bb","line":1628,"updated":"2016-02-09 18:18:36.000000000","message":"shouldn\u0027t this be more like a Conflict exception?","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"130bff8f39f2229d2d9d4971e15dc27c6ba81446","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"                    errors \u003d ["},{"line_number":1626,"context_line":"                        exceptions.NotificationError("},{"line_number":1627,"context_line":"                            \u0027foo_callback_id\u0027,"},{"line_number":1628,"context_line":"                            n_exc.InvalidInput(error_message\u003d\u0027forbidden\u0027)),"},{"line_number":1629,"context_line":"                    ]"},{"line_number":1630,"context_line":"                    notify.side_effect \u003d exceptions.CallbackFailure("},{"line_number":1631,"context_line":"                        errors\u003derrors)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_13f2569b","line":1628,"in_reply_to":"3a57f1b5_533a0ecf","updated":"2016-02-09 18:56:54.000000000","message":"Agreed, hence I didn\u0027t raise a flag.","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f27295c72d0dfc7f173a926d258778723df44a80","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"                    errors \u003d ["},{"line_number":1626,"context_line":"                        exceptions.NotificationError("},{"line_number":1627,"context_line":"                            \u0027foo_callback_id\u0027,"},{"line_number":1628,"context_line":"                            n_exc.InvalidInput(error_message\u003d\u0027forbidden\u0027)),"},{"line_number":1629,"context_line":"                    ]"},{"line_number":1630,"context_line":"                    notify.side_effect \u003d exceptions.CallbackFailure("},{"line_number":1631,"context_line":"                        errors\u003derrors)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_533a0ecf","line":1628,"in_reply_to":"3a57f1b5_6a22b3bb","updated":"2016-02-09 18:55:20.000000000","message":"I think I\u0027d prefer InvalidInput over Conflict.  What is conflicting?  Short of creating a new exception class for this condition, InvalidInput is probably the one I think fits the best.\n\nAs for creating a new exception class, I wouldn\u0027t create a new exception class unless you do so in the plugin repo because the condition is specific to the plugin, right?  So, since this test is testing the core, this is probably the right exception.","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"32c8f52df3e62c378f0d6aa9681a391459b47f72","unresolved":false,"context_lines":[{"line_number":1627,"context_line":"                            \u0027foo_callback_id\u0027,"},{"line_number":1628,"context_line":"                            n_exc.InvalidInput(error_message\u003d\u0027forbidden\u0027)),"},{"line_number":1629,"context_line":"                    ]"},{"line_number":1630,"context_line":"                    notify.side_effect \u003d exceptions.CallbackFailure("},{"line_number":1631,"context_line":"                        errors\u003derrors)"},{"line_number":1632,"context_line":"                    self._add_external_gateway_to_router("},{"line_number":1633,"context_line":"                        r[\u0027router\u0027][\u0027id\u0027], n[\u0027network\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_27e2b4a0","line":1630,"updated":"2016-02-09 17:47:52.000000000","message":"this side-effect seems ineffective to validate the assert_called_once_with. In other words this test will pass even without the exception being raised.","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"ee1ff5bb2ea1ddbff985790cbc4b634e1c3f307e","unresolved":false,"context_lines":[{"line_number":1627,"context_line":"                            \u0027foo_callback_id\u0027,"},{"line_number":1628,"context_line":"                            n_exc.InvalidInput(error_message\u003d\u0027forbidden\u0027)),"},{"line_number":1629,"context_line":"                    ]"},{"line_number":1630,"context_line":"                    notify.side_effect \u003d exceptions.CallbackFailure("},{"line_number":1631,"context_line":"                        errors\u003derrors)"},{"line_number":1632,"context_line":"                    self._add_external_gateway_to_router("},{"line_number":1633,"context_line":"                        r[\u0027router\u0027][\u0027id\u0027], n[\u0027network\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_c7172053","line":1630,"in_reply_to":"3a57f1b5_27e2b4a0","updated":"2016-02-09 17:50:47.000000000","message":"please see the line below - the side effect causes the exception to be raises - hence the exc.HTTPBadRequest.code\nIn addition to this if the exception was not raised the notify would be called twice - for before and after","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d88195e238fd320d8dcc18344504c21e21e7c6c7","unresolved":false,"context_lines":[{"line_number":1627,"context_line":"                            \u0027foo_callback_id\u0027,"},{"line_number":1628,"context_line":"                            n_exc.InvalidInput(error_message\u003d\u0027forbidden\u0027)),"},{"line_number":1629,"context_line":"                    ]"},{"line_number":1630,"context_line":"                    notify.side_effect \u003d exceptions.CallbackFailure("},{"line_number":1631,"context_line":"                        errors\u003derrors)"},{"line_number":1632,"context_line":"                    self._add_external_gateway_to_router("},{"line_number":1633,"context_line":"                        r[\u0027router\u0027][\u0027id\u0027], n[\u0027network\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_aa718be2","line":1630,"in_reply_to":"3a57f1b5_c7172053","updated":"2016-02-09 18:18:36.000000000","message":"Ok, I am with you.","commit_id":"31aed09c1b4540b3f9ab26473a1b39ea1d144698"}]}
