)]}'
{"neutron/db/l3_dvr_db.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"80f19ebf0d2abb8660091e6edac6f4f400613bf5","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                    # snat interface ports that are to be consumed by"},{"line_number":141,"context_line":"                    # the Service Node."},{"line_number":142,"context_line":"                    # TODO(haleyb): move this out of transaction"},{"line_number":143,"context_line":"                    setattr(context, \u0027GUARD_TRANSACTION\u0027, False)"},{"line_number":144,"context_line":"                    if not self._create_snat_intf_ports_if_not_exists("},{"line_number":145,"context_line":"                        context.elevated(), router_db):"},{"line_number":146,"context_line":"                        LOG.debug(\"SNAT interface ports not created: %s\","}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_982b3feb","line":143,"updated":"2016-09-14 22:00:05.000000000","message":"The proper fix would be to get these SNAT port creations out of the create_router transaction, but experience has shown that that is very difficult to get right with respect to concurrency. Considering the upcoming release and the severity of the bug I think this patch is the correct approach for now. It does reveal a second bug in case you\u0027re using a 3rd party ML2 mech driver in conjunction with DVR, as the post_commit notification for the create_port will be sent before the transaction is committed. However, I don\u0027t know of many deployments with both DVR and a 3rd party mech driver.","commit_id":"a137a5f08259ed3f26dbf0e8dc5c5abd5e0194b4"}],"neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"708c6d19f094b622f920d169916bbb1c40ebe141","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                self.l3_plugin._update_router_gw_info("},{"line_number":52,"context_line":"                    self.context, router[\u0027id\u0027],"},{"line_number":53,"context_line":"                    {\u0027network_id\u0027: ext_net[\u0027network\u0027][\u0027id\u0027]})"},{"line_number":54,"context_line":"                self.assertEqual("},{"line_number":55,"context_line":"                    1, len(self.l3_plugin._get_snat_sync_interfaces("},{"line_number":56,"context_line":"                        self.context, [router[\u0027id\u0027]])))"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_8da69f51","line":54,"updated":"2016-09-14 21:41:11.000000000","message":"This will fail as the router is not distributed at this point. You can just remove the assertion.","commit_id":"d9c89fa919ab145f4183a80687da0d89077fb1f3"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"b6c0a0af7b899f08b5d69137d4b2725d1a29c63d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                router \u003d self.l3_plugin.get_router(self.context, router[\u0027id\u0027])"},{"line_number":68,"context_line":"                self.assertTrue(router[\u0027distributed\u0027])"},{"line_number":69,"context_line":"                self.assertEqual("},{"line_number":70,"context_line":"                    2, len(self.l3_plugin._get_snat_sync_interfaces("},{"line_number":71,"context_line":"                        self.context, [router[\u0027id\u0027]])))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def test_get_device_owner_distributed_router_object(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_8d021f0a","line":70,"updated":"2016-09-14 21:44:13.000000000","message":"2 -\u003e 1","commit_id":"d9c89fa919ab145f4183a80687da0d89077fb1f3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0a95571bda8bdfcdc3a29397dcc6856bec7fb936","unresolved":false,"context_lines":[{"line_number":27,"context_line":"DEVICE_OWNER_COMPUTE \u003d constants.DEVICE_OWNER_COMPUTE_PREFIX + \u0027fake\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class L3DvrTestCase(ml2_test_base.ML2TestFramework):"},{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(L3DvrTestCase, self).setUp()"},{"line_number":33,"context_line":"        self.l3_agent \u003d helpers.register_l3_agent("}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_e1d3a75d","line":30,"updated":"2016-09-15 01:11:45.000000000","message":"The HA test is a sub-class of this, so the new test needs to move out of this class.","commit_id":"a137a5f08259ed3f26dbf0e8dc5c5abd5e0194b4"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"80f19ebf0d2abb8660091e6edac6f4f400613bf5","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        return (super(L3DvrTestCase, self)."},{"line_number":38,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_update_router_db_centralized_to_distributed_with_ports(self):"},{"line_number":41,"context_line":"        with self.subnet() as subnet1:"},{"line_number":42,"context_line":"            kwargs \u003d {\u0027arg_list\u0027: (external_net.EXTERNAL,),"},{"line_number":43,"context_line":"                      external_net.EXTERNAL: True}"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_383b0b3a","line":40,"updated":"2016-09-14 22:00:05.000000000","message":"Good stuff :)","commit_id":"a137a5f08259ed3f26dbf0e8dc5c5abd5e0194b4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8854a9b02731f06e90b4e708af65d9b5f4327b7c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        return (super(L3DvrTestCase, self)."},{"line_number":38,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_update_router_db_centralized_to_distributed_with_ports(self):"},{"line_number":41,"context_line":"        with self.subnet() as subnet1:"},{"line_number":42,"context_line":"            kwargs \u003d {\u0027arg_list\u0027: (external_net.EXTERNAL,),"},{"line_number":43,"context_line":"                      external_net.EXTERNAL: True}"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_98317f0e","line":40,"in_reply_to":"7a8ec9b2_383b0b3a","updated":"2016-09-14 22:10:54.000000000","message":"I would have kept the first test.","commit_id":"a137a5f08259ed3f26dbf0e8dc5c5abd5e0194b4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"00de10b843c35f00544993bff745288492e8e470","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        return (super(L3DvrTestCase, self)."},{"line_number":38,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_update_router_db_centralized_to_distributed_with_ports(self):"},{"line_number":41,"context_line":"        with self.subnet() as subnet1:"},{"line_number":42,"context_line":"            kwargs \u003d {\u0027arg_list\u0027: (external_net.EXTERNAL,),"},{"line_number":43,"context_line":"                      external_net.EXTERNAL: True}"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_d320489e","line":40,"in_reply_to":"7a8ec9b2_98317f0e","updated":"2016-09-14 22:13:54.000000000","message":"I knew it!  If it crashes and burns and needs an update I can put it back.","commit_id":"a137a5f08259ed3f26dbf0e8dc5c5abd5e0194b4"}]}
