)]}'
{"neutron/agent/l3/extensions/qos/fip.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f735e88adac2214c0bcc583c33ddb806ed9ba0b8","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            self.fip_qos_map.update_policy(qos_policy)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _remove_fip_rate_limit_cache(self, fip):"},{"line_number":102,"context_line":"        for direction in constants.VALID_DIRECTIONS:"},{"line_number":103,"context_line":"            rate_limits_direction \u003d direction + \"_ratelimits\""},{"line_number":104,"context_line":"            rate_limits \u003d getattr(self.fip_qos_map,"},{"line_number":105,"context_line":"                                  rate_limits_direction, {})"},{"line_number":106,"context_line":"            rate_limits.pop(fip, None)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _process_reset_fip(self, fip):"},{"line_number":109,"context_line":"        self.fip_qos_map.clean_by_resource(fip)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_a54d7e73","line":106,"range":{"start_line":102,"start_character":8,"end_line":106,"end_character":38},"updated":"2019-05-07 15:51:18.000000000","message":"Why don\u0027t you implement this function in \"RouterFipRateLimitMaps\". Something like:\n\n  def delete_ratelimit(fip, direction):\n     if direction \u003d None: --\u003e delete both\n     else: --\u003e \n       direction + \"_ratelimits\"\n       getattr(self.fip_qos_map, rate_limits_direction, {})","commit_id":"e9980a235e02f05516ce83ef62ad381a5b2ec8ff"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0652b1566c9d7e002985ee700c361c8e4de58d8e","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            self.fip_qos_map.update_policy(qos_policy)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _remove_fip_rate_limit_cache(self, fip):"},{"line_number":102,"context_line":"        for direction in constants.VALID_DIRECTIONS:"},{"line_number":103,"context_line":"            rate_limits_direction \u003d direction + \"_ratelimits\""},{"line_number":104,"context_line":"            rate_limits \u003d getattr(self.fip_qos_map,"},{"line_number":105,"context_line":"                                  rate_limits_direction, {})"},{"line_number":106,"context_line":"            rate_limits.pop(fip, None)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _process_reset_fip(self, fip):"},{"line_number":109,"context_line":"        self.fip_qos_map.clean_by_resource(fip)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_696518e1","line":106,"range":{"start_line":102,"start_character":8,"end_line":106,"end_character":38},"in_reply_to":"dfbec78f_693758e5","updated":"2019-05-08 01:05:54.000000000","message":"I will rebase this patch on that.","commit_id":"e9980a235e02f05516ce83ef62ad381a5b2ec8ff"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"064f62ce9ba4245defe9984effa9b7bbb95d4069","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            self.fip_qos_map.update_policy(qos_policy)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _remove_fip_rate_limit_cache(self, fip):"},{"line_number":102,"context_line":"        for direction in constants.VALID_DIRECTIONS:"},{"line_number":103,"context_line":"            rate_limits_direction \u003d direction + \"_ratelimits\""},{"line_number":104,"context_line":"            rate_limits \u003d getattr(self.fip_qos_map,"},{"line_number":105,"context_line":"                                  rate_limits_direction, {})"},{"line_number":106,"context_line":"            rate_limits.pop(fip, None)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _process_reset_fip(self, fip):"},{"line_number":109,"context_line":"        self.fip_qos_map.clean_by_resource(fip)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_693758e5","line":106,"range":{"start_line":102,"start_character":8,"end_line":106,"end_character":38},"in_reply_to":"dfbec78f_a54d7e73","updated":"2019-05-08 01:03:16.000000000","message":"Yes, it is done in that \"Minimizing lock\" patch:\nhttps://review.opendev.org/#/c/656163/6/neutron/agent/l3/extensions/qos/fip.py\n\nAnd because we want a very small access of lock, then the functions are all set to have only one action to prevent dead lock or loop lock.","commit_id":"e9980a235e02f05516ce83ef62ad381a5b2ec8ff"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f735e88adac2214c0bcc583c33ddb806ed9ba0b8","unresolved":false,"context_lines":[{"line_number":300,"context_line":"            self.process_floating_ip_addresses(context, router_info)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def _clean_router_all_fip_cache(self, router_id):"},{"line_number":303,"context_line":"        floating_ips \u003d self.fip_qos_map.router_floating_ips.pop("},{"line_number":304,"context_line":"            router_id, [])"},{"line_number":305,"context_line":"        for fip in floating_ips:"},{"line_number":306,"context_line":"            self._remove_fip_rate_limit_cache(fip)"},{"line_number":307,"context_line":"            self._process_reset_fip(fip)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def delete_router(self, context, data):"},{"line_number":310,"context_line":"        self._clean_router_all_fip_cache(data[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_45aa82d2","line":307,"range":{"start_line":303,"start_character":7,"end_line":307,"end_character":40},"updated":"2019-05-07 15:51:18.000000000","message":"This should be implemented entirely in RouterFipRateLimitMaps. This class should have a call to clean-by-routerid cache. That\u0027s why you implemented RouterFipRateLimitMaps first, to have this info in this class object.","commit_id":"e9980a235e02f05516ce83ef62ad381a5b2ec8ff"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1440d643c80e769ead88dcb502a3f4795dab7d93","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            self.process_floating_ip_addresses(context, router_info)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _clean_router_all_fip_cache(self, router_id):"},{"line_number":344,"context_line":"        floating_ips \u003d self.fip_qos_map.router_floating_ips.pop("},{"line_number":345,"context_line":"            router_id, [])"},{"line_number":346,"context_line":"        for fip in floating_ips:"},{"line_number":347,"context_line":"            self._remove_fip_rate_limit_cache(fip)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_06af4b2a","line":344,"updated":"2019-08-01 14:41:32.000000000","message":"I not a fan of handling externally class members. \"RouterFipRateLimitMaps\" should implement a method to:\n- remove the router from \"router_floating_ips\"\n- remove the rate limits\n- remove the qos","commit_id":"b8ee0395e22c08bb4e6543775214f4c3bd4ff0bd"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2c55f43a50b31f72537486d79fcaacad69fa83bb","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            self.process_floating_ip_addresses(context, router_info)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _clean_router_all_fip_cache(self, router_id):"},{"line_number":344,"context_line":"        floating_ips \u003d self.fip_qos_map.router_floating_ips.pop("},{"line_number":345,"context_line":"            router_id, [])"},{"line_number":346,"context_line":"        for fip in floating_ips:"},{"line_number":347,"context_line":"            self._remove_fip_rate_limit_cache(fip)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_16d17a23","line":344,"in_reply_to":"7faddb67_06af4b2a","updated":"2019-08-06 15:12:30.000000000","message":"Done","commit_id":"b8ee0395e22c08bb4e6543775214f4c3bd4ff0bd"}],"neutron/tests/fullstack/resources/config.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1440d643c80e769ead88dcb502a3f4795dab7d93","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                \u0027availability_zone\u0027: host_desc.availability_zone"},{"line_number":388,"context_line":"            })"},{"line_number":389,"context_line":"        if host_desc.l3_agent_extensions:"},{"line_number":390,"context_line":"            agent \u003d self.config.get(\u0027agent\u0027, {})"},{"line_number":391,"context_line":"            agent.update({"},{"line_number":392,"context_line":"                \u0027extensions\u0027: host_desc.l3_agent_extensions"},{"line_number":393,"context_line":"            })"},{"line_number":394,"context_line":"            self.config[\u0027agent\u0027] \u003d agent"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _prepare_config_with_ovs_agent(self, integration_bridge):"},{"line_number":397,"context_line":"        self.config.update({"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_86f57b59","line":394,"range":{"start_line":390,"start_character":0,"end_line":394,"end_character":40},"updated":"2019-08-01 14:41:32.000000000","message":"This can be done in one line:\n\nself.config[\u0027agent\u0027].update({\u0027extensions\u0027: host_desc.l3_agent_extensions})","commit_id":"b8ee0395e22c08bb4e6543775214f4c3bd4ff0bd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4eea237a1126855cb2d200ba84ab94711385c941","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                \u0027availability_zone\u0027: host_desc.availability_zone"},{"line_number":388,"context_line":"            })"},{"line_number":389,"context_line":"        if host_desc.l3_agent_extensions:"},{"line_number":390,"context_line":"            agent \u003d self.config.get(\u0027agent\u0027, {})"},{"line_number":391,"context_line":"            agent.update({"},{"line_number":392,"context_line":"                \u0027extensions\u0027: host_desc.l3_agent_extensions"},{"line_number":393,"context_line":"            })"},{"line_number":394,"context_line":"            self.config[\u0027agent\u0027] \u003d agent"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _prepare_config_with_ovs_agent(self, integration_bridge):"},{"line_number":397,"context_line":"        self.config.update({"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_6c8108fb","line":394,"range":{"start_line":390,"start_character":0,"end_line":394,"end_character":40},"in_reply_to":"7faddb67_4895513f","updated":"2019-08-06 08:03:46.000000000","message":"Please, rebase to latest version. I95f024684c864aa75506b08a5f904a55267d09a8 introduces \u0027agent\u0027 in config.","commit_id":"b8ee0395e22c08bb4e6543775214f4c3bd4ff0bd"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2c55f43a50b31f72537486d79fcaacad69fa83bb","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                \u0027availability_zone\u0027: host_desc.availability_zone"},{"line_number":388,"context_line":"            })"},{"line_number":389,"context_line":"        if host_desc.l3_agent_extensions:"},{"line_number":390,"context_line":"            agent \u003d self.config.get(\u0027agent\u0027, {})"},{"line_number":391,"context_line":"            agent.update({"},{"line_number":392,"context_line":"                \u0027extensions\u0027: host_desc.l3_agent_extensions"},{"line_number":393,"context_line":"            })"},{"line_number":394,"context_line":"            self.config[\u0027agent\u0027] \u003d agent"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _prepare_config_with_ovs_agent(self, integration_bridge):"},{"line_number":397,"context_line":"        self.config.update({"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_f6c13e4f","line":394,"range":{"start_line":390,"start_character":0,"end_line":394,"end_character":40},"in_reply_to":"7faddb67_6c8108fb","updated":"2019-08-06 15:12:30.000000000","message":"Done","commit_id":"b8ee0395e22c08bb4e6543775214f4c3bd4ff0bd"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2d508d3128a4351dbf7816b3b8f3bbd96f073a47","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                \u0027availability_zone\u0027: host_desc.availability_zone"},{"line_number":388,"context_line":"            })"},{"line_number":389,"context_line":"        if host_desc.l3_agent_extensions:"},{"line_number":390,"context_line":"            agent \u003d self.config.get(\u0027agent\u0027, {})"},{"line_number":391,"context_line":"            agent.update({"},{"line_number":392,"context_line":"                \u0027extensions\u0027: host_desc.l3_agent_extensions"},{"line_number":393,"context_line":"            })"},{"line_number":394,"context_line":"            self.config[\u0027agent\u0027] \u003d agent"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    def _prepare_config_with_ovs_agent(self, integration_bridge):"},{"line_number":397,"context_line":"        self.config.update({"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_4895513f","line":394,"range":{"start_line":390,"start_character":0,"end_line":394,"end_character":40},"in_reply_to":"7faddb67_86f57b59","updated":"2019-08-01 15:06:41.000000000","message":"No, the self.config may not have key of \u0027agent\u0027, then got exception: \" None type does not have update method\".","commit_id":"b8ee0395e22c08bb4e6543775214f4c3bd4ff0bd"}],"neutron/tests/fullstack/test_l3_agent.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2226a4cac678f442f4edd9af9608566bd03a96f8","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        # ping floating ip from external vm"},{"line_number":146,"context_line":"        external_vm.block_until_ping(fip[\u0027floating_ip_address\u0027])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.safe_client.update_router(router[\u0027id\u0027], admin_state_up\u003dFalse)"},{"line_number":149,"context_line":"        external_vm.block_until_no_ping(fip[\u0027floating_ip_address\u0027])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        self.safe_client.update_router(router[\u0027id\u0027], admin_state_up\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_168b3d1f","line":148,"updated":"2019-05-23 06:55:29.000000000","message":"maybe I misunderstood something about this patch but shouldn\u0027t You also check that qos isn\u0027t configured after router is set to false?","commit_id":"b5c3fdfa85444b8a69d87206f2be9b9da46dd447"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a3269f15d0fd687b45e39abb1ea0155a31f33061","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        # ping floating ip from external vm"},{"line_number":146,"context_line":"        external_vm.block_until_ping(fip[\u0027floating_ip_address\u0027])"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        self.safe_client.update_router(router[\u0027id\u0027], admin_state_up\u003dFalse)"},{"line_number":149,"context_line":"        external_vm.block_until_no_ping(fip[\u0027floating_ip_address\u0027])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        self.safe_client.update_router(router[\u0027id\u0027], admin_state_up\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_2cedd424","line":148,"in_reply_to":"bfb3d3c7_168b3d1f","updated":"2019-05-23 08:29:00.000000000","message":"namespace will be removed...","commit_id":"b5c3fdfa85444b8a69d87206f2be9b9da46dd447"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2226a4cac678f442f4edd9af9608566bd03a96f8","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            interface_name,"},{"line_number":163,"context_line":"            namespace\u003dqrouter_ns)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":166,"context_line":"            constants.INGRESS_DIRECTION)"},{"line_number":167,"context_line":"        self.assertEqual(1, len(filter_ids))"},{"line_number":168,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":169,"context_line":"            constants.EGRESS_DIRECTION)"},{"line_number":170,"context_line":"        self.assertEqual(1, len(filter_ids))"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class TestLegacyL3Agent(TestL3Agent):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_d684c50e","line":170,"range":{"start_line":165,"start_character":8,"end_line":170,"end_character":44},"updated":"2019-05-23 06:55:29.000000000","message":"maybe You can move this to separate function and run it inside wait_until_true() to avoid potential race conditions","commit_id":"b5c3fdfa85444b8a69d87206f2be9b9da46dd447"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"f39063f380413476116d0474f54644f08c5a0ea3","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            interface_name,"},{"line_number":163,"context_line":"            namespace\u003dqrouter_ns)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":166,"context_line":"            constants.INGRESS_DIRECTION)"},{"line_number":167,"context_line":"        self.assertEqual(1, len(filter_ids))"},{"line_number":168,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":169,"context_line":"            constants.EGRESS_DIRECTION)"},{"line_number":170,"context_line":"        self.assertEqual(1, len(filter_ids))"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class TestLegacyL3Agent(TestL3Agent):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_fd73e4af","line":170,"range":{"start_line":165,"start_character":8,"end_line":170,"end_character":44},"in_reply_to":"bfb3d3c7_d684c50e","updated":"2019-05-23 10:26:41.000000000","message":"Done","commit_id":"b5c3fdfa85444b8a69d87206f2be9b9da46dd447"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a3269f15d0fd687b45e39abb1ea0155a31f33061","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            interface_name,"},{"line_number":163,"context_line":"            namespace\u003dqrouter_ns)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":166,"context_line":"            constants.INGRESS_DIRECTION)"},{"line_number":167,"context_line":"        self.assertEqual(1, len(filter_ids))"},{"line_number":168,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":169,"context_line":"            constants.EGRESS_DIRECTION)"},{"line_number":170,"context_line":"        self.assertEqual(1, len(filter_ids))"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class TestLegacyL3Agent(TestL3Agent):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_8cdde071","line":170,"range":{"start_line":165,"start_character":8,"end_line":170,"end_character":44},"in_reply_to":"bfb3d3c7_d684c50e","updated":"2019-05-23 08:29:00.000000000","message":"OK","commit_id":"b5c3fdfa85444b8a69d87206f2be9b9da46dd447"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2226a4cac678f442f4edd9af9608566bd03a96f8","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            for _ in range(2)]"},{"line_number":326,"context_line":"        env \u003d environment.Environment("},{"line_number":327,"context_line":"            environment.EnvironmentDescription("},{"line_number":328,"context_line":"                network_type\u003d\u0027vlan\u0027, l2_pop\u003dTrue),"},{"line_number":329,"context_line":"            host_descriptions)"},{"line_number":330,"context_line":"        super(TestHAL3Agent, self).setUp(env)"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_b6903150","line":328,"updated":"2019-05-23 06:55:29.000000000","message":"You need to have \"qos\u003dTrue\" here (and in class above) to configure qos service plugin properly for the test.","commit_id":"b5c3fdfa85444b8a69d87206f2be9b9da46dd447"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a3269f15d0fd687b45e39abb1ea0155a31f33061","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            for _ in range(2)]"},{"line_number":326,"context_line":"        env \u003d environment.Environment("},{"line_number":327,"context_line":"            environment.EnvironmentDescription("},{"line_number":328,"context_line":"                network_type\u003d\u0027vlan\u0027, l2_pop\u003dTrue),"},{"line_number":329,"context_line":"            host_descriptions)"},{"line_number":330,"context_line":"        super(TestHAL3Agent, self).setUp(env)"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_acd8e47e","line":328,"in_reply_to":"bfb3d3c7_b6903150","updated":"2019-05-23 08:29:00.000000000","message":"Yes, I\u0027m testing it now.","commit_id":"b5c3fdfa85444b8a69d87206f2be9b9da46dd447"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1aed859c1f1e33e611c325ce59198bc401c7557c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            agents_hosting_router \u003d self.client.list_l3_agent_hosting_routers("},{"line_number":166,"context_line":"                router[\u0027id\u0027])[\u0027agents\u0027]"},{"line_number":167,"context_line":"            l3_agents \u003d [host.agents[\u0027l3\u0027] for host in self.environment.hosts]"},{"line_number":168,"context_line":"            for host_agent in agents_hosting_router:"},{"line_number":169,"context_line":"                for l3_agent in l3_agents:"},{"line_number":170,"context_line":"                    if (host_agent[\u0027host\u0027] \u003d\u003d"},{"line_number":171,"context_line":"                            l3_agent.neutron_cfg_fixture.get_host()):"},{"line_number":172,"context_line":"                        qrouter_ns \u003d self._get_namespace("},{"line_number":173,"context_line":"                            router[\u0027id\u0027],"},{"line_number":174,"context_line":"                            l3_agent)"},{"line_number":175,"context_line":"                        break"},{"line_number":176,"context_line":"        else:"},{"line_number":177,"context_line":"            qrouter_ns \u003d self._get_namespace(router[\u0027id\u0027])"},{"line_number":178,"context_line":"        ip \u003d ip_lib.IPWrapper(qrouter_ns)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_517adff0","line":175,"range":{"start_line":168,"start_character":12,"end_line":175,"end_character":29},"updated":"2019-05-28 10:17:31.000000000","message":"maybe You can reuse (with some small modifications) method \"_get_l3_agents_with_ha_state()\" which is implemented below in this file?","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"98bf734c5a061185067656a89425054c06b3c53e","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            agents_hosting_router \u003d self.client.list_l3_agent_hosting_routers("},{"line_number":166,"context_line":"                router[\u0027id\u0027])[\u0027agents\u0027]"},{"line_number":167,"context_line":"            l3_agents \u003d [host.agents[\u0027l3\u0027] for host in self.environment.hosts]"},{"line_number":168,"context_line":"            for host_agent in agents_hosting_router:"},{"line_number":169,"context_line":"                for l3_agent in l3_agents:"},{"line_number":170,"context_line":"                    if (host_agent[\u0027host\u0027] \u003d\u003d"},{"line_number":171,"context_line":"                            l3_agent.neutron_cfg_fixture.get_host()):"},{"line_number":172,"context_line":"                        qrouter_ns \u003d self._get_namespace("},{"line_number":173,"context_line":"                            router[\u0027id\u0027],"},{"line_number":174,"context_line":"                            l3_agent)"},{"line_number":175,"context_line":"                        break"},{"line_number":176,"context_line":"        else:"},{"line_number":177,"context_line":"            qrouter_ns \u003d self._get_namespace(router[\u0027id\u0027])"},{"line_number":178,"context_line":"        ip \u003d ip_lib.IPWrapper(qrouter_ns)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_6f9cdebf","line":175,"range":{"start_line":168,"start_character":12,"end_line":175,"end_character":29},"in_reply_to":"bfb3d3c7_517adff0","updated":"2019-05-28 12:20:47.000000000","message":"No, here does not care about the HA router status. Any HA router scheduled host can be used to verify the test. I noticed that function, but I did not use it because if we call it with a HA status it will make reviewers feel confusing, why check such status only? Why not some status else? So here, just get the first scheduled host for us to verify.","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2622fde74a56dcbb21bdf2349ae18220b66b649b","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            agents_hosting_router \u003d self.client.list_l3_agent_hosting_routers("},{"line_number":166,"context_line":"                router[\u0027id\u0027])[\u0027agents\u0027]"},{"line_number":167,"context_line":"            l3_agents \u003d [host.agents[\u0027l3\u0027] for host in self.environment.hosts]"},{"line_number":168,"context_line":"            for host_agent in agents_hosting_router:"},{"line_number":169,"context_line":"                for l3_agent in l3_agents:"},{"line_number":170,"context_line":"                    if (host_agent[\u0027host\u0027] \u003d\u003d"},{"line_number":171,"context_line":"                            l3_agent.neutron_cfg_fixture.get_host()):"},{"line_number":172,"context_line":"                        qrouter_ns \u003d self._get_namespace("},{"line_number":173,"context_line":"                            router[\u0027id\u0027],"},{"line_number":174,"context_line":"                            l3_agent)"},{"line_number":175,"context_line":"                        break"},{"line_number":176,"context_line":"        else:"},{"line_number":177,"context_line":"            qrouter_ns \u003d self._get_namespace(router[\u0027id\u0027])"},{"line_number":178,"context_line":"        ip \u003d ip_lib.IPWrapper(qrouter_ns)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fb8cfa7_58b5a530","line":175,"range":{"start_line":168,"start_character":12,"end_line":175,"end_character":29},"in_reply_to":"bfb3d3c7_6f9cdebf","updated":"2019-06-04 07:03:56.000000000","message":"That\u0027s why I wrote \"with some small modifications\" in my previous comment ;)","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1aed859c1f1e33e611c325ce59198bc401c7557c","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        devices \u003d ip.get_devices()"},{"line_number":182,"context_line":"        for dev in devices:"},{"line_number":183,"context_line":"            if dev.name.startswith(\"qg-\"):"},{"line_number":184,"context_line":"                interface_name \u003d dev.name"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        tc_wrapper \u003d l3_tc_lib.FloatingIPTcCommand("},{"line_number":187,"context_line":"            interface_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_71e363da","line":184,"range":{"start_line":184,"start_character":16,"end_line":184,"end_character":30},"updated":"2019-05-28 10:17:31.000000000","message":"can\u0027t You find interface_name from router object?","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"98bf734c5a061185067656a89425054c06b3c53e","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        devices \u003d ip.get_devices()"},{"line_number":182,"context_line":"        for dev in devices:"},{"line_number":183,"context_line":"            if dev.name.startswith(\"qg-\"):"},{"line_number":184,"context_line":"                interface_name \u003d dev.name"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        tc_wrapper \u003d l3_tc_lib.FloatingIPTcCommand("},{"line_number":187,"context_line":"            interface_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_af8e5676","line":184,"range":{"start_line":184,"start_character":16,"end_line":184,"end_character":30},"in_reply_to":"bfb3d3c7_71e363da","updated":"2019-05-28 12:20:47.000000000","message":"This once blocked me from the testing because the interface name is not generated according to our actual code logic. It will be something like \u0027qg-abcefghi_jk\u0027, it has a underline in it. Actually I prefer line 114, get the gateway port, and construct device name. But, the current code may give us a chance to verify that the device is really installed.","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1aed859c1f1e33e611c325ce59198bc401c7557c","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    def _wait_until_filter_set(self, tc_wrapper):"},{"line_number":196,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":197,"context_line":"            constants.INGRESS_DIRECTION)"},{"line_number":198,"context_line":"        in_ids \u003d (not filter_ids) or (1 \u003d\u003d len(filter_ids))"},{"line_number":199,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":200,"context_line":"            constants.EGRESS_DIRECTION)"},{"line_number":201,"context_line":"        e_ids \u003d (not filter_ids) or (1 \u003d\u003d len(filter_ids))"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_d16d6f32","line":198,"updated":"2019-05-28 10:17:31.000000000","message":"You can return False here if \"in_ids \u003d\u003d False\", there is no need to check e_ids in such case","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"98bf734c5a061185067656a89425054c06b3c53e","unresolved":false,"context_lines":[{"line_number":195,"context_line":"    def _wait_until_filter_set(self, tc_wrapper):"},{"line_number":196,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":197,"context_line":"            constants.INGRESS_DIRECTION)"},{"line_number":198,"context_line":"        in_ids \u003d (not filter_ids) or (1 \u003d\u003d len(filter_ids))"},{"line_number":199,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":200,"context_line":"            constants.EGRESS_DIRECTION)"},{"line_number":201,"context_line":"        e_ids \u003d (not filter_ids) or (1 \u003d\u003d len(filter_ids))"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_efcc4e6b","line":198,"in_reply_to":"bfb3d3c7_d16d6f32","updated":"2019-05-28 12:20:47.000000000","message":"get_existing_filter_ids does not cost too much, : )","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1aed859c1f1e33e611c325ce59198bc401c7557c","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":200,"context_line":"            constants.EGRESS_DIRECTION)"},{"line_number":201,"context_line":"        e_ids \u003d (not filter_ids) or (1 \u003d\u003d len(filter_ids))"},{"line_number":202,"context_line":"        return in_ids and e_ids"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"class TestLegacyL3Agent(TestL3Agent):"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_71cda32f","line":202,"updated":"2019-05-28 10:17:31.000000000","message":"maybe something like:\n\n    def _wait_until_filter_set(self, tc_wrapper):\n\n        def _filters_set(direction):\n            filter_ids \u003d tc_wrapper.get_existing_filter_ids(direction)\n            return (not filter_ids) or (1 \u003d\u003d len(filter_ids))\n\n        return (_filters_set(constants.INGRESS_DIRECTION) and\n                    _filters_set(constants.EGRESS_DIRECTION))","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"9fae1c020e53636e266b09e39c2837fef031cde0","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        filter_ids \u003d tc_wrapper.get_existing_filter_ids("},{"line_number":200,"context_line":"            constants.EGRESS_DIRECTION)"},{"line_number":201,"context_line":"        e_ids \u003d (not filter_ids) or (1 \u003d\u003d len(filter_ids))"},{"line_number":202,"context_line":"        return in_ids and e_ids"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"class TestLegacyL3Agent(TestL3Agent):"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_c7583589","line":202,"in_reply_to":"bfb3d3c7_71cda32f","updated":"2019-05-29 16:01:53.000000000","message":"Done","commit_id":"23fe1b77561500d42abc9b1c5475ec278015ab88"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"135c5be0d03a70da166e724c9bcdcad8f9d0f082","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            agent_host \u003d agent.neutron_cfg_fixture.get_host()"},{"line_number":134,"context_line":"            for agent_hosting_router in agents_hosting_router:"},{"line_number":135,"context_line":"                if (agent_hosting_router[\u0027host\u0027] \u003d\u003d agent_host and"},{"line_number":136,"context_line":"                        ((ha_state is None) or (ha_state is not None and"},{"line_number":137,"context_line":"                             agent_hosting_router[\u0027ha_state\u0027] \u003d\u003d ha_state))):"},{"line_number":138,"context_line":"                    found_agents.append(agent)"},{"line_number":139,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_f3195721","line":136,"range":{"start_line":136,"start_character":48,"end_line":136,"end_character":72},"updated":"2019-06-14 13:53:07.000000000","message":"this is not needed","commit_id":"6f12cac165afac17136a99774156cfc762898c96"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ae66d0b0bf3aac139c9b12c1ca0483ac39fd3d3e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            agent_host \u003d agent.neutron_cfg_fixture.get_host()"},{"line_number":134,"context_line":"            for agent_hosting_router in agents_hosting_router:"},{"line_number":135,"context_line":"                if (agent_hosting_router[\u0027host\u0027] \u003d\u003d agent_host and"},{"line_number":136,"context_line":"                        ((ha_state is None) or (ha_state is not None and"},{"line_number":137,"context_line":"                             agent_hosting_router[\u0027ha_state\u0027] \u003d\u003d ha_state))):"},{"line_number":138,"context_line":"                    found_agents.append(agent)"},{"line_number":139,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_aaa58f49","line":136,"range":{"start_line":136,"start_character":48,"end_line":136,"end_character":72},"in_reply_to":"9fb8cfa7_f3195721","updated":"2019-07-02 15:15:44.000000000","message":"Done","commit_id":"6f12cac165afac17136a99774156cfc762898c96"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"64b280c1a163295b9ca2c5b69e1d06f23107d70b","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            suffix \u003d agent.get_namespace_suffix()"},{"line_number":123,"context_line":"        else:"},{"line_number":124,"context_line":"            suffix \u003d self.environment.hosts[0].l3_agent.get_namespace_suffix()"},{"line_number":125,"context_line":"        test_namespace \u003d \"%s@%s\" % (namespace, suffix)"},{"line_number":126,"context_line":"        return test_namespace"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _get_l3_agents_with_ha_state("}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_0edee8d9","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":24},"updated":"2019-08-12 09:00:03.000000000","message":"nitty nity: here You could simply do \"return\" and safe one line :)","commit_id":"cf783d42b1d28da63dd6868ee42200b45968440f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"00a29caf8e1128eebafb8e762d2791921e8c8b6a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            suffix \u003d agent.get_namespace_suffix()"},{"line_number":123,"context_line":"        else:"},{"line_number":124,"context_line":"            suffix \u003d self.environment.hosts[0].l3_agent.get_namespace_suffix()"},{"line_number":125,"context_line":"        test_namespace \u003d \"%s@%s\" % (namespace, suffix)"},{"line_number":126,"context_line":"        return test_namespace"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _get_l3_agents_with_ha_state("}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_24a607c2","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":24},"in_reply_to":"7faddb67_0edee8d9","updated":"2019-08-16 15:36:50.000000000","message":"Done","commit_id":"cf783d42b1d28da63dd6868ee42200b45968440f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"64b280c1a163295b9ca2c5b69e1d06f23107d70b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                tc_wrapper),"},{"line_number":204,"context_line":"            timeout\u003d60)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _wait_until_filter_set(self, tc_wrapper):"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        def _is_filter_set(direction):"},{"line_number":209,"context_line":"            filter_ids \u003d tc_wrapper.get_existing_filter_ids("}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_ee902cf0","line":206,"range":{"start_line":206,"start_character":20,"end_line":206,"end_character":26},"updated":"2019-08-12 09:00:03.000000000","message":"nitty nit: filters","commit_id":"cf783d42b1d28da63dd6868ee42200b45968440f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"00a29caf8e1128eebafb8e762d2791921e8c8b6a","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                tc_wrapper),"},{"line_number":204,"context_line":"            timeout\u003d60)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _wait_until_filter_set(self, tc_wrapper):"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        def _is_filter_set(direction):"},{"line_number":209,"context_line":"            filter_ids \u003d tc_wrapper.get_existing_filter_ids("}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_64a07fa6","line":206,"range":{"start_line":206,"start_character":20,"end_line":206,"end_character":26},"in_reply_to":"7faddb67_ee902cf0","updated":"2019-08-16 15:36:50.000000000","message":"Done","commit_id":"cf783d42b1d28da63dd6868ee42200b45968440f"}]}
