)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":14,"context_line":"  This test verifies that DVR router\u0027s interface can be added to"},{"line_number":15,"context_line":"  multiple subnets (One with IPV4 and other with IPV6 address)"},{"line_number":16,"context_line":"  per network."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I1d685c7ef9cd6f55958edbd25fd768cc2be2f3dc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9a41bdd9_cfa0b744","line":17,"updated":"2015-07-16 11:30:08.000000000","message":"Add a Related-Bug: line here","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"}],"tempest/api/network/admin/test_routers_dvr_multiple_subnets.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def resource_setup(cls):"},{"line_number":40,"context_line":"        super(DvrRouterMultipleSubnetsTest, cls).resource_setup()"},{"line_number":41,"context_line":"        cls.name \u003d data_utils.rand_name(\u0027router\u0027)"},{"line_number":42,"context_line":"        cls.net_name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":43,"context_line":"        cls.network \u003d cls.client.create_network(name\u003dcls.net_name)"},{"line_number":44,"context_line":"        cls.subnet \u003d cls.client.create_subnet("}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_4471ee0a","line":41,"updated":"2015-07-16 11:30:08.000000000","message":"This shouldn\u0027t be a class variable","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def resource_setup(cls):"},{"line_number":40,"context_line":"        super(DvrRouterMultipleSubnetsTest, cls).resource_setup()"},{"line_number":41,"context_line":"        cls.name \u003d data_utils.rand_name(\u0027router\u0027)"},{"line_number":42,"context_line":"        cls.net_name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":43,"context_line":"        cls.network \u003d cls.client.create_network(name\u003dcls.net_name)"},{"line_number":44,"context_line":"        cls.subnet \u003d cls.client.create_subnet("},{"line_number":45,"context_line":"            network_id\u003dcls.network[\u0027network\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_44480eb3","line":42,"updated":"2015-07-16 11:30:08.000000000","message":"Same","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        super(DvrRouterMultipleSubnetsTest, cls).resource_setup()"},{"line_number":41,"context_line":"        cls.name \u003d data_utils.rand_name(\u0027router\u0027)"},{"line_number":42,"context_line":"        cls.net_name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":43,"context_line":"        cls.network \u003d cls.client.create_network(name\u003dcls.net_name)"},{"line_number":44,"context_line":"        cls.subnet \u003d cls.client.create_subnet("},{"line_number":45,"context_line":"            network_id\u003dcls.network[\u0027network\u0027][\u0027id\u0027],"},{"line_number":46,"context_line":"            cidr\u003dCONF.network.tenant_network_cidr,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_cf21979f","line":43,"updated":"2015-07-16 11:30:08.000000000","message":"Use the create_network method defined in network/base.py (this way you don\u0027t have to worry about resource_cleanup)","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        cls.name \u003d data_utils.rand_name(\u0027router\u0027)"},{"line_number":42,"context_line":"        cls.net_name \u003d data_utils.rand_name(\u0027network\u0027)"},{"line_number":43,"context_line":"        cls.network \u003d cls.client.create_network(name\u003dcls.net_name)"},{"line_number":44,"context_line":"        cls.subnet \u003d cls.client.create_subnet("},{"line_number":45,"context_line":"            network_id\u003dcls.network[\u0027network\u0027][\u0027id\u0027],"},{"line_number":46,"context_line":"            cidr\u003dCONF.network.tenant_network_cidr,"},{"line_number":47,"context_line":"            ip_version\u003d4)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_efeb3b11","line":44,"updated":"2015-07-16 11:30:08.000000000","message":"Use the create_subnet method defined in network/base.py","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            network_id\u003dcls.network[\u0027network\u0027][\u0027id\u0027],"},{"line_number":46,"context_line":"            cidr\u003dCONF.network.tenant_network_cidr,"},{"line_number":47,"context_line":"            ip_version\u003d4)"},{"line_number":48,"context_line":"        cls.router \u003d cls.client.create_router(cls.name, distributed\u003dTrue)"},{"line_number":49,"context_line":"        if \u0027distributed\u0027 not in cls.router[\u0027router\u0027]:"},{"line_number":50,"context_line":"            msg \u003d \"\u0027distributed\u0027 attribute not found. DVR Possibly not enabled\""},{"line_number":51,"context_line":"            raise cls.skipException(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_afc8d3a8","line":48,"updated":"2015-07-16 11:30:08.000000000","message":"Same","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"7dd389402c205a35349cc13363a29e7f61306ea8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            network_id\u003dcls.network[\u0027network\u0027][\u0027id\u0027],"},{"line_number":46,"context_line":"            cidr\u003dCONF.network.tenant_network_cidr,"},{"line_number":47,"context_line":"            ip_version\u003d4)"},{"line_number":48,"context_line":"        cls.router \u003d cls.client.create_router(cls.name, distributed\u003dTrue)"},{"line_number":49,"context_line":"        if \u0027distributed\u0027 not in cls.router[\u0027router\u0027]:"},{"line_number":50,"context_line":"            msg \u003d \"\u0027distributed\u0027 attribute not found. DVR Possibly not enabled\""},{"line_number":51,"context_line":"            raise cls.skipException(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_c0c06a7f","line":48,"in_reply_to":"9a41bdd9_afc8d3a8","updated":"2015-07-16 21:05:14.000000000","message":"Here need to use admin credentials for creating DVR router.","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    @classmethod"},{"line_number":54,"context_line":"    def resource_cleanup(cls):"},{"line_number":55,"context_line":"        super(DvrRouterMultipleSubnetsTest, cls).resource_cleanup()"},{"line_number":56,"context_line":"        cls.client.delete_router(cls.router[\u0027router\u0027][\u0027id\u0027])"},{"line_number":57,"context_line":"        cls.client.delete_subnet(cls.subnet[\u0027subnet\u0027][\u0027id\u0027])"},{"line_number":58,"context_line":"        cls.client.delete_network(cls.network[\u0027network\u0027][\u0027id\u0027])"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_6f75eb61","line":56,"updated":"2015-07-16 11:30:08.000000000","message":"Not needed if you use the methods defined in network/base.py","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"7dd389402c205a35349cc13363a29e7f61306ea8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    @classmethod"},{"line_number":54,"context_line":"    def resource_cleanup(cls):"},{"line_number":55,"context_line":"        super(DvrRouterMultipleSubnetsTest, cls).resource_cleanup()"},{"line_number":56,"context_line":"        cls.client.delete_router(cls.router[\u0027router\u0027][\u0027id\u0027])"},{"line_number":57,"context_line":"        cls.client.delete_subnet(cls.subnet[\u0027subnet\u0027][\u0027id\u0027])"},{"line_number":58,"context_line":"        cls.client.delete_network(cls.network[\u0027network\u0027][\u0027id\u0027])"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_2004b6c4","line":56,"in_reply_to":"9a41bdd9_6f75eb61","updated":"2015-07-16 21:05:14.000000000","message":"Done.\nKeeping only router delete part because the use of admin credentials.","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @test.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":61,"context_line":"    def test_dvr_router_port_update_with_fixed_ip(self):"},{"line_number":62,"context_line":"        self.fixed_ip \u003d [{\u0027subnet_id\u0027: self.subnet[\u0027subnet\u0027][\u0027id\u0027]}]"},{"line_number":63,"context_line":"        v4_interface \u003d self.client.add_router_interface_with_subnet_id("},{"line_number":64,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027subnet\u0027][\u0027id\u0027])"},{"line_number":65,"context_line":"        self._verify_add_interface(v4_interface)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_af0d33e9","line":62,"updated":"2015-07-16 11:30:08.000000000","message":"This shouldn\u0027t be a class variable","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"5298b958338a0d848c70eabcd30fe3f0b548f5a9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        v4_interface \u003d self.client.add_router_interface_with_subnet_id("},{"line_number":64,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027subnet\u0027][\u0027id\u0027])"},{"line_number":65,"context_line":"        self._verify_add_interface(v4_interface)"},{"line_number":66,"context_line":"        port \u003d self.client.update_port(port_id\u003dv4_interface[\u0027port_id\u0027],"},{"line_number":67,"context_line":"                                       fixed_ips\u003dself.fixed_ip)"},{"line_number":68,"context_line":"        self.assertEqual(self.subnet[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":69,"context_line":"                         port[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_af33f360","line":66,"updated":"2015-07-16 11:30:08.000000000","message":"Use update_port from base.py This way you can access to what you need with port[\u0027fixed_ips\u0027] instead of port[\u0027port\u0027][\u0027fixed_ips\u0027] which is too heavy.","commit_id":"c03cf6cce2302b77e6715b031cfaf87c3dac8cb8"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"ebe42c9d688423fa5938c8d1f9f6fe9aaaff1771","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                        self.subnet[\u0027id\u0027])"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @test.idempotent_id(\u002702295b0f-290b-438b-965e-596c61530861\u0027)"},{"line_number":70,"context_line":"    def test_dvr_router_with_multiple_subnets(self):"},{"line_number":71,"context_line":"        v6_subnet \u003d self.create_subnet(self.network, ip_version\u003d6)"},{"line_number":72,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":73,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_1aaf9a7e","line":70,"updated":"2015-07-16 22:40:17.000000000","message":"This particular test is already handled in the tempest.\nI personnally think that it is duplicate in here.\n\nInstead you can modify the test to validate the \"update_port\" for router-interfaces in the case of IPv4 and IPv6 addresses.\n\nToday when you add a second subnet to the same network and if the IP version is \"4\" you always see there is a new port that is created on the subnet.\n\nBut in the case of \"IPv6\" the existing port is updated. So you can test and validate if the existing port is updated with \"two subnets\" in the case of \"IPv6\".","commit_id":"70cdd094da09e51669872f2a1e91f2af89fdc3dd"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"f965dbf86b1b588a829ba212b806cf4c2950d39e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                        self.subnet[\u0027id\u0027])"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @test.idempotent_id(\u002702295b0f-290b-438b-965e-596c61530861\u0027)"},{"line_number":70,"context_line":"    def test_dvr_router_with_multiple_subnets(self):"},{"line_number":71,"context_line":"        v6_subnet \u003d self.create_subnet(self.network, ip_version\u003d6)"},{"line_number":72,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":73,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_c44ab527","line":70,"in_reply_to":"9a41bdd9_1aaf9a7e","updated":"2015-07-17 01:59:01.000000000","message":"Done. \nAdded 2 tests to validate update_port for router-interface in the case of multiple IPV4 \u0026 IPV6 subnets per network.","commit_id":"70cdd094da09e51669872f2a1e91f2af89fdc3dd"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"1d382037abdb06577c33b0f427baf5810bc216f5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        cls.client.delete_router(cls.router[\u0027router\u0027][\u0027id\u0027])"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @test.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":56,"context_line":"    def test_dvr_router_port_update_with_fixed_ip(self):"},{"line_number":57,"context_line":"        fixed_ip \u003d [{\u0027subnet_id\u0027: self.subnet[\u0027id\u0027]}]"},{"line_number":58,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":59,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_590cbdec","line":56,"range":{"start_line":56,"start_character":54,"end_line":56,"end_character":56},"updated":"2016-01-05 22:46:28.000000000","message":"Is this test part of the DVR multiple subnet test.\nWhat does this validate? I don\u0027t see any value in this test that is related to DVR.","commit_id":"34699dcd65f144ddc84e2fd26273ef64da43bd66"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"f87c64ead5514cf3b6ac63fa58bf947b7a5cec94","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        cls.client.delete_router(cls.router[\u0027router\u0027][\u0027id\u0027])"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @test.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":56,"context_line":"    def test_dvr_router_port_update_with_fixed_ip(self):"},{"line_number":57,"context_line":"        fixed_ip \u003d [{\u0027subnet_id\u0027: self.subnet[\u0027id\u0027]}]"},{"line_number":58,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":59,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_6e194e22","line":56,"range":{"start_line":56,"start_character":54,"end_line":56,"end_character":56},"in_reply_to":"fa69d971_4e3e2e8d","updated":"2016-01-07 20:40:51.000000000","message":"Got it. \nIt would make sense if you could either change the function name to \"test_dvr_router_interface_port_update\" or else add a \"Doc string to explain why updating the port\".","commit_id":"34699dcd65f144ddc84e2fd26273ef64da43bd66"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"68865e9b3c983159789314d7014e49f14430d4cf","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        cls.client.delete_router(cls.router[\u0027router\u0027][\u0027id\u0027])"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @test.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":56,"context_line":"    def test_dvr_router_port_update_with_fixed_ip(self):"},{"line_number":57,"context_line":"        fixed_ip \u003d [{\u0027subnet_id\u0027: self.subnet[\u0027id\u0027]}]"},{"line_number":58,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":59,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_4e3e2e8d","line":56,"range":{"start_line":56,"start_character":54,"end_line":56,"end_character":56},"in_reply_to":"fa69d971_590cbdec","updated":"2016-01-05 23:41:41.000000000","message":"This test is to validate that DVR router port canbe updated with a fixed ip as before fix of bug 1465434, it was throwing port-postcommit failure error. \n\nThis failure was only observed with DVR router. \n\nThis port_update validates the portcommit failure in the bug1465434","commit_id":"34699dcd65f144ddc84e2fd26273ef64da43bd66"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"5cb18d8e8ade279b8c4b94598805cf893448cd98","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        cls.client.delete_router(cls.router[\u0027router\u0027][\u0027id\u0027])"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @test.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":56,"context_line":"    def test_dvr_router_port_update_with_fixed_ip(self):"},{"line_number":57,"context_line":"        fixed_ip \u003d [{\u0027subnet_id\u0027: self.subnet[\u0027id\u0027]}]"},{"line_number":58,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":59,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_ccb5df31","line":56,"range":{"start_line":56,"start_character":54,"end_line":56,"end_character":56},"in_reply_to":"fa69d971_6e194e22","updated":"2016-01-07 22:40:54.000000000","message":"Done","commit_id":"34699dcd65f144ddc84e2fd26273ef64da43bd66"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ee19091c1f078a765d0dfedcdd34ff5029e13c91","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @test.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":56,"context_line":"    def test_dvr_router_interface_port_update_with_fixed_ip(self):"},{"line_number":57,"context_line":"        fixed_ip \u003d [{\u0027subnet_id\u0027: self.subnet[\u0027id\u0027]}]"},{"line_number":58,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":59,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"},{"line_number":60,"context_line":"        self._verify_add_interface(v4_interface)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_37394aa5","line":57,"range":{"start_line":57,"start_character":8,"end_line":57,"end_character":16},"updated":"2016-03-02 22:54:15.000000000","message":"sorry. I don\u0027t follow where the \"fixed_ip\" part of this variable is. It looks like just a subnet, not a fixed_ip. where is the \"ip\" part of it? or do we not care about the actual ip address just the subnet? or does the \"fixed_ip\" refer to the json key not an actual fixed ip address?","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"5d2642004e8fb42277600086b620bc0d4232a5f9","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @test.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":56,"context_line":"    def test_dvr_router_interface_port_update_with_fixed_ip(self):"},{"line_number":57,"context_line":"        fixed_ip \u003d [{\u0027subnet_id\u0027: self.subnet[\u0027id\u0027]}]"},{"line_number":58,"context_line":"        v4_interface \u003d self.create_router_interface("},{"line_number":59,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"},{"line_number":60,"context_line":"        self._verify_add_interface(v4_interface)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_af4a93aa","line":57,"range":{"start_line":57,"start_character":8,"end_line":57,"end_character":16},"in_reply_to":"7af24918_37394aa5","updated":"2016-03-04 23:52:44.000000000","message":"neutron port update has request parameter \u0027fixed_ips : {subnet_id:UUID}]\u0027, so neutron will pick up next available IP address from the subnet. Using same to update the port with new IP.","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"4c8d581175deeb389ebce29608e06bcc9abb7cd5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                                    fixed_ips\u003dfixed_ip)"},{"line_number":65,"context_line":"        self.assertEqual(self.subnet[\u0027id\u0027],"},{"line_number":66,"context_line":"                         router_port[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027])"},{"line_number":67,"context_line":"        self.addCleanup(self.client.remove_router_interface_with_subnet_id,"},{"line_number":68,"context_line":"                        self.router[\u0027router\u0027][\u0027id\u0027],"},{"line_number":69,"context_line":"                        self.subnet[\u0027id\u0027])"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_00130d5c","line":67,"updated":"2016-02-29 13:25:44.000000000","message":"This should be moved before l60. The general idea to addCleanup right after the resource was created.","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"5d2642004e8fb42277600086b620bc0d4232a5f9","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                                    fixed_ips\u003dfixed_ip)"},{"line_number":65,"context_line":"        self.assertEqual(self.subnet[\u0027id\u0027],"},{"line_number":66,"context_line":"                         router_port[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027])"},{"line_number":67,"context_line":"        self.addCleanup(self.client.remove_router_interface_with_subnet_id,"},{"line_number":68,"context_line":"                        self.router[\u0027router\u0027][\u0027id\u0027],"},{"line_number":69,"context_line":"                        self.subnet[\u0027id\u0027])"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_2fa32351","line":67,"in_reply_to":"9aed3d3a_00130d5c","updated":"2016-03-04 23:52:44.000000000","message":"Done","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ee19091c1f078a765d0dfedcdd34ff5029e13c91","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"},{"line_number":76,"context_line":"        v4_interface_2 \u003d self.create_router_interface("},{"line_number":77,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], v4_subnet_2[\u0027id\u0027])"},{"line_number":78,"context_line":"        self.addCleanup(self.client.remove_router_interface_with_subnet_id,"},{"line_number":79,"context_line":"                        self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"},{"line_number":80,"context_line":"        self.addCleanup(self.client.remove_router_interface_with_subnet_id,"},{"line_number":81,"context_line":"                        self.router[\u0027router\u0027][\u0027id\u0027], v4_subnet_2[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_02f04ac8","line":78,"range":{"start_line":78,"start_character":13,"end_line":78,"end_character":23},"updated":"2016-03-02 22:54:15.000000000","message":"you should move this up to right after interface creation, otherwise you run the risk of the first interface being created and the attempt to create the second interface failing, throwing an exception and exiting. In that case you would end up with an interface not being delete and also preventing the router from being cleaned up.","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"5d2642004e8fb42277600086b620bc0d4232a5f9","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"},{"line_number":76,"context_line":"        v4_interface_2 \u003d self.create_router_interface("},{"line_number":77,"context_line":"            self.router[\u0027router\u0027][\u0027id\u0027], v4_subnet_2[\u0027id\u0027])"},{"line_number":78,"context_line":"        self.addCleanup(self.client.remove_router_interface_with_subnet_id,"},{"line_number":79,"context_line":"                        self.router[\u0027router\u0027][\u0027id\u0027], self.subnet[\u0027id\u0027])"},{"line_number":80,"context_line":"        self.addCleanup(self.client.remove_router_interface_with_subnet_id,"},{"line_number":81,"context_line":"                        self.router[\u0027router\u0027][\u0027id\u0027], v4_subnet_2[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_6f852bac","line":78,"range":{"start_line":78,"start_character":13,"end_line":78,"end_character":23},"in_reply_to":"7af24918_02f04ac8","updated":"2016-03-04 23:52:44.000000000","message":"Done","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"4c8d581175deeb389ebce29608e06bcc9abb7cd5","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                            v4_interface_2[\u0027port_id\u0027])"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @test.idempotent_id(\u002748d7af05-2ba7-4b72-b218-765526999e3f\u0027)"},{"line_number":88,"context_line":"    def test_dvr_router_with_multiple_ipv6_subnets(self):"},{"line_number":89,"context_line":"        v6_subnet_1 \u003d self.create_subnet(self.network, ip_version\u003d6)"},{"line_number":90,"context_line":"        v6_subnet_2 \u003d self.create_subnet(self.network, ip_version\u003d6)"},{"line_number":91,"context_line":"        v6_interface_1 \u003d self.create_router_interface("}],"source_content_type":"text/x-python","patch_set":5,"id":"9aed3d3a_00ddcd6e","line":88,"updated":"2016-02-29 13:25:44.000000000","message":"What if IPV6 is disabled ? You should add a skip decorator based on CONF.network_feature_enabled.ipv6","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"5d2642004e8fb42277600086b620bc0d4232a5f9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                            v4_interface_2[\u0027port_id\u0027])"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @test.idempotent_id(\u002748d7af05-2ba7-4b72-b218-765526999e3f\u0027)"},{"line_number":88,"context_line":"    def test_dvr_router_with_multiple_ipv6_subnets(self):"},{"line_number":89,"context_line":"        v6_subnet_1 \u003d self.create_subnet(self.network, ip_version\u003d6)"},{"line_number":90,"context_line":"        v6_subnet_2 \u003d self.create_subnet(self.network, ip_version\u003d6)"},{"line_number":91,"context_line":"        v6_interface_1 \u003d self.create_router_interface("}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_cf927ff6","line":88,"in_reply_to":"9aed3d3a_00ddcd6e","updated":"2016-03-04 23:52:44.000000000","message":"Done","commit_id":"0e83574fc3bae3364777bf35a1d9a5d8b8ccb6b5"}],"tempest/api/network/test_routers.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0d13cae6edbdcb5cc1c71c150cf028b6d99f3597","unresolved":false,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    @test.attr(type\u003d\u0027smoke\u0027)"},{"line_number":342,"context_line":"    @test.idempotent_id(\u0027802c73c9-c937-4cef-824b-2191e24a6aab\u0027)"},{"line_number":343,"context_line":"    def test_add_multiple_router_interfaces(self):"},{"line_number":344,"context_line":"        network01 \u003d self.create_network("},{"line_number":345,"context_line":"            network_name\u003ddata_utils.rand_name(\u0027router-network01-\u0027))"},{"line_number":346,"context_line":"        network02 \u003d self.create_network("}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_bec0d02b","line":343,"updated":"2016-03-08 10:19:51.000000000","message":"Here","commit_id":"43fe157d8b59d87a0259f870d9afac85fb345aa4"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0d13cae6edbdcb5cc1c71c150cf028b6d99f3597","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        cls.network \u003d cls.create_network()"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    @test.idempotent_id(\u002702295b0f-290b-438b-965e-596c61530861\u0027)"},{"line_number":405,"context_line":"    def test_router_with_multiple_ipv4_subnets(self):"},{"line_number":406,"context_line":"        router \u003d self._create_router(data_utils.rand_name(\u0027router-\u0027))"},{"line_number":407,"context_line":"        subnet01 \u003d self.create_subnet(self.network, ip_version\u003d4)"},{"line_number":408,"context_line":"        subnet02 \u003d self.create_subnet(self.network, ip_version\u003d4)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_9ecb5453","line":405,"updated":"2016-03-08 10:19:51.000000000","message":"This looks like a duplicate of \"test_add_multiple_router_interfaces\"","commit_id":"43fe157d8b59d87a0259f870d9afac85fb345aa4"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"f136768d2388b34ef6f872b9995e531cc4280d73","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        cls.network \u003d cls.create_network()"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    @test.idempotent_id(\u002702295b0f-290b-438b-965e-596c61530861\u0027)"},{"line_number":405,"context_line":"    def test_router_with_multiple_ipv4_subnets(self):"},{"line_number":406,"context_line":"        router \u003d self._create_router(data_utils.rand_name(\u0027router-\u0027))"},{"line_number":407,"context_line":"        subnet01 \u003d self.create_subnet(self.network, ip_version\u003d4)"},{"line_number":408,"context_line":"        subnet02 \u003d self.create_subnet(self.network, ip_version\u003d4)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3afc51ec_4d63f0dc","line":405,"in_reply_to":"5aef4532_9ecb5453","updated":"2016-03-13 19:17:17.000000000","message":"The first difference is, this test creates one network with two subnets and other test create two networks and two subnets.\n\nother difference is in IPV6 test, when using one network with two subnets, it only creates 1 neutron port with multiple/two IPs.","commit_id":"43fe157d8b59d87a0259f870d9afac85fb345aa4"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"0d13cae6edbdcb5cc1c71c150cf028b6d99f3597","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        self._verify_add_interface(interfac02)"},{"line_number":431,"context_line":"        self.assertEqual(interfac01[\u0027port_id\u0027], interfac02[\u0027port_id\u0027])"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def _verify_add_interface(self, interface):"},{"line_number":434,"context_line":"        self.assertIn(\u0027port_id\u0027, interface)"},{"line_number":435,"context_line":"        self.assertIn(\u0027subnet_id\u0027, interface)"},{"line_number":436,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5aef4532_5e36ec52","line":433,"updated":"2016-03-08 10:19:51.000000000","message":"You should use _verify_router_interface (and possibly enhancing it) instead of a new method.","commit_id":"43fe157d8b59d87a0259f870d9afac85fb345aa4"},{"author":{"_account_id":15739,"name":"Hardik Italia","email":"hardik.italia@suse.com","username":"hitalia"},"change_message_id":"f136768d2388b34ef6f872b9995e531cc4280d73","unresolved":false,"context_lines":[{"line_number":430,"context_line":"        self._verify_add_interface(interfac02)"},{"line_number":431,"context_line":"        self.assertEqual(interfac01[\u0027port_id\u0027], interfac02[\u0027port_id\u0027])"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def _verify_add_interface(self, interface):"},{"line_number":434,"context_line":"        self.assertIn(\u0027port_id\u0027, interface)"},{"line_number":435,"context_line":"        self.assertIn(\u0027subnet_id\u0027, interface)"},{"line_number":436,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3afc51ec_ed93dca1","line":433,"in_reply_to":"5aef4532_5e36ec52","updated":"2016-03-13 19:17:17.000000000","message":"I initially tried that by just adding these tests under RoutersTest class (So no need to create separate class) but the problem is that when we run all the tests (test_routers.py) it exceeds default subnet quota (Individual test pass) as \"test_router_with_multiple_ipv4_subnets\" \u0026 \"test_router_with_multiple_ipv6_subnets\" create one more subnet than the network during run. (I do not know the solution unless we modify quota limit during run)\n\nI can add more validation under _verify_add_interface to check that network_id attribute is same for the ports.","commit_id":"43fe157d8b59d87a0259f870d9afac85fb345aa4"}]}
