)]}'
{"tempest/api/network/test_routers.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"05a6b018837ce7b9d5151639ee9d4a5d18104b5b","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    @test.idempotent_id(\u0027c86ac3a8-50bd-4b00-a6b8-62af84a0765c\u0027)"},{"line_number":271,"context_line":"    @test.requires_ext(extension\u003d\u0027extraroute\u0027, service\u003d\u0027network\u0027)"},{"line_number":272,"context_line":"    def test_update_extra_route(self):"},{"line_number":273,"context_line":"        networks \u003d [self.create_network(), self.create_network()]"},{"line_number":274,"context_line":"        sub02_cidr \u003d netaddr.IPNetwork(self.tenant_cidr).next()"},{"line_number":275,"context_line":"        subnets \u003d [self.create_subnet(networks[0]),"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_f1a3074e","line":272,"updated":"2015-06-29 09:52:07.000000000","message":"You should use for loops, or add code comments/blank lines because this is hard to read now.","commit_id":"f7b3b6c41f9c37d659093b7e7726ae92456b98d2"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"445aa8d2d08019b256c2c00c148c0f89386264c9","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    @test.idempotent_id(\u0027c86ac3a8-50bd-4b00-a6b8-62af84a0765c\u0027)"},{"line_number":271,"context_line":"    @test.requires_ext(extension\u003d\u0027extraroute\u0027, service\u003d\u0027network\u0027)"},{"line_number":272,"context_line":"    def test_update_extra_route(self):"},{"line_number":273,"context_line":"        networks \u003d [self.create_network(), self.create_network()]"},{"line_number":274,"context_line":"        sub02_cidr \u003d netaddr.IPNetwork(self.tenant_cidr).next()"},{"line_number":275,"context_line":"        subnets \u003d [self.create_subnet(networks[0]),"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_e77b427a","line":272,"in_reply_to":"ba3cc151_f1a3074e","updated":"2015-06-29 13:46:36.000000000","message":"Thanks for your comments. I refer to another test cases which doesn\u0027t use loops either. I\u0027ll add code comments.","commit_id":"f7b3b6c41f9c37d659093b7e7726ae92456b98d2"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"3680caff0bd272883812f61da1b5849dc1efbcce","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            self.router[\u0027id\u0027])"},{"line_number":287,"context_line":"        # Update router extra route, second ip of the range is"},{"line_number":288,"context_line":"        # used as next hop"},{"line_number":289,"context_line":"        cidrs \u003d [netaddr.IPNetwork(subnets[0][\u0027cidr\u0027]),"},{"line_number":290,"context_line":"                 netaddr.IPNetwork(subnets[1][\u0027cidr\u0027])]"},{"line_number":291,"context_line":"        next_hops \u003d [str(cidrs[0][2]), str(cidrs[1][2])]"},{"line_number":292,"context_line":"        destinations \u003d [str(subnets[0][\u0027cidr\u0027]), str(subnets[1][\u0027cidr\u0027])]"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_6444e973","line":289,"updated":"2015-06-30 08:07:12.000000000","message":"You should build your cidrs, next_hops, destinations and routes inside a for loop. Because having to much \"indexes\" in your lists (like cidrs[1][2]) makes the code hard to read.\n\nTry to imagine that you have 8 routes not only 2.","commit_id":"83d25710b4192d667b3b766590b13993338a3154"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"f9dcf51711a2611a742cd94a76b41a55e0b0ccd4","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            self.router[\u0027id\u0027])"},{"line_number":287,"context_line":"        # Update router extra route, second ip of the range is"},{"line_number":288,"context_line":"        # used as next hop"},{"line_number":289,"context_line":"        cidrs \u003d [netaddr.IPNetwork(subnets[0][\u0027cidr\u0027]),"},{"line_number":290,"context_line":"                 netaddr.IPNetwork(subnets[1][\u0027cidr\u0027])]"},{"line_number":291,"context_line":"        next_hops \u003d [str(cidrs[0][2]), str(cidrs[1][2])]"},{"line_number":292,"context_line":"        destinations \u003d [str(subnets[0][\u0027cidr\u0027]), str(subnets[1][\u0027cidr\u0027])]"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_377a4778","line":289,"in_reply_to":"ba3cc151_6444e973","updated":"2015-07-01 13:22:56.000000000","message":"Done","commit_id":"83d25710b4192d667b3b766590b13993338a3154"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"3680caff0bd272883812f61da1b5849dc1efbcce","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        nexthop_list \u003d [extra_route[\u0027router\u0027][\u0027routes\u0027][0][\u0027nexthop\u0027],"},{"line_number":302,"context_line":"                        extra_route[\u0027router\u0027][\u0027routes\u0027][1][\u0027nexthop\u0027]]"},{"line_number":303,"context_line":"        # Assert the nexthops \u0026 destination"},{"line_number":304,"context_line":"        self.assertIn(destinations[0], destination_list)"},{"line_number":305,"context_line":"        self.assertIn(next_hops[0], nexthop_list)"},{"line_number":306,"context_line":"        self.assertIn(destinations[1], destination_list)"},{"line_number":307,"context_line":"        self.assertIn(next_hops[1], nexthop_list)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_1fb0c642","line":304,"updated":"2015-06-30 08:07:12.000000000","message":"You should not build a destination_list of all valid destinations. You should assert that destinations[0] \u003d\u003d extra_route[\u0027router\u0027][\u0027routes\u0027][0][\u0027destination\u0027]\n\nI know the indexes 0 and 1 can be inverted, but you can find a way around this.","commit_id":"83d25710b4192d667b3b766590b13993338a3154"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"f9dcf51711a2611a742cd94a76b41a55e0b0ccd4","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        nexthop_list \u003d [extra_route[\u0027router\u0027][\u0027routes\u0027][0][\u0027nexthop\u0027],"},{"line_number":302,"context_line":"                        extra_route[\u0027router\u0027][\u0027routes\u0027][1][\u0027nexthop\u0027]]"},{"line_number":303,"context_line":"        # Assert the nexthops \u0026 destination"},{"line_number":304,"context_line":"        self.assertIn(destinations[0], destination_list)"},{"line_number":305,"context_line":"        self.assertIn(next_hops[0], nexthop_list)"},{"line_number":306,"context_line":"        self.assertIn(destinations[1], destination_list)"},{"line_number":307,"context_line":"        self.assertIn(next_hops[1], nexthop_list)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba3cc151_17962393","line":304,"in_reply_to":"ba3cc151_1fb0c642","updated":"2015-07-01 13:22:56.000000000","message":"Done","commit_id":"83d25710b4192d667b3b766590b13993338a3154"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"3d3d52690dbfc2c4df08c10707545a75ab98de97","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        cidrs \u003d []"},{"line_number":281,"context_line":"        next_hops \u003d []"},{"line_number":282,"context_line":"        destinations \u003d []"},{"line_number":283,"context_line":"        test_routes \u003d []"},{"line_number":284,"context_line":"        routes_num \u003d 5"},{"line_number":285,"context_line":"        # Create a router"},{"line_number":286,"context_line":"        self.router \u003d self._create_router("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_35797b93","line":283,"updated":"2015-07-09 16:40:52.000000000","message":"\u0027test_routes\u0027 is the only \u0027list\u0027 that is needed. You don\"t need the save the list of networks, subnets, cidrs, next_hops and destinations.","commit_id":"69f4939776f4eb5f22556892421ec41a8250520b"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"02dbed7a216146f6af5af0bfc590ab0c5851561c","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        cidrs \u003d []"},{"line_number":281,"context_line":"        next_hops \u003d []"},{"line_number":282,"context_line":"        destinations \u003d []"},{"line_number":283,"context_line":"        test_routes \u003d []"},{"line_number":284,"context_line":"        routes_num \u003d 5"},{"line_number":285,"context_line":"        # Create a router"},{"line_number":286,"context_line":"        self.router \u003d self._create_router("}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_7a003936","line":283,"in_reply_to":"ba3cc151_35797b93","updated":"2015-07-10 03:17:59.000000000","message":"Done","commit_id":"69f4939776f4eb5f22556892421ec41a8250520b"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"3d3d52690dbfc2c4df08c10707545a75ab98de97","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            self.router[\u0027id\u0027])"},{"line_number":291,"context_line":"        # Update router extra route, second ip of the range is"},{"line_number":292,"context_line":"        # used as next hop"},{"line_number":293,"context_line":"        for i in range(0, routes_num):"},{"line_number":294,"context_line":"            networks.append(self.create_network())"},{"line_number":295,"context_line":"            subnets.append(self.create_subnet(networks[i], cidr\u003dnext_cidr))"},{"line_number":296,"context_line":"            next_cidr \u003d next_cidr.next()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_95d08720","line":293,"updated":"2015-07-09 16:40:52.000000000","message":"Replace the for loop with\n\n  for i in range(routes_num):\n    network \u003d self.create_network()\n    subnet \u003d self.create_subnet(networks, cidr\u003dnext_cidr)\n    next_cidr \u003d next_cidr.next()\n\n    # Add router interface with subnet id\n    self.create_router_interface(self.router[\u0027id\u0027],   subnet[\u0027id\u0027])\n\n    cidr \u003d netaddr.IPNetwork(subnet[\u0027cidr\u0027])\n    next_hop \u003d cidr[2]\n    destination \u003d str(subnet[\u0027cidr\u0027])\n    test_routes.append(\n      {\u0027nexthop\u0027: next_hop, \u0027destination\u0027: destination}\n    )\n\nThis way, you don\u0027t have to remember variable/values that you don\"t need anymore.","commit_id":"69f4939776f4eb5f22556892421ec41a8250520b"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"02dbed7a216146f6af5af0bfc590ab0c5851561c","unresolved":false,"context_lines":[{"line_number":290,"context_line":"            self.router[\u0027id\u0027])"},{"line_number":291,"context_line":"        # Update router extra route, second ip of the range is"},{"line_number":292,"context_line":"        # used as next hop"},{"line_number":293,"context_line":"        for i in range(0, routes_num):"},{"line_number":294,"context_line":"            networks.append(self.create_network())"},{"line_number":295,"context_line":"            subnets.append(self.create_subnet(networks[i], cidr\u003dnext_cidr))"},{"line_number":296,"context_line":"            next_cidr \u003d next_cidr.next()"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_daeaa574","line":293,"in_reply_to":"ba3cc151_95d08720","updated":"2015-07-10 03:17:59.000000000","message":"Nice! It\u0027s better. Thanks.","commit_id":"69f4939776f4eb5f22556892421ec41a8250520b"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"e6bea7f1142aa54f460f77ee465342d49d09568e","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        routes \u003d extra_route[\u0027router\u0027][\u0027routes\u0027]"},{"line_number":311,"context_line":"        routes.sort(key\u003dlambda x: x[\u0027destination\u0027])"},{"line_number":312,"context_line":"        # Assert the nexthops \u0026 destination"},{"line_number":313,"context_line":"        for i in range(0, routes_num):"},{"line_number":314,"context_line":"            self.assertEqual(test_routes[i][\u0027destination\u0027],"},{"line_number":315,"context_line":"                             routes[i][\u0027destination\u0027])"},{"line_number":316,"context_line":"            self.assertEqual(test_routes[i][\u0027nexthop\u0027], routes[i][\u0027nexthop\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_bec21c85","line":313,"updated":"2015-07-10 14:16:40.000000000","message":"^^ ... Nevermind.\n\nI\u0027ll wait for Jenkins and then I\u0027ll +2 it.","commit_id":"001bff3d52c15ab125360cabad855b637bd3f980"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"1cb5e9c483bc7ad7fb69048ab68bef8a00e609a5","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        routes \u003d extra_route[\u0027router\u0027][\u0027routes\u0027]"},{"line_number":311,"context_line":"        routes.sort(key\u003dlambda x: x[\u0027destination\u0027])"},{"line_number":312,"context_line":"        # Assert the nexthops \u0026 destination"},{"line_number":313,"context_line":"        for i in range(0, routes_num):"},{"line_number":314,"context_line":"            self.assertEqual(test_routes[i][\u0027destination\u0027],"},{"line_number":315,"context_line":"                             routes[i][\u0027destination\u0027])"},{"line_number":316,"context_line":"            self.assertEqual(test_routes[i][\u0027nexthop\u0027], routes[i][\u0027nexthop\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a41bdd9_058d1631","line":313,"in_reply_to":"ba3cc151_bec21c85","updated":"2015-07-11 00:19:54.000000000","message":"oh! I just missed these two. I should have reviewed them carefully. -_-||","commit_id":"001bff3d52c15ab125360cabad855b637bd3f980"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"e6bea7f1142aa54f460f77ee465342d49d09568e","unresolved":false,"context_lines":[{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        routes \u003d show_body[\u0027router\u0027][\u0027routes\u0027]"},{"line_number":319,"context_line":"        routes.sort(key\u003dlambda x: x[\u0027destination\u0027])"},{"line_number":320,"context_line":"        for i in range(0, routes_num):"},{"line_number":321,"context_line":"            self.assertEqual(test_routes[i][\u0027destination\u0027],"},{"line_number":322,"context_line":"                             routes[i][\u0027destination\u0027])"},{"line_number":323,"context_line":"            self.assertEqual(test_routes[i][\u0027nexthop\u0027], routes[i][\u0027nexthop\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_7ebc9406","line":320,"updated":"2015-07-10 14:16:40.000000000","message":"^^","commit_id":"001bff3d52c15ab125360cabad855b637bd3f980"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"1cb5e9c483bc7ad7fb69048ab68bef8a00e609a5","unresolved":false,"context_lines":[{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        routes \u003d show_body[\u0027router\u0027][\u0027routes\u0027]"},{"line_number":319,"context_line":"        routes.sort(key\u003dlambda x: x[\u0027destination\u0027])"},{"line_number":320,"context_line":"        for i in range(0, routes_num):"},{"line_number":321,"context_line":"            self.assertEqual(test_routes[i][\u0027destination\u0027],"},{"line_number":322,"context_line":"                             routes[i][\u0027destination\u0027])"},{"line_number":323,"context_line":"            self.assertEqual(test_routes[i][\u0027nexthop\u0027], routes[i][\u0027nexthop\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a41bdd9_25761a3f","line":320,"in_reply_to":"ba3cc151_7ebc9406","updated":"2015-07-11 00:19:54.000000000","message":"Done","commit_id":"001bff3d52c15ab125360cabad855b637bd3f980"}],"tempest/services/network/json/network_client.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"05a6b018837ce7b9d5151639ee9d4a5d18104b5b","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":437,"context_line":"        return service_client.ResponseBody(resp, body)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def create_ikepolicy(self, name, **kwargs):"},{"line_number":440,"context_line":"        post_body \u003d {"},{"line_number":441,"context_line":"            \"ikepolicy\": {"},{"line_number":442,"context_line":"                \"name\": name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_319acf15","line":439,"updated":"2015-06-29 09:52:07.000000000","message":"This method is not related to this patch.","commit_id":"f7b3b6c41f9c37d659093b7e7726ae92456b98d2"},{"author":{"_account_id":16986,"name":"Shuquan Huang","email":"shuquan.huang@live.com","username":"shuquan"},"change_message_id":"445aa8d2d08019b256c2c00c148c0f89386264c9","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":437,"context_line":"        return service_client.ResponseBody(resp, body)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def create_ikepolicy(self, name, **kwargs):"},{"line_number":440,"context_line":"        post_body \u003d {"},{"line_number":441,"context_line":"            \"ikepolicy\": {"},{"line_number":442,"context_line":"                \"name\": name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_e7f26206","line":439,"in_reply_to":"ba3cc151_319acf15","updated":"2015-06-29 13:46:36.000000000","message":"I\u0027ll delete it.","commit_id":"f7b3b6c41f9c37d659093b7e7726ae92456b98d2"}]}
