)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":19,"context_line":"is loaded."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Set extension as standard by adding to _supported_extension_aliases in"},{"line_number":22,"context_line":"neutron/services/l3_router/l3_router.py"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #1811166"},{"line_number":25,"context_line":"Co-Authored-By: Allain Legacy \u003callain.legacy@windriver.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"5fc1f717_a8854b5b","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":39},"updated":"2019-04-02 23:28:27.000000000","message":"neutron/services/l3_router/l3_router_plugin.py","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"}],"neutron/db/l3_dvr_db.py":[{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"872c4b51557071cd90c506d13d5343088a2bbf44","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            requested_distributed_state !\u003d original_distributed_state)"},{"line_number":94,"context_line":"        if not distributed_changed:"},{"line_number":95,"context_line":"            return False"},{"line_number":96,"context_line":"        if old_router:"},{"line_number":97,"context_line":"            admin_state_up \u003d old_router.get(\u0027admin_state_up\u0027)"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            admin_state_up \u003d router_db.admin_state_up"},{"line_number":100,"context_line":"        if admin_state_up:"},{"line_number":101,"context_line":"            msg \u003d _(\"Cannot change the \u0027distributed\u0027 attribute of active \""},{"line_number":102,"context_line":"                    \"routers. Please set router admin_state_up to False \""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_85bc17d6","line":99,"range":{"start_line":96,"start_character":8,"end_line":99,"end_character":53},"updated":"2018-12-14 00:51:55.000000000","message":"What about doing this in a single line? Like,\n\n    admin_state_up \u003d old_router.get(\u0027admin_state_up\u0027) if old_router else router_db.admin_state_up","commit_id":"d3c9ed570e5e47e732a1f1e64262863ecd4ada9f"},{"author":{"_account_id":8726,"name":"Victor Morales","email":"chipahuac@hotmail.com","username":"electrocucaracha"},"change_message_id":"872c4b51557071cd90c506d13d5343088a2bbf44","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        old_router\u003dpayload.states[0]"},{"line_number":125,"context_line":"        if not self._validate_router_migration("},{"line_number":126,"context_line":"                payload.context, payload.desired_state,"},{"line_number":127,"context_line":"                payload.request_body, old_router):"},{"line_number":128,"context_line":"            return"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        migrating_to_distributed \u003d ("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_057fa716","line":127,"range":{"start_line":127,"start_character":38,"end_line":127,"end_character":48},"updated":"2018-12-14 00:51:55.000000000","message":"it seems like old_router variable is only used here, so maybe it\u0027s not necessary to create it before.","commit_id":"d3c9ed570e5e47e732a1f1e64262863ecd4ada9f"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"85d90417935a280818b9d7981c3c49b4eb50ab9f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.l3plugin.set_extra_attr_value(context, router_db, \u0027distributed\u0027,"},{"line_number":83,"context_line":"                                           dist)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _validate_router_migration(self, context, router_db, router_res,"},{"line_number":86,"context_line":"                                   old_router\u003dNone):"},{"line_number":87,"context_line":"        \"\"\"Allow transition only when admin_state_up\u003dFalse\"\"\""},{"line_number":88,"context_line":"        original_distributed_state \u003d router_db.extra_attributes.distributed"},{"line_number":89,"context_line":"        requested_distributed_state \u003d router_res.get(\u0027distributed\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f7080827","line":86,"range":{"start_line":85,"start_character":7,"end_line":86,"end_character":52},"updated":"2018-12-15 01:02:44.000000000","message":"I see two possible test cases can be added.\n\n1. when admin_state_up is true it should assert that exception is raised.\n2. when admin_state_up is false it can assert that exception is not raised.","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"c2a392e59d89d4b99a150325398317d1bae2155a","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.l3plugin.set_extra_attr_value(context, router_db, \u0027distributed\u0027,"},{"line_number":83,"context_line":"                                           dist)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _validate_router_migration(self, context, router_db, router_res,"},{"line_number":86,"context_line":"                                   old_router\u003dNone):"},{"line_number":87,"context_line":"        \"\"\"Allow transition only when admin_state_up\u003dFalse\"\"\""},{"line_number":88,"context_line":"        original_distributed_state \u003d router_db.extra_attributes.distributed"},{"line_number":89,"context_line":"        requested_distributed_state \u003d router_res.get(\u0027distributed\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_72821bcb","line":86,"range":{"start_line":85,"start_character":7,"end_line":86,"end_character":52},"in_reply_to":"3f79a3b5_f7080827","updated":"2019-01-07 23:12:02.000000000","message":"I\u0027m working on test cases for both of these, but I think there may be another test case. Each router may have admin_state_up\u003dTrue which should both throw a BadRequest exception. \nI think the following tests will cover the various cases: \n1) if the source router is admin_state_up\u003dTrue, assert BadRequest exception\n2) if the sink router is admin_state_up\u003dTrue, assert BadRequest exception\n3) if *both* routers are admin_state_up\u003dFalse, assert no exception Raised","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"797359bf91a24bfeff77127c07e46db3fa191b21","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.l3plugin.set_extra_attr_value(context, router_db, \u0027distributed\u0027,"},{"line_number":83,"context_line":"                                           dist)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _validate_router_migration(self, context, router_db, router_res,"},{"line_number":86,"context_line":"                                   old_router\u003dNone):"},{"line_number":87,"context_line":"        \"\"\"Allow transition only when admin_state_up\u003dFalse\"\"\""},{"line_number":88,"context_line":"        original_distributed_state \u003d router_db.extra_attributes.distributed"},{"line_number":89,"context_line":"        requested_distributed_state \u003d router_res.get(\u0027distributed\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_bddfc1d4","line":86,"range":{"start_line":85,"start_character":7,"end_line":86,"end_character":52},"in_reply_to":"dfd5e7cf_72821bcb","updated":"2019-01-15 00:10:13.000000000","message":"Done","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ba1c54cb10cf481bec817fd9609721531aaf64c1","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        distributed_changed \u003d ("},{"line_number":92,"context_line":"            requested_distributed_state is not None and"},{"line_number":93,"context_line":"            requested_distributed_state !\u003d original_distributed_state)"},{"line_number":94,"context_line":"        if not distributed_changed:"},{"line_number":95,"context_line":"            return False"},{"line_number":96,"context_line":"        if old_router:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_84ee0bb4","line":93,"updated":"2018-12-18 20:59:46.000000000","message":"So is this check part of the problem you describe?  If the router_db object in this context has been updated already this looks like it could trigger a False return, leaving things around.","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"c2a392e59d89d4b99a150325398317d1bae2155a","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        distributed_changed \u003d ("},{"line_number":92,"context_line":"            requested_distributed_state is not None and"},{"line_number":93,"context_line":"            requested_distributed_state !\u003d original_distributed_state)"},{"line_number":94,"context_line":"        if not distributed_changed:"},{"line_number":95,"context_line":"            return False"},{"line_number":96,"context_line":"        if old_router:"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_d2f4275e","line":93,"in_reply_to":"3f79a3b5_84ee0bb4","updated":"2019-01-07 23:12:02.000000000","message":"I think you\u0027re right. The problem seems to be in this check or in the conditional that follows. We should be verifying that admin_state_up\u003dFalse for *both* routers in this scenario so I\u0027m thinking I should revise the conditional to verify both routers\u0027 admin_state_up\u003dFalse, else, throw the BadRequest exception.\nAlso, I\u0027m working on filing a bug to enable backports.","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"797359bf91a24bfeff77127c07e46db3fa191b21","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        distributed_changed \u003d ("},{"line_number":92,"context_line":"            requested_distributed_state is not None and"},{"line_number":93,"context_line":"            requested_distributed_state !\u003d original_distributed_state)"},{"line_number":94,"context_line":"        if not distributed_changed:"},{"line_number":95,"context_line":"            return False"},{"line_number":96,"context_line":"        if old_router:"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_5df01568","line":93,"in_reply_to":"dfd5e7cf_d2f4275e","updated":"2019-01-15 00:10:13.000000000","message":"Done","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b3637c18d108c44c3213460f325123b910ba2445","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            admin_state_up \u003d old_router.get(\u0027admin_state_up\u0027)"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            admin_state_up \u003d router_db.admin_state_up"},{"line_number":100,"context_line":"        if admin_state_up:"},{"line_number":101,"context_line":"            msg \u003d _(\"Cannot change the \u0027distributed\u0027 attribute of active \""},{"line_number":102,"context_line":"                    \"routers. Please set router admin_state_up to False \""},{"line_number":103,"context_line":"                    \"prior to upgrade\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_f2fc6f75","line":100,"updated":"2018-12-18 09:18:25.000000000","message":"so will this patch change API behavior? If so, I think that at least release note should be added to it.\nI\u0027m not sure if shim api extension in this case would be also necessary - probably not but I would like know what others think about it","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"c2a392e59d89d4b99a150325398317d1bae2155a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            admin_state_up \u003d old_router.get(\u0027admin_state_up\u0027)"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            admin_state_up \u003d router_db.admin_state_up"},{"line_number":100,"context_line":"        if admin_state_up:"},{"line_number":101,"context_line":"            msg \u003d _(\"Cannot change the \u0027distributed\u0027 attribute of active \""},{"line_number":102,"context_line":"                    \"routers. Please set router admin_state_up to False \""},{"line_number":103,"context_line":"                    \"prior to upgrade\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_124cefc5","line":100,"in_reply_to":"3f79a3b5_f2fc6f75","updated":"2019-01-07 23:12:02.000000000","message":"I\u0027m not sure if it *will* change API behavior, but I can certainly see how it could. This patch would enforce that both routers in a migration are set to admin_state_up\u003dFalse prior to a change in their distributed state. I\u0027m not yet familiar with the shim api extension, but I will look into it.\nAs I replied to Manjeet, I\u0027m currently working on tests for these conditions.","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"ce23ba46c40521844dcd9b80912ab2b4be0dc5ff","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            admin_state_up \u003d old_router.get(\u0027admin_state_up\u0027)"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            admin_state_up \u003d router_db.admin_state_up"},{"line_number":100,"context_line":"        if admin_state_up:"},{"line_number":101,"context_line":"            msg \u003d _(\"Cannot change the \u0027distributed\u0027 attribute of active \""},{"line_number":102,"context_line":"                    \"routers. Please set router admin_state_up to False \""},{"line_number":103,"context_line":"                    \"prior to upgrade\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_cbabf11a","line":100,"in_reply_to":"3f79a3b5_f2fc6f75","updated":"2019-01-14 23:54:06.000000000","message":"IMO, release note should be enough !","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"87fe69faace0437c10b314676e280c8d4d9a0956","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            admin_state_up \u003d old_router.get(\u0027admin_state_up\u0027)"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            admin_state_up \u003d router_db.admin_state_up"},{"line_number":100,"context_line":"        if admin_state_up:"},{"line_number":101,"context_line":"            msg \u003d _(\"Cannot change the \u0027distributed\u0027 attribute of active \""},{"line_number":102,"context_line":"                    \"routers. Please set router admin_state_up to False \""},{"line_number":103,"context_line":"                    \"prior to upgrade\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfdaf3ff_4b6dc102","line":100,"in_reply_to":"dfd5e7cf_124cefc5","updated":"2019-01-14 23:56:44.000000000","message":"IMO, api behavior is still same plus added one more check, added param is optional and same return, idk how api behavior is affected ? but I\u0027d like to know if I am missing something.","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"85d90417935a280818b9d7981c3c49b4eb50ab9f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        \"\"\"Event handler for router update migration to distributed.\"\"\""},{"line_number":124,"context_line":"        if not self._validate_router_migration("},{"line_number":125,"context_line":"                payload.context, payload.desired_state,"},{"line_number":126,"context_line":"                payload.request_body, payload.states[0]):"},{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        migrating_to_distributed \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_540d3a3d","line":126,"range":{"start_line":126,"start_character":46,"end_line":126,"end_character":55},"updated":"2018-12-15 01:02:44.000000000","message":"so the first item would always be old_router ?","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"c2a392e59d89d4b99a150325398317d1bae2155a","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        \"\"\"Event handler for router update migration to distributed.\"\"\""},{"line_number":124,"context_line":"        if not self._validate_router_migration("},{"line_number":125,"context_line":"                payload.context, payload.desired_state,"},{"line_number":126,"context_line":"                payload.request_body, payload.states[0]):"},{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        migrating_to_distributed \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_72345b4b","line":126,"range":{"start_line":126,"start_character":46,"end_line":126,"end_character":55},"in_reply_to":"3f79a3b5_540d3a3d","updated":"2019-01-07 23:12:02.000000000","message":"That does appear to be the case. I\u0027ve found four instances of \"publishers\" for resources.router + events.PRECOMMIT_UPDATE and all of these pass the old router as payload_states[0].  These include: \nneutron/db/l3_db.py \nneutron/db/extraroute_db.py\nneutron/db/l3_hamode_db.py\nneutron/db/l3_gwmode_db.py","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"797359bf91a24bfeff77127c07e46db3fa191b21","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        \"\"\"Event handler for router update migration to distributed.\"\"\""},{"line_number":124,"context_line":"        if not self._validate_router_migration("},{"line_number":125,"context_line":"                payload.context, payload.desired_state,"},{"line_number":126,"context_line":"                payload.request_body, payload.states[0]):"},{"line_number":127,"context_line":"            return"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        migrating_to_distributed \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_3ded118b","line":126,"range":{"start_line":126,"start_character":46,"end_line":126,"end_character":55},"in_reply_to":"dfd5e7cf_72345b4b","updated":"2019-01-15 00:10:13.000000000","message":"Done","commit_id":"3f7e4cbf1e283e6b9994357f2fd3388aacf9d571"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"ce23ba46c40521844dcd9b80912ab2b4be0dc5ff","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        # if old_router is present, both routers must have"},{"line_number":100,"context_line":"        # admin_state_up\u003dFalse else, raise BadRequest"},{"line_number":101,"context_line":"        if old_router:"},{"line_number":102,"context_line":"            admin_state_up \u003d (old_router.get(\u0027admin_state_up\u0027) or"},{"line_number":103,"context_line":"                              router_db.get(\u0027admin_state_up\u0027))"},{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            admin_state_up \u003d router_db.get(\u0027admin_state_up\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_6ba2054e","line":102,"range":{"start_line":102,"start_character":63,"end_line":102,"end_character":65},"updated":"2019-01-14 23:54:06.000000000","message":"comment #L99 says both routers must have admin state false, so shouldn\u0027t this better be \u0027and\u0027 then ?","commit_id":"b3bf10fc22a43e3deeb996c9d395354920af3b12"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"be973401db5d32c7536561ec80debf045bcb9c0b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        # if old_router is present, both routers must have"},{"line_number":100,"context_line":"        # admin_state_up\u003dFalse else, raise BadRequest"},{"line_number":101,"context_line":"        if old_router:"},{"line_number":102,"context_line":"            admin_state_up \u003d (old_router.get(\u0027admin_state_up\u0027) or"},{"line_number":103,"context_line":"                              router_db.get(\u0027admin_state_up\u0027))"},{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            admin_state_up \u003d router_db.get(\u0027admin_state_up\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_a24d6a73","line":102,"range":{"start_line":102,"start_character":63,"end_line":102,"end_character":65},"in_reply_to":"bfdaf3ff_2e0e4b32","updated":"2019-01-15 04:27:50.000000000","message":"Then the comment should be updated, or it\u0027ll be confusing forever.  :-)","commit_id":"b3bf10fc22a43e3deeb996c9d395354920af3b12"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"797359bf91a24bfeff77127c07e46db3fa191b21","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        # if old_router is present, both routers must have"},{"line_number":100,"context_line":"        # admin_state_up\u003dFalse else, raise BadRequest"},{"line_number":101,"context_line":"        if old_router:"},{"line_number":102,"context_line":"            admin_state_up \u003d (old_router.get(\u0027admin_state_up\u0027) or"},{"line_number":103,"context_line":"                              router_db.get(\u0027admin_state_up\u0027))"},{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            admin_state_up \u003d router_db.get(\u0027admin_state_up\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_2e0e4b32","line":102,"range":{"start_line":102,"start_character":63,"end_line":102,"end_character":65},"in_reply_to":"bfdaf3ff_6ba2054e","updated":"2019-01-15 00:10:13.000000000","message":"That was my initial thought too, but it should definitely be an OR. In this case, we\u0027re checking for *either* router to be admin_state_up\u003dTrue but an AND will produce admin_state_up\u003dFalse when at least one router is down, but we want admin_state_up\u003dFalse only when BOTH routers are down. (here, \u0027down\u0027 is the same as admin_state_up\u003dFalse)","commit_id":"b3bf10fc22a43e3deeb996c9d395354920af3b12"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"104f28484ded8c531bcbdda260aeda25bd8e2160","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        # if old_router is present, both routers must have"},{"line_number":100,"context_line":"        # admin_state_up\u003dFalse else, raise BadRequest"},{"line_number":101,"context_line":"        if old_router:"},{"line_number":102,"context_line":"            admin_state_up \u003d (old_router.get(\u0027admin_state_up\u0027) or"},{"line_number":103,"context_line":"                              router_db.get(\u0027admin_state_up\u0027))"},{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            admin_state_up \u003d router_db.get(\u0027admin_state_up\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_3a76a140","line":102,"range":{"start_line":102,"start_character":63,"end_line":102,"end_character":65},"in_reply_to":"bfdaf3ff_a24d6a73","updated":"2019-02-06 00:21:02.000000000","message":"Done","commit_id":"b3bf10fc22a43e3deeb996c9d395354920af3b12"},{"author":{"_account_id":10980,"name":"Doug Wiegley","email":"dougwig@parkside.io","username":"dougw"},"change_message_id":"be973401db5d32c7536561ec80debf045bcb9c0b","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    @registry.receives(resources.ROUTER, [events.PRECOMMIT_UPDATE],"},{"line_number":126,"context_line":"                       priority_group.PRIORITY_ROUTER_EXTENDED_ATTRIBUTE)"},{"line_number":127,"context_line":"    def _handle_distributed_migration(self, resource, event,"},{"line_number":128,"context_line":"                                      trigger, payload\u003dNone):"},{"line_number":129,"context_line":"        \"\"\"Event handler for router update migration to distributed.\"\"\""},{"line_number":130,"context_line":"        if not self._validate_router_migration("},{"line_number":131,"context_line":"                payload.context, payload.desired_state,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_622222a7","line":128,"range":{"start_line":128,"start_character":47,"end_line":128,"end_character":59},"updated":"2019-01-15 04:27:50.000000000","message":"why is payload defaulted to None when it\u0027s immediately de-refed by the first line? This isn\u0027t an issue with your change, but it\u0027s odd.","commit_id":"b3bf10fc22a43e3deeb996c9d395354920af3b12"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"3752025b32750f57e74dd42244e3cd504405792f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":61,"context_line":"    has been loaded"},{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    return \u0027admin-state-down-before-update\u0027 in (extensions."},{"line_number":64,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5fc1f717_30dc4b45","line":63,"range":{"start_line":63,"start_character":12,"end_line":63,"end_character":42},"updated":"2019-03-22 12:20:05.000000000","message":"Can\u0027t we just use the ALIAS from the extension here??\nIn fact it seems this should actually be admin_state_down_before_update shouldn\u0027t it?","commit_id":"c9b2579ffcf6e506b8c0f9d95e406de729248d7a"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"a42a9d0db630ec8db7410aa0780e6c253c6a7648","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":61,"context_line":"    has been loaded"},{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    return \u0027admin-state-down-before-update\u0027 in (extensions."},{"line_number":64,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5fc1f717_0341be0b","line":63,"range":{"start_line":63,"start_character":12,"end_line":63,"end_character":42},"in_reply_to":"5fc1f717_30dc4b45","updated":"2019-03-22 20:42:55.000000000","message":"Switched over to using the ALIAS as suggested. The ALIAS value was mistakenly modified to underscore-separated text, but has now reverted to hyphen-separated to conform to similar extension ALIASes. I found 3 other \"is-this-extension-loaded\" checks in neutron/api/api_common.py that only use the ALIAS string value in those checks, but using the ALIAS value seems more robust.","commit_id":"c9b2579ffcf6e506b8c0f9d95e406de729248d7a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e8ed36685f8257e53c350ce7ca77cd48094c999a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":14,"id":"5fc1f717_a8c9d45a","line":65,"range":{"start_line":64,"start_character":4,"end_line":65,"end_character":66},"updated":"2019-04-02 15:49:28.000000000","message":"You have added the extension to the plugin:\nhttps://review.openstack.org/#/c/625134/14/neutron/services/l3_router/l3_router_plugin.py@106\n\nWhy not use the is_extension_supported for this? Here are some examples:\nhttps://github.com/openstack/neutron/blob/master/neutron/db/l3_db.py#L108-L124","commit_id":"dd47be1714109e3eb3e1a1e2579842077234481b"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"67bc80393074aa9733882f311d8c51ccb57c977e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":14,"id":"5fc1f717_2a57aa5c","line":65,"range":{"start_line":64,"start_character":4,"end_line":65,"end_character":66},"in_reply_to":"5fc1f717_2a47af1f","updated":"2019-04-09 17:29:00.000000000","message":"You and Slawek Kaplonski both seem to be asking for the same thing. I finally understand and I will implement this as a @property as you describe here.","commit_id":"dd47be1714109e3eb3e1a1e2579842077234481b"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"2d8bb63ce383b005c6c69915637822ad5c06c7f0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":14,"id":"5fc1f717_f202676f","line":65,"range":{"start_line":64,"start_character":4,"end_line":65,"end_character":66},"in_reply_to":"5fc1f717_a8c9d45a","updated":"2019-04-02 20:40:56.000000000","message":"I defined a new method, ``is_admin_state_down_necessary``, in neutron/db/l3_dvr_db.py and this method is currently only used within that module. Although I like the \"is_extension_supported\" mechanism, is there an advantage of defining it neutron/l3_db.py instead of how I\u0027ve already implemented that check?","commit_id":"dd47be1714109e3eb3e1a1e2579842077234481b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"bf73fc7221bebc07e8f1233674b1ea96958d58ed","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":14,"id":"5fc1f717_2a47af1f","line":65,"range":{"start_line":64,"start_character":4,"end_line":65,"end_character":66},"in_reply_to":"5fc1f717_f202676f","updated":"2019-04-08 15:32:49.000000000","message":"You can add following code to the DVRResourceOperationHandler class directly, then you will save this method/check here. And everywhere call the current method can be replaced with \"self._is_admin_state_down_necessary\".\n\n    @property\n    def _is_admin_state_down_necessary(self):\n        if self._admin_state_necessary is None:\n            self._admin_state_necessary \u003d extensions.is_extension_supported(\n                self.l3plugin,\n                _admin_state_down_before_update_lib.ALIAS)\n        return self._admin_state_necessary\n\nNo specific advantages, maybe it is you can save a new method defination, and save the check everytime by using \u0027property\u0027. And in the \u0027db\u0027 folders, all plugins just use the \u0027is_extension_supported\u0027 to check if the extension is enabled.","commit_id":"dd47be1714109e3eb3e1a1e2579842077234481b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e8ed36685f8257e53c350ce7ca77cd48094c999a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        if not distributed_changed:"},{"line_number":111,"context_line":"            return False"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # to preserve old API behavior, only check old_router if shim API"},{"line_number":114,"context_line":"        # extension has been loaded"},{"line_number":115,"context_line":"        if admin_state_down_extension_loaded and old_router:"},{"line_number":116,"context_line":"            # logically OR the admin states of old and new router because,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5fc1f717_08ea68ab","line":113,"range":{"start_line":113,"start_character":22,"end_line":113,"end_character":38},"updated":"2019-04-02 15:49:28.000000000","message":"So this patch will have a API behavior change? Please add a release note for this.","commit_id":"dd47be1714109e3eb3e1a1e2579842077234481b"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"28aa1f17843e8b852a91e5ab99bfa836582a154b","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        if not distributed_changed:"},{"line_number":111,"context_line":"            return False"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # to preserve old API behavior, only check old_router if shim API"},{"line_number":114,"context_line":"        # extension has been loaded"},{"line_number":115,"context_line":"        if admin_state_down_extension_loaded and old_router:"},{"line_number":116,"context_line":"            # logically OR the admin states of old and new router because,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5fc1f717_2d172ea6","line":113,"range":{"start_line":113,"start_character":22,"end_line":113,"end_character":38},"in_reply_to":"5fc1f717_08ea68ab","updated":"2019-04-02 21:19:48.000000000","message":"Done","commit_id":"dd47be1714109e3eb3e1a1e2579842077234481b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"43b2b968a3334549a644db5fe940455e3f1458ed","unresolved":false,"context_lines":[{"line_number":57,"context_line":"l3_dvr_db.register_db_l3_dvr_opts()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def is_admin_state_down_necessary():"},{"line_number":61,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_aa0abf86","line":60,"range":{"start_line":60,"start_character":4,"end_line":60,"end_character":33},"updated":"2019-04-08 15:34:12.000000000","message":"I\u0027ll not block this, since this works. But I still think using \u0027is_extension_supported\u0027 is a more consistent way.","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"67bc80393074aa9733882f311d8c51ccb57c977e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"l3_dvr_db.register_db_l3_dvr_opts()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def is_admin_state_down_necessary():"},{"line_number":61,"context_line":"    \"\"\"Check if the shim extension, admin-state-down-before-update"},{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_4ab6b6fb","line":60,"range":{"start_line":60,"start_character":4,"end_line":60,"end_character":33},"in_reply_to":"5fc1f717_aa0abf86","updated":"2019-04-09 17:29:00.000000000","message":"You and Slawek Kaplonski both seem to be asking for the same thing.  I finally understand your point and I will implement this as a @property as you suggested in your earlier comment","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e5008816c15adc17920d10c5fa628c1fe7066077","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_d4d01ffa","line":65,"updated":"2019-04-08 07:28:33.000000000","message":"I know that this is nit and shouldn\u0027t have big impact on performance but You can cache result of this check in memory and reuse it later every time it is needed.","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"b3f0c7ce788a9c186782a43da5522dd289d546c3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":18,"id":"ffb9cba7_1daa6770","line":65,"in_reply_to":"5fc1f717_d4d01ffa","updated":"2019-04-26 23:01:56.000000000","message":"Can you suggest a mechanism for caching this?  I\u0027ve tried to move the method into the DVRResourceOperationHandler class, but this causes \"attribute doesn\u0027t exist\" failures in many of the test classes. Alternatively, can you suggest the correct mechanism for mocking it in test classes (patch set 21 didn\u0027t seem to fix the test fdailures).  I\u0027m a bit stuck TBH.","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"67bc80393074aa9733882f311d8c51ccb57c977e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_2ab1ea01","line":65,"in_reply_to":"5fc1f717_d4d01ffa","updated":"2019-04-09 17:29:00.000000000","message":"You and Liu Yulong both seem to be asking for the same thing.  I will implement this as a @property as he suggested in an earlier comment","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8eedf995bead54986d9af2b61d54762ddd8755ce","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    has been loaded"},{"line_number":63,"context_line":"    \"\"\""},{"line_number":64,"context_line":"    return _admin_state_down_before_update_lib.ALIAS in (extensions."},{"line_number":65,"context_line":"            PluginAwareExtensionManager.get_instance().extensions)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"@registry.has_registry_receivers"}],"source_content_type":"text/x-python","patch_set":18,"id":"ffb9cba7_e9d47122","line":65,"in_reply_to":"ffb9cba7_1daa6770","updated":"2019-04-27 07:33:05.000000000","message":"I was thinking about something simply like:\n\n    _IS_ADMIN_STATE_DOWN_NECESSARY \u003d None\n    def _is_admin_stat_down_necessary:\n        global  _IS_ADMIN_STATE_DOWN_NECESSARY\n        if  _IS_ADMIN_STATE_DOWN_NECESSARY is None:\n             _IS_ADMIN_STATE_DOWN_NECESSARY \u003d _admin_state_down_before_update_lib.ALIAS in (extensions.PluginAwareExtensionManager.get_instance().extensions)\n        return _IS_ADMIN_STATE_DOWN_NECESSARY\n\nThan in fact this check of extensions will be done only once after run neutron-server.","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e5008816c15adc17920d10c5fa628c1fe7066077","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        admin_state_down_extension_loaded \u003d is_admin_state_down_necessary()"},{"line_number":99,"context_line":"        # to preserve extant API behavior, only check old_router when the"},{"line_number":100,"context_line":"        # \"admin-state-down-before-update\" shim API extension is loaded"},{"line_number":101,"context_line":"        if admin_state_down_extension_loaded and old_router:"},{"line_number":102,"context_line":"            original_distributed_state \u003d old_router.get(\u0027distributed\u0027)"},{"line_number":103,"context_line":"        else:"},{"line_number":104,"context_line":"            original_distributed_state \u003d router_db.extra_attributes.distributed"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_740b6b8d","line":101,"range":{"start_line":101,"start_character":11,"end_line":101,"end_character":44},"updated":"2019-04-08 07:28:33.000000000","message":"\"old_router\" can be first, then if it\u0027s none, You will not check this as it\u0027s not necessary","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"67bc80393074aa9733882f311d8c51ccb57c977e","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        admin_state_down_extension_loaded \u003d is_admin_state_down_necessary()"},{"line_number":99,"context_line":"        # to preserve extant API behavior, only check old_router when the"},{"line_number":100,"context_line":"        # \"admin-state-down-before-update\" shim API extension is loaded"},{"line_number":101,"context_line":"        if admin_state_down_extension_loaded and old_router:"},{"line_number":102,"context_line":"            original_distributed_state \u003d old_router.get(\u0027distributed\u0027)"},{"line_number":103,"context_line":"        else:"},{"line_number":104,"context_line":"            original_distributed_state \u003d router_db.extra_attributes.distributed"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_5e3bd8e8","line":101,"range":{"start_line":101,"start_character":11,"end_line":101,"end_character":44},"in_reply_to":"5fc1f717_740b6b8d","updated":"2019-04-09 17:29:00.000000000","message":"Done","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":29071,"name":"norman shen","email":"yshxxsjt715@gmail.com","username":"ushen"},"change_message_id":"f74c4dea2b745061fd85ca872db1d4d46c9cb898","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # to preserve old API behavior, only check old_router if shim API"},{"line_number":117,"context_line":"        # extension has been loaded"},{"line_number":118,"context_line":"        if admin_state_down_extension_loaded and old_router:"},{"line_number":119,"context_line":"            # logically OR the admin states of old and new router because,"},{"line_number":120,"context_line":"            # if one OR both routers is still up, the *collective*"},{"line_number":121,"context_line":"            # \"admin_state_up\" should be True and we should throw the"},{"line_number":122,"context_line":"            # BadRequest exception below."}],"source_content_type":"text/x-python","patch_set":22,"id":"9fb8cfa7_e428c133","line":119,"range":{"start_line":119,"start_character":24,"end_line":119,"end_character":26},"updated":"2019-06-29 06:40:15.000000000","message":"sorry for my bad English, but without context, i find this sentence hard to understand... maybe just keep the next half is good enough....","commit_id":"bf63abe74833626b1bb55cafb2c318dc832efe63"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"b4fcdf6f72e0bfe7d22a39c1077f1aee462a01ca","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # to preserve old API behavior, only check old_router if shim API"},{"line_number":117,"context_line":"        # extension has been loaded"},{"line_number":118,"context_line":"        if admin_state_down_extension_loaded and old_router:"},{"line_number":119,"context_line":"            # logically OR the admin states of old and new router because,"},{"line_number":120,"context_line":"            # if one OR both routers is still up, the *collective*"},{"line_number":121,"context_line":"            # \"admin_state_up\" should be True and we should throw the"},{"line_number":122,"context_line":"            # BadRequest exception below."}],"source_content_type":"text/x-python","patch_set":22,"id":"9fb8cfa7_3306f31e","line":119,"range":{"start_line":119,"start_character":24,"end_line":119,"end_character":26},"in_reply_to":"9fb8cfa7_e428c133","updated":"2019-07-02 22:17:33.000000000","message":"Done","commit_id":"bf63abe74833626b1bb55cafb2c318dc832efe63"}],"neutron/extensions/_admin_state_down_before_update_lib.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"3752025b32750f57e74dd42244e3cd504405792f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"},{"line_number":25,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {}"},{"line_number":26,"context_line":"ACTION_MAP \u003d {}"},{"line_number":27,"context_line":"REQUIRED_EXTENSIONS \u003d []"},{"line_number":28,"context_line":"OPTIONAL_EXTENSIONS \u003d []"},{"line_number":29,"context_line":"ACTION_STATUS \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"5fc1f717_f07c8321","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":19},"updated":"2019-03-22 12:20:05.000000000","message":"Shouldn\u0027t it depend on l3 since it needs routers?","commit_id":"c9b2579ffcf6e506b8c0f9d95e406de729248d7a"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"a42a9d0db630ec8db7410aa0780e6c253c6a7648","unresolved":false,"context_lines":[{"line_number":24,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"},{"line_number":25,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {}"},{"line_number":26,"context_line":"ACTION_MAP \u003d {}"},{"line_number":27,"context_line":"REQUIRED_EXTENSIONS \u003d []"},{"line_number":28,"context_line":"OPTIONAL_EXTENSIONS \u003d []"},{"line_number":29,"context_line":"ACTION_STATUS \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"5fc1f717_15bed364","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":19},"in_reply_to":"5fc1f717_f07c8321","updated":"2019-03-22 20:42:55.000000000","message":"Done","commit_id":"c9b2579ffcf6e506b8c0f9d95e406de729248d7a"},{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":15,"id":"5fc1f717_8835efaa","line":1,"updated":"2019-04-02 23:28:27.000000000","message":"I understand this underscore-prefixed file is supposed to get moved to neutron-lib, but I don\u0027t see the need to have this additional file lying around when the actual extension file is virtually empty.","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a86f2285b8dce5147a364c3ecdaf73b7bfaf66a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"5fc1f717_5900d266","updated":"2019-04-08 22:17:03.000000000","message":"I think that slaweq\u0027s comments in this file merit to be fixed. While you are at it, consider fixing the comments here: https://review.openstack.org/#/c/625134/18/neutron/db/l3_dvr_db.py","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e5008816c15adc17920d10c5fa628c1fe7066077","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"from neutron_lib.api.definitions import l3 as l3_apidef"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ALIAS \u003d \u0027admin-state-down-before-update\u0027"},{"line_number":20,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":21,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":22,"context_line":"NAME \u003d \u0027Enforce Admin State Down Before Update Extension\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_f4243b0f","line":19,"range":{"start_line":19,"start_character":9,"end_line":19,"end_character":39},"updated":"2019-04-08 07:28:33.000000000","message":"IMHO You should put in extension alias that it\u0027s for routers","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"67bc80393074aa9733882f311d8c51ccb57c977e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"from neutron_lib.api.definitions import l3 as l3_apidef"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"ALIAS \u003d \u0027admin-state-down-before-update\u0027"},{"line_number":20,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":21,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":22,"context_line":"NAME \u003d \u0027Enforce Admin State Down Before Update Extension\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_193d6aba","line":19,"range":{"start_line":19,"start_character":9,"end_line":19,"end_character":39},"in_reply_to":"5fc1f717_f4243b0f","updated":"2019-04-09 17:29:00.000000000","message":"Done","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e5008816c15adc17920d10c5fa628c1fe7066077","unresolved":false,"context_lines":[{"line_number":19,"context_line":"ALIAS \u003d \u0027admin-state-down-before-update\u0027"},{"line_number":20,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":21,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":22,"context_line":"NAME \u003d \u0027Enforce Admin State Down Before Update Extension\u0027"},{"line_number":23,"context_line":"DESCRIPTION \u003d \u0027Ensure router admin_state_up\u003dFalse before updating distributed\u0027"},{"line_number":24,"context_line":"UPDATED_TIMESTAMP \u003d \u00272019-01-18:11:18\u0027"},{"line_number":25,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_74192bd5","line":22,"range":{"start_line":22,"start_character":16,"end_line":22,"end_character":21},"updated":"2019-04-08 07:28:33.000000000","message":"IMHO should be here \"router\u0027s admin\"","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"67bc80393074aa9733882f311d8c51ccb57c977e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"ALIAS \u003d \u0027admin-state-down-before-update\u0027"},{"line_number":20,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":21,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":22,"context_line":"NAME \u003d \u0027Enforce Admin State Down Before Update Extension\u0027"},{"line_number":23,"context_line":"DESCRIPTION \u003d \u0027Ensure router admin_state_up\u003dFalse before updating distributed\u0027"},{"line_number":24,"context_line":"UPDATED_TIMESTAMP \u003d \u00272019-01-18:11:18\u0027"},{"line_number":25,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_997aba85","line":22,"range":{"start_line":22,"start_character":16,"end_line":22,"end_character":21},"in_reply_to":"5fc1f717_74192bd5","updated":"2019-04-09 17:29:00.000000000","message":"Done","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e5008816c15adc17920d10c5fa628c1fe7066077","unresolved":false,"context_lines":[{"line_number":20,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":21,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":22,"context_line":"NAME \u003d \u0027Enforce Admin State Down Before Update Extension\u0027"},{"line_number":23,"context_line":"DESCRIPTION \u003d \u0027Ensure router admin_state_up\u003dFalse before updating distributed\u0027"},{"line_number":24,"context_line":"UPDATED_TIMESTAMP \u003d \u00272019-01-18:11:18\u0027"},{"line_number":25,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"},{"line_number":26,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_34364353","line":23,"updated":"2019-04-08 07:28:33.000000000","message":"this description is different than in https://review.openstack.org/#/c/634509/5/neutron_lib/api/definitions/admin_state_down_before_update.py - why?","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"67bc80393074aa9733882f311d8c51ccb57c977e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":21,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":22,"context_line":"NAME \u003d \u0027Enforce Admin State Down Before Update Extension\u0027"},{"line_number":23,"context_line":"DESCRIPTION \u003d \u0027Ensure router admin_state_up\u003dFalse before updating distributed\u0027"},{"line_number":24,"context_line":"UPDATED_TIMESTAMP \u003d \u00272019-01-18:11:18\u0027"},{"line_number":25,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"},{"line_number":26,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fc1f717_5970d2a4","line":23,"in_reply_to":"5fc1f717_34364353","updated":"2019-04-09 17:29:00.000000000","message":"Done","commit_id":"21dd2d2eeec15381ace971a19b01b87e841152f1"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f568a3db3c7ea41161aaa23fcba0a51e245caab8","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                    \"empty-string-filtering\","},{"line_number":173,"context_line":"                                    \"filter-validation\","},{"line_number":174,"context_line":"                                    \"port-mac-address-regenerate\","},{"line_number":175,"context_line":"                                    \"admin-state-down-before-update\","},{"line_number":176,"context_line":"                                    \"binding-extended\"]"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    # List of agent types for which all binding_failed ports should try to be"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_d64e32c0","line":175,"updated":"2019-02-07 14:08:41.000000000","message":"IMO this should be added to extensions supported by L3 service plugin instead of ML2 plugin.","commit_id":"76f78a38f5397ae089665b9649c3b3e2e9262b72"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"bc4933814dadddf4fade7c727ec13c59d3910e77","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                    \"empty-string-filtering\","},{"line_number":173,"context_line":"                                    \"filter-validation\","},{"line_number":174,"context_line":"                                    \"port-mac-address-regenerate\","},{"line_number":175,"context_line":"                                    \"admin-state-down-before-update\","},{"line_number":176,"context_line":"                                    \"binding-extended\"]"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    # List of agent types for which all binding_failed ports should try to be"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_e788c671","line":175,"in_reply_to":"9fdfeff1_d64e32c0","updated":"2019-02-15 19:59:13.000000000","message":"Done","commit_id":"76f78a38f5397ae089665b9649c3b3e2e9262b72"},{"author":{"_account_id":24797,"name":"Matt Welch","email":"matt.welch@intel.com","username":"mattw4"},"change_message_id":"a7f671e15fed00f90221d53c90573497b38ee2a1","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                                    \"empty-string-filtering\","},{"line_number":173,"context_line":"                                    \"filter-validation\","},{"line_number":174,"context_line":"                                    \"port-mac-address-regenerate\","},{"line_number":175,"context_line":"                                    \"admin-state-down-before-update\","},{"line_number":176,"context_line":"                                    \"binding-extended\"]"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    # List of agent types for which all binding_failed ports should try to be"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fdfeff1_0c732fb3","line":175,"in_reply_to":"9fdfeff1_d64e32c0","updated":"2019-02-08 21:49:49.000000000","message":"I agree. Is the correct location for the list of extensions supported by L3 plugin the variable \u0027__ALL_API_DEFINITIONS\u0027 in neutron-lib/api/definitions/__init__.py ?","commit_id":"76f78a38f5397ae089665b9649c3b3e2e9262b72"}],"neutron/tests/unit/db/test_l3_dvr_db.py":[{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @mock.patch(\u0027neutron.db.l3_dvr_db.is_admin_state_down_necessary\u0027,"},{"line_number":87,"context_line":"                return_value\u003dTrue)"},{"line_number":88,"context_line":"    def test__validate_router_migration_on_router_update(self,"},{"line_number":89,"context_line":"                                                         mock_arg):"},{"line_number":90,"context_line":"        router \u003d {"},{"line_number":91,"context_line":"            \u0027name\u0027: \u0027foo_router\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"5fc1f717_8803afbe","line":88,"updated":"2019-04-02 23:28:27.000000000","message":"I know it\u0027s neutral, but still you\u0027re still changing an existing test a bit. I\u0027d recommend duplicating the test (one for each mock return). You can have a private method with all of the reusable code and just duplicate the public one where you\u0027ll add the mock lines.","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"},{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            self.ctx, router_db, {\u0027name\u0027: \u0027foo_router_2\u0027}))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @mock.patch(\u0027neutron.db.l3_dvr_db.is_admin_state_down_necessary\u0027,"},{"line_number":100,"context_line":"                return_value\u003dTrue)"},{"line_number":101,"context_line":"    def test__validate_router_migration_raise_error(self, mock_arg):"},{"line_number":102,"context_line":"        router \u003d {"},{"line_number":103,"context_line":"            \u0027name\u0027: \u0027foo_router\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"5fc1f717_480dc7e6","line":100,"updated":"2019-04-02 23:28:27.000000000","message":"ditto.. and many others below.","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"},{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        router_db \u003d self._create_router(new_router)"},{"line_number":127,"context_line":"        self.assertRaises(exceptions.BadRequest,"},{"line_number":128,"context_line":"                          self.mixin._validate_router_migration,"},{"line_number":129,"context_line":"                          self.ctx, router_db, {\u0027distributed\u0027: False},"},{"line_number":130,"context_line":"                          old_router)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    @mock.patch(\u0027neutron.db.l3_dvr_db.is_admin_state_down_necessary\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"5fc1f717_e814b3eb","line":129,"range":{"start_line":129,"start_character":47,"end_line":129,"end_character":69},"updated":"2019-04-02 23:28:27.000000000","message":"A bit confused by this test. new_router is supposed to be the update to the old_router right?","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"},{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    @mock.patch(\u0027neutron.db.l3_dvr_db.is_admin_state_down_necessary\u0027,"},{"line_number":133,"context_line":"                return_value\u003dTrue)"},{"line_number":134,"context_line":"    def test_upgrade_inactive_router_to_distributed_validation_success(self,"},{"line_number":135,"context_line":"                                                                     mock_arg):"},{"line_number":136,"context_line":"        router \u003d {\u0027name\u0027: \u0027foo_router\u0027, \u0027admin_state_up\u0027: False,"},{"line_number":137,"context_line":"                 \u0027distributed\u0027: False}"},{"line_number":138,"context_line":"        router_db \u003d self._create_router(router)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5fc1f717_a8d46b20","line":135,"range":{"start_line":135,"start_character":68,"end_line":135,"end_character":69},"updated":"2019-04-02 23:28:27.000000000","message":"space","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"},{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        router_db \u003d self._create_router(router)"},{"line_number":139,"context_line":"        update \u003d {\u0027distributed\u0027: True}"},{"line_number":140,"context_line":"        self.assertTrue(self.mixin._validate_router_migration("},{"line_number":141,"context_line":"            self.ctx, router_db, update))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    @mock.patch(\u0027neutron.db.l3_dvr_db.is_admin_state_down_necessary\u0027,"},{"line_number":144,"context_line":"                return_value\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5fc1f717_c8ee97ec","line":141,"updated":"2019-04-02 23:28:27.000000000","message":"Would like to see more consistency in how the tests look like, e.g router vs old_router, update vs new_router, the role of router_db, what\u0027s passed to the asserts, etc.","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"},{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"55813394da2d81b56329d0334fc1977c4bcff027","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    @mock.patch(\u0027neutron.db.l3_dvr_db.is_admin_state_down_necessary\u0027,"},{"line_number":156,"context_line":"                return_value\u003dTrue)"},{"line_number":157,"context_line":"    def test_downgrade_active_router_to_centralized_validation_failure(self,"},{"line_number":158,"context_line":"                                                                    mock_arg):"},{"line_number":159,"context_line":"        router \u003d {\u0027name\u0027: \u0027foo_router\u0027, \u0027admin_state_up\u0027: True,"},{"line_number":160,"context_line":"                \u0027distributed\u0027: True}"},{"line_number":161,"context_line":"        router_db \u003d self._create_router(router)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5fc1f717_68de833f","line":158,"range":{"start_line":158,"start_character":67,"end_line":158,"end_character":68},"updated":"2019-04-02 23:28:27.000000000","message":"space","commit_id":"8456bc515ab1d60557167ac4df6fb5ef80e2b87b"},{"author":{"_account_id":30156,"name":"Igor D.C.","email":"igor.duarte.cardoso@intel.com","username":"igordc"},"change_message_id":"63a76c0662f689c3a12ec191c60d16027d86cd32","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @mock.patch(\u0027neutron.db.l3_dvr_db.is_admin_state_down_necessary\u0027,"},{"line_number":120,"context_line":"                return_value\u003dTrue)"},{"line_number":121,"context_line":"    def test__validate_router_migration_raise_error_mocked(self, mock_arg):"},{"line_number":122,"context_line":"        # call test with admin_state_down_before_update ENABLED"},{"line_number":123,"context_line":"        self._test__validate_router_migration_raise_error()"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5fc1f717_1a06d387","line":121,"range":{"start_line":121,"start_character":56,"end_line":121,"end_character":58},"updated":"2019-04-07 20:46:06.000000000","message":"Just providing edit to reduce line length here and hope for Zuul +1 by Monday.","commit_id":"06d5429c0ed4491cbc27afa7c22481e76c5a6685"}]}
