)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"9f4be62227f20805ebeb6ac145a8633c3302b63a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bin Zhou \u003czhou.bin9@zte.com.cn\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-30 11:53:18 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Make dict.keys() PY3 compatible"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The dict.keys()[0] will raise a TypeError in PY3, as dict.keys()"},{"line_number":10,"context_line":"doesn\u0027t return a list any more in PY3 but a view of list. So does"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3aaa91ec_db6611ba","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":31},"updated":"2016-06-30 09:11:19.000000000","message":"should be reworded I guess","commit_id":"7086d1ca99b1f4c36fe1376cb9cfb941c1741602"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0e0450a07e2af1f0fda89cfa556f65c95365b2e7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bin Zhou \u003czhou.bin9@zte.com.cn\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-07 20:59:01 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"dict.values() refactor"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The dict.keys()[0] will raise a TypeError in PY3, as dict.keys()"},{"line_number":10,"context_line":"doesn\u0027t return a list any more in PY3 but a view of list. So does"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1aa78d24_b905d614","line":7,"updated":"2016-07-07 15:08:05.000000000","message":"\"Refactor usage of dict.values()[0]\"","commit_id":"5088ce05ec66158f351176dfddc7e1729053910f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0e0450a07e2af1f0fda89cfa556f65c95365b2e7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"dict.values() refactor"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The dict.keys()[0] will raise a TypeError in PY3, as dict.keys()"},{"line_number":10,"context_line":"doesn\u0027t return a list any more in PY3 but a view of list. So does"},{"line_number":11,"context_line":"the dict.values() and this patch is to fix this bug by refactoring"},{"line_number":12,"context_line":"the relevant code."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I4362a22322807eda8d795d68395445d53ab60ad4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1aa78d24_347e0d6a","line":11,"range":{"start_line":9,"start_character":0,"end_line":11,"end_character":17},"updated":"2016-07-07 15:08:05.000000000","message":"IMO you can remove mention of dict.keys since it is not relevant to this patch.","commit_id":"5088ce05ec66158f351176dfddc7e1729053910f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"8dd1d992a1180321761cad6481f4796524f490f4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bin Zhou \u003czhou.bin9@zte.com.cn\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-11 11:17:46 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Refactor usage of dict.values()[0]"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The dict.values()[0] will raise a TypeError in PY3, as dict.values()"},{"line_number":10,"context_line":"doesn\u0027t return a list any more in PY3 but a view of list. This patch"},{"line_number":11,"context_line":"is to fix this bug by refactoring the relevant code."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I4362a22322807eda8d795d68395445d53ab60ad4"},{"line_number":14,"context_line":"Closes-Bug: #1583419"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1aa78d24_ac5fa8e3","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":52},"updated":"2016-07-12 06:00:39.000000000","message":"Original code uses not dict.values()[0] but list(dict.values())[0] so it doesn\u0027t error in PY3. This patch is just refactor to make complex codes clean.","commit_id":"31ed226a67ff6b2320f605ce436658312cf0c701"}],"neutron/tests/functional/services/l3_router/test_l3_dvr_ha_router_plugin.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6bcafdc3f5ec2ffaa68b18d5e74f781f74c2068f","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        if int_cnt \u003e 1:"},{"line_number":348,"context_line":"            self.assertEqual(subnet[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":349,"context_line":"                             list(snat_router_intfs.values())[0][0]["},{"line_number":350,"context_line":"                                 \u0027fixed_ips\u0027][0][\u0027subnet_id\u0027])"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def _check_internal_subnet_interface_presence(self, router, subnet,"},{"line_number":353,"context_line":"                                                  int_cnt):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_11a61110","line":350,"updated":"2016-06-23 01:11:48.000000000","message":"+1. This test is really bad. The only time it does this comparison is when there are multiple entries as well.","commit_id":"24a8bb2f4bf9ddf1c6d2d92e78d01521e2abeca7"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"da3c4846ef25b43f6193f95150109b5e28c8099a","unresolved":false,"context_lines":[{"line_number":343,"context_line":"    def _check_snat_internal_gateways_presence(self, router, subnet, int_cnt):"},{"line_number":344,"context_line":"        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces("},{"line_number":345,"context_line":"            self.context, [router[\u0027id\u0027]])"},{"line_number":346,"context_line":"        self.assertEqual(int_cnt, len(snat_router_intfs))"},{"line_number":347,"context_line":"        if int_cnt \u003e 1:"},{"line_number":348,"context_line":"            self.assertEqual(subnet[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":349,"context_line":"                             list(snat_router_intfs.values())[0][0]["},{"line_number":350,"context_line":"                                 \u0027fixed_ips\u0027][0][\u0027subnet_id\u0027])"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def _check_internal_subnet_interface_presence(self, router, subnet,"},{"line_number":353,"context_line":"                                                  int_cnt):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_dd22feb8","line":350,"range":{"start_line":346,"start_character":8,"end_line":350,"end_character":62},"updated":"2016-06-22 13:44:32.000000000","message":"I don\u0027t like this test at all. Dictionary elements are not ordered, so the \"first\" value is not guaranteed to be the one you are looking for.\n\nI think it would be better to fix the test, perhaps by iterating over the snat_router_intfs.\n\nAlso, it looks like more tests in this class/module may have similar issues.","commit_id":"24a8bb2f4bf9ddf1c6d2d92e78d01521e2abeca7"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2f080f87f7db1ea8b990689559d71a2f31de2d99","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        self.assertEqual(int_cnt, len(snat_router_intfs))"},{"line_number":347,"context_line":"        if int_cnt \u003e 1:"},{"line_number":348,"context_line":"            self.assertEqual(subnet[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":349,"context_line":"                             snat_router_intfs.values()[0][0][\u0027fixed_ips\u0027][0]["},{"line_number":350,"context_line":"                                 \u0027subnet_id\u0027])"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def _check_internal_subnet_interface_presence(self, router, subnet,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_bbeeac1f","side":"PARENT","line":349,"range":{"start_line":349,"start_character":29,"end_line":349,"end_character":55},"updated":"2016-06-30 06:17:07.000000000","message":"wouldn\u0027t it be better and easier to just cast this as a list?","commit_id":"4d3038d96e6d70751ea38cbb5a6fde6b7384c430"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"166d6a002d9772d0b0b97169eefce3dff33520f5","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces("},{"line_number":345,"context_line":"            self.context, [router[\u0027id\u0027]])"},{"line_number":346,"context_line":"        self.assertEqual(int_cnt, len(snat_router_intfs))"},{"line_number":347,"context_line":"        for router_intf_info_list in snat_router_intfs.values():"},{"line_number":348,"context_line":"            self.assertEqual(subnet[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":349,"context_line":"                             router_intf_info_list[0]["},{"line_number":350,"context_line":"                                 \u0027fixed_ips\u0027][0][\u0027subnet_id\u0027])"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def _check_internal_subnet_interface_presence(self, router, subnet,"},{"line_number":353,"context_line":"                                                  int_cnt):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1aa78d24_0ebe79fe","line":350,"range":{"start_line":347,"start_character":8,"end_line":350,"end_character":62},"updated":"2016-07-07 08:32:12.000000000","message":"still doesn\u0027t make much sense since there could be only one \nsnat interface for each subnet attached to a router.\nThis method is only called with int_cnt \u003d 1 and 0, so it would be more clear:\n \n def _check_snat_internal_gateways_presence(self, router, subnet,\n                                               presence\u003dTrue):\n        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces(\n            self.context, [router[\u0027id\u0027]])\n        if not presence:\n            self.assertIsEmpty(snat_router_intfs)\n        else:\n            snat_interfaces \u003d snat_router_intfs[router[\u0027id\u0027]]\n            self.assertEqual(1, len(snat_interfaces))\n            self.assertEqual(subnet[\u0027subnet\u0027][\u0027id\u0027],\n                             snat_interfaces[0][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027])","commit_id":"f7cab476802a99a03daa301fbd21332df4aa4b33"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"323e143eee65bfdc063edf072debbe74515cb425","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        if gw_count \u003e 1:"},{"line_number":341,"context_line":"            self.assertEqual(router[\u0027id\u0027], gw_port[0][\u0027device_id\u0027])"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _check_snat_internal_gateways_presence(self, router, subnet,"},{"line_number":344,"context_line":"                                               presence\u003dTrue):"},{"line_number":345,"context_line":"        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces("},{"line_number":346,"context_line":"            self.context, [router[\u0027id\u0027]])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_67cabb1c","line":343,"range":{"start_line":343,"start_character":8,"end_line":343,"end_character":46},"updated":"2016-07-07 11:00:24.000000000","message":"need to update callers of this method as well","commit_id":"24ebf1ec11a681afb627b7c97f74c78a0af2595a"},{"author":{"_account_id":12732,"name":"Bin Zhou","email":"zhou.bin9@zte.com.cn","username":"BinZhou"},"change_message_id":"dfbc19bd65635a90fd49632ec3e59bf6bf1ec9c9","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        if gw_count \u003e 1:"},{"line_number":341,"context_line":"            self.assertEqual(router[\u0027id\u0027], gw_port[0][\u0027device_id\u0027])"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _check_snat_internal_gateways_presence(self, router, subnet,"},{"line_number":344,"context_line":"                                               presence\u003dTrue):"},{"line_number":345,"context_line":"        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces("},{"line_number":346,"context_line":"            self.context, [router[\u0027id\u0027]])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_7db6c8f9","line":343,"range":{"start_line":343,"start_character":8,"end_line":343,"end_character":46},"in_reply_to":"1aa78d24_67cabb1c","updated":"2016-07-07 11:33:09.000000000","message":"Done","commit_id":"24ebf1ec11a681afb627b7c97f74c78a0af2595a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0e0450a07e2af1f0fda89cfa556f65c95365b2e7","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            self.assertEqual(router[\u0027id\u0027], gw_port[0][\u0027device_id\u0027])"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _check_snat_internal_gateways_presence(self, router, subnet,"},{"line_number":344,"context_line":"                                               presence\u003dTrue):"},{"line_number":345,"context_line":"        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces("},{"line_number":346,"context_line":"            self.context, [router[\u0027id\u0027]])"},{"line_number":347,"context_line":"        if not presence:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_190eaa8b","line":344,"range":{"start_line":344,"start_character":47,"end_line":344,"end_character":55},"updated":"2016-07-07 15:08:05.000000000","message":"present","commit_id":"5088ce05ec66158f351176dfddc7e1729053910f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0e0450a07e2af1f0fda89cfa556f65c95365b2e7","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        self._check_dvr_ha_interfaces_presence(router, 2)"},{"line_number":395,"context_line":"        self._check_snat_external_gateway_presence(ext_net, router, 1)"},{"line_number":396,"context_line":"        self._check_internal_subnet_interface_presence(router, int_subnet, 1)"},{"line_number":397,"context_line":"        self._check_snat_internal_gateways_presence(router, int_subnet, True)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        # clear router external gateway"},{"line_number":400,"context_line":"        self._clear_external_gateway(router)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_595cb24a","line":397,"range":{"start_line":397,"start_character":72,"end_line":397,"end_character":76},"updated":"2016-07-07 15:08:05.000000000","message":"It would be clearer if you named the argument,\n present\u003dTrue","commit_id":"5088ce05ec66158f351176dfddc7e1729053910f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"0e0450a07e2af1f0fda89cfa556f65c95365b2e7","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        self._check_dvr_ha_interfaces_presence(router, 2)"},{"line_number":402,"context_line":"        self._check_snat_external_gateway_presence(ext_net, router, 0)"},{"line_number":403,"context_line":"        self._check_internal_subnet_interface_presence(router, int_subnet, 1)"},{"line_number":404,"context_line":"        self._check_snat_internal_gateways_presence(router, int_subnet, False)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        # remove subnet interface from router"},{"line_number":407,"context_line":"        self._remove_interface_from_router(router, int_subnet)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aa78d24_d936e201","line":404,"range":{"start_line":404,"start_character":72,"end_line":404,"end_character":77},"updated":"2016-07-07 15:08:05.000000000","message":"Ditto.","commit_id":"5088ce05ec66158f351176dfddc7e1729053910f"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"c0fe7c2cac89bad1fb3c5a60bae5118751be4ebb","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        self._check_dvr_ha_interfaces_presence(router, 2)"},{"line_number":395,"context_line":"        self._check_snat_external_gateway_presence(ext_net, router, 1)"},{"line_number":396,"context_line":"        self._check_internal_subnet_interface_presence(router, int_subnet, 1)"},{"line_number":397,"context_line":"        self._check_snat_internal_gateways_presence(router, int_subnet, present\u003dTrue)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        # clear router external gateway"},{"line_number":400,"context_line":"        self._clear_external_gateway(router)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_ddb989cd","line":397,"updated":"2016-07-08 06:33:20.000000000","message":"This function is now inconsistent with the other presence check functions (the 3 called before this one).","commit_id":"a122c17abbc3e47fa4950c38ee2a42d3377214de"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"cfcad628f2bb76bb1833e322b38b33d9a2c7df76","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        self._check_dvr_ha_interfaces_presence(router, 2)"},{"line_number":395,"context_line":"        self._check_snat_external_gateway_presence(ext_net, router, 1)"},{"line_number":396,"context_line":"        self._check_internal_subnet_interface_presence(router, int_subnet, 1)"},{"line_number":397,"context_line":"        self._check_snat_internal_gateways_presence(router, int_subnet, present\u003dTrue)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        # clear router external gateway"},{"line_number":400,"context_line":"        self._clear_external_gateway(router)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_9d7d41b4","line":397,"in_reply_to":"1aa78d24_ddb989cd","updated":"2016-07-08 06:50:53.000000000","message":"oh good catch on this, i did not see that.  though I must admit i like the present better, but self._check_dvr_ha_interfaces_presence looks like it wouldn\u0027t be able to use a boolean if it can be more than 1.","commit_id":"a122c17abbc3e47fa4950c38ee2a42d3377214de"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6c3289c0e838df52a6f0a335be69494cfd31bf71","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces("},{"line_number":345,"context_line":"            self.context, [router[\u0027id\u0027]])"},{"line_number":346,"context_line":"        if int_cnt \u003d\u003d 0:"},{"line_number":347,"context_line":"            self.assertIsEmpty(snat_router_intfs)"},{"line_number":348,"context_line":"        else:"},{"line_number":349,"context_line":"            snat_interfaces \u003d snat_router_intfs[router[\u0027id\u0027]]"},{"line_number":350,"context_line":"            self.assertEqual(1, len(snat_interfaces))"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_f81c41c3","line":347,"range":{"start_line":347,"start_character":17,"end_line":347,"end_character":30},"updated":"2016-07-08 13:05:06.000000000","message":"seems this method does not exists. Use assertEqual(0, len(...)) instead","commit_id":"02c1382dc869776597577bad64ef9d0b01d1757f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"908e36b81ffbabc78be13838d9aa0524fe7a5afb","unresolved":false,"context_lines":[{"line_number":343,"context_line":"    def _check_snat_internal_gateways_presence(self, router, subnet, int_cnt):"},{"line_number":344,"context_line":"        snat_router_intfs \u003d self.l3_plugin._get_snat_sync_interfaces("},{"line_number":345,"context_line":"            self.context, [router[\u0027id\u0027]])"},{"line_number":346,"context_line":"        if int_cnt \u003d\u003d 0:"},{"line_number":347,"context_line":"            self.assertIsEmpty(snat_router_intfs)"},{"line_number":348,"context_line":"        else:"},{"line_number":349,"context_line":"            snat_interfaces \u003d snat_router_intfs[router[\u0027id\u0027]]"},{"line_number":350,"context_line":"            self.assertEqual(1, len(snat_interfaces))"},{"line_number":351,"context_line":"            self.assertEqual(subnet[\u0027subnet\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_38e1a9d1","line":348,"range":{"start_line":346,"start_character":0,"end_line":348,"end_character":13},"updated":"2016-07-08 13:11:06.000000000","message":"To me, the following looks better:\n\n  self.assertEqual(int_cnt, len(snat_router_intfs))\n  for snat_router_intf in snat_router_intfs:\n     ...","commit_id":"02c1382dc869776597577bad64ef9d0b01d1757f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6c3289c0e838df52a6f0a335be69494cfd31bf71","unresolved":false,"context_lines":[{"line_number":400,"context_line":"        self._check_dvr_ha_interfaces_presence(router, 2)"},{"line_number":401,"context_line":"        self._check_snat_external_gateway_presence(ext_net, router, 0)"},{"line_number":402,"context_line":"        self._check_internal_subnet_interface_presence(router, int_subnet, 1)"},{"line_number":403,"context_line":"        self._check_snat_internal_gateways_presence(router, int_subnet, 1)"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        # remove subnet interface from router"},{"line_number":406,"context_line":"        self._remove_interface_from_router(router, int_subnet)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_98341d4b","line":403,"range":{"start_line":403,"start_character":72,"end_line":403,"end_character":73},"updated":"2016-07-08 13:05:06.000000000","message":"why? it should stay 0","commit_id":"02c1382dc869776597577bad64ef9d0b01d1757f"}]}
