)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e8d6e17100f45777518c1a1d4d34f7a462c7f964","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I8ca52caf661daa2975cf53212d008eb953d83cc0"},{"line_number":19,"context_line":"Closes-Bug: #1585738"},{"line_number":20,"context_line":"Co-Authored-By: Hong Hui Xiao \u003cxiaohhui@cn.ibm.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7aa08908_b3bc29dd","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":51},"updated":"2016-06-07 21:40:22.000000000","message":"You\u0027ve done all the work here now.  You might as well be the author.","commit_id":"f20efda689d76fc1d1227627a7f378ba74d853f9"}],"neutron/db/ipam_backend_mixin.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"6d672ca9d461f0d983d3b11277bfdb1c45f43e49","unresolved":false,"context_lines":[{"line_number":631,"context_line":"        port_copy \u003d copy.deepcopy(old_port)"},{"line_number":632,"context_line":"        port_copy[\u0027fixed_ips\u0027] \u003d const.ATTR_NOT_SPECIFIED"},{"line_number":633,"context_line":"        port_copy.update(new_port)"},{"line_number":634,"context_line":"        context.session.expire(old_port_db, [\u0027fixed_ips\u0027])"},{"line_number":635,"context_line":"        ips \u003d self.allocate_ips_for_port_and_store("},{"line_number":636,"context_line":"            context, {\u0027port\u0027: port_copy}, port_copy[\u0027id\u0027])"},{"line_number":637,"context_line":"        return self.Changes(add\u003dips, original\u003d[], remove\u003d[])"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_a7333f13","line":634,"updated":"2016-06-07 23:58:00.000000000","message":"This was one more path that could invalidate fixed_ips on the db_port object that was added by the deferred IP allocation patch.","commit_id":"9d39e0ff81b01389bfc2762bdfd8bbcd0a1bc1d6"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"0d08f1e7f69f0b05010ee0111683643b5fc43e19","unresolved":false,"context_lines":[{"line_number":1246,"context_line":""},{"line_number":1247,"context_line":"        original_port \u003d self.get_port(context, id)"},{"line_number":1248,"context_line":"        updated_port \u003d super(Ml2Plugin, self).update_port(context, id,"},{"line_number":1249,"context_line":"                                                          port)"},{"line_number":1250,"context_line":"        with db_api.exc_to_retry(os_db_exception.DBDuplicateEntry),\\"},{"line_number":1251,"context_line":"                session.begin(subtransactions\u003dTrue):"},{"line_number":1252,"context_line":"            _, binding \u003d db.get_locked_port_and_binding(session, id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_7c7ece6a","line":1249,"updated":"2016-06-01 16:38:08.000000000","message":"The get and update calls need to be within the transaction. Otherwise, other changes to the same port can occur in other processes/threads between the get and the processing below.","commit_id":"31cbe2be7280a027cab5499d708b571b1457eed0"}],"neutron/tests/unit/db/test_ipam_backend_mixin.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e8d6e17100f45777518c1a1d4d34f7a462c7f964","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def get_plugin_description(self):"},{"line_number":175,"context_line":"        return \"Test Plugin\""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def get_plugin_type(self):"},{"line_number":178,"context_line":"        return \"test_plugin\""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def create_port(self, context, port):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_13e7fd11","line":177,"range":{"start_line":177,"start_character":8,"end_line":177,"end_character":23},"updated":"2016-06-07 21:40:22.000000000","message":"We\u0027re just now changing these to class methods [1].\n\n[1] https://review.openstack.org/#/c/326716/","commit_id":"f20efda689d76fc1d1227627a7f378ba74d853f9"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"c12fd2e62879becc5cd472249351d2d7987be5ad","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        super(TestPortUpdateIpam, self).setUp(plugin\u003dplugin)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_port_update_allocate_from_net_subnet(self):"},{"line_number":195,"context_line":"        \"\"\"Tests that a port can be \"\"\""},{"line_number":196,"context_line":"        with self.network() as network:"},{"line_number":197,"context_line":"            pass"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_7a6714e9","line":195,"updated":"2016-06-08 09:57:52.000000000","message":"nit: I think some words are missing here...","commit_id":"9d39e0ff81b01389bfc2762bdfd8bbcd0a1bc1d6"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"41180c06ba31f11413478a62b7ca2f9578901815","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        super(TestPortUpdateIpam, self).setUp(plugin\u003dplugin)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_port_update_allocate_from_net_subnet(self):"},{"line_number":195,"context_line":"        \"\"\"Tests that a port can be \"\"\""},{"line_number":196,"context_line":"        with self.network() as network:"},{"line_number":197,"context_line":"            pass"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_6b11d251","line":195,"in_reply_to":"7aa08908_705d7346","updated":"2016-06-09 00:16:57.000000000","message":"Yikes, good catch.","commit_id":"9d39e0ff81b01389bfc2762bdfd8bbcd0a1bc1d6"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8c1e79a17bfc2ae19412af9a4b4730805c50d3bb","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        super(TestPortUpdateIpam, self).setUp(plugin\u003dplugin)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_port_update_allocate_from_net_subnet(self):"},{"line_number":195,"context_line":"        \"\"\"Tests that a port can be \"\"\""},{"line_number":196,"context_line":"        with self.network() as network:"},{"line_number":197,"context_line":"            pass"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_705d7346","line":195,"in_reply_to":"7aa08908_7a6714e9","updated":"2016-06-08 10:33:35.000000000","message":"Done","commit_id":"9d39e0ff81b01389bfc2762bdfd8bbcd0a1bc1d6"}],"neutron/tests/unit/ipam/test_port_update.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a79b3de57395643e4785ae5114454060a160b9d7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            plugin \u003d \u0027neutron.tests.unit.ipam.test_port_update.TestPlugin\u0027"},{"line_number":48,"context_line":"        super(TestPortUpdateIpam, self).setUp(plugin\u003dplugin)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_port_update_allocate_from_net_subnet(self):"},{"line_number":51,"context_line":"        \"\"\"Tests that a port can be \"\"\""},{"line_number":52,"context_line":"        with self.network() as network:"},{"line_number":53,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_ecfc3240","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":49},"updated":"2016-05-25 18:16:19.000000000","message":"Basically, this test passes with the generic test plugin and fails with ML2.","commit_id":"e2a5394a6041a53387750c26ff21e8b0bcf7448d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a79b3de57395643e4785ae5114454060a160b9d7","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            res \u003d self.deserialize(self.fmt, response)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.assertEqual(webob.exc.HTTPOk.code, response.status_int)"},{"line_number":73,"context_line":"        self.assertEqual(1, len(res[\u0027port\u0027][\u0027fixed_ips\u0027]))"},{"line_number":74,"context_line":"        ip \u003d res[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027ip_address\u0027]"},{"line_number":75,"context_line":"        ip_net \u003d netaddr.IPNetwork(subnet[\u0027subnet\u0027][\u0027cidr\u0027])"},{"line_number":76,"context_line":"        self.assertIn(ip, ip_net)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_2cbc7a6b","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":26},"updated":"2016-05-25 18:16:19.000000000","message":"In the ML2 case, this\u0027ll be 0 because the newly allocated IPs are not returned with the response.","commit_id":"e2a5394a6041a53387750c26ff21e8b0bcf7448d"}]}
