)]}'
{"neutron/agent/l3/extensions/l3_ip_metering.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                                  \u0027pkts\u0027: 0,"},{"line_number":149,"context_line":"                                                  \u0027time\u0027: 0,"},{"line_number":150,"context_line":"                                                  \u0027first_update\u0027: ts,"},{"line_number":151,"context_line":"                                                  \u0027last_update\u0027: ts})"},{"line_number":152,"context_line":"        info[\u0027bytes\u0027] \u003d bytes"},{"line_number":153,"context_line":"        info[\u0027pkts\u0027] \u003d pkts"},{"line_number":154,"context_line":"        info[\u0027time\u0027] +\u003d ts - info[\u0027last_update\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_0efd9607","line":151,"updated":"2019-08-09 20:00:05.000000000","message":"For completeness should this have \u0027tenant_id\u0027 as well?  Then you wouldn\u0027t need it at L156","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                                  \u0027pkts\u0027: 0,"},{"line_number":149,"context_line":"                                                  \u0027time\u0027: 0,"},{"line_number":150,"context_line":"                                                  \u0027first_update\u0027: ts,"},{"line_number":151,"context_line":"                                                  \u0027last_update\u0027: ts})"},{"line_number":152,"context_line":"        info[\u0027bytes\u0027] \u003d bytes"},{"line_number":153,"context_line":"        info[\u0027pkts\u0027] \u003d pkts"},{"line_number":154,"context_line":"        info[\u0027time\u0027] +\u003d ts - info[\u0027last_update\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_28cf1f58","line":151,"in_reply_to":"7faddb67_0efd9607","updated":"2019-08-12 13:42:36.000000000","message":"Done","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                                                  \u0027first_update\u0027: ts,"},{"line_number":151,"context_line":"                                                  \u0027last_update\u0027: ts})"},{"line_number":152,"context_line":"        info[\u0027bytes\u0027] \u003d bytes"},{"line_number":153,"context_line":"        info[\u0027pkts\u0027] \u003d pkts"},{"line_number":154,"context_line":"        info[\u0027time\u0027] +\u003d ts - info[\u0027last_update\u0027]"},{"line_number":155,"context_line":"        info[\u0027last_update\u0027] \u003d ts"},{"line_number":156,"context_line":"        info[\u0027tenant_id\u0027] \u003d tenant_id"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ce069e1d","line":153,"updated":"2019-08-09 20:00:05.000000000","message":"Should these both be +\u003d ?  Is this additive?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                                                  \u0027first_update\u0027: ts,"},{"line_number":151,"context_line":"                                                  \u0027last_update\u0027: ts})"},{"line_number":152,"context_line":"        info[\u0027bytes\u0027] \u003d bytes"},{"line_number":153,"context_line":"        info[\u0027pkts\u0027] \u003d pkts"},{"line_number":154,"context_line":"        info[\u0027time\u0027] +\u003d ts - info[\u0027last_update\u0027]"},{"line_number":155,"context_line":"        info[\u0027last_update\u0027] \u003d ts"},{"line_number":156,"context_line":"        info[\u0027tenant_id\u0027] \u003d tenant_id"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_28f87f7a","line":153,"in_reply_to":"7faddb67_ce069e1d","updated":"2019-08-12 13:42:36.000000000","message":"No, this should be a new entry for a metering data list.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        if self.conf.agent_mode in (lib_const.L3_AGENT_MODE_DVR,"},{"line_number":179,"context_line":"                                    lib_const.L3_AGENT_MODE_DVR_NO_EXTERNAL):"},{"line_number":180,"context_line":"            # Compute node do not do gateway metering"},{"line_number":181,"context_line":"            return"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        if not self._check_router_can_do_metering(ri):"},{"line_number":184,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_eea7da0a","line":181,"updated":"2019-08-09 20:00:05.000000000","message":"These checks seem to conflict with the two in _check_router_can_do_metering() at L122/126","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"23309b14476620cf016ee406a21f93b718127748","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        if self.conf.agent_mode in (lib_const.L3_AGENT_MODE_DVR,"},{"line_number":179,"context_line":"                                    lib_const.L3_AGENT_MODE_DVR_NO_EXTERNAL):"},{"line_number":180,"context_line":"            # Compute node do not do gateway metering"},{"line_number":181,"context_line":"            return"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        if not self._check_router_can_do_metering(ri):"},{"line_number":184,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_df1f1907","line":181,"in_reply_to":"7faddb67_8842d30e","updated":"2019-08-12 14:15:34.000000000","message":"But look at this line and L122 - there\u0027s no way L122 can ever get triggered.  And how can L126 ever get called either?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        if self.conf.agent_mode in (lib_const.L3_AGENT_MODE_DVR,"},{"line_number":179,"context_line":"                                    lib_const.L3_AGENT_MODE_DVR_NO_EXTERNAL):"},{"line_number":180,"context_line":"            # Compute node do not do gateway metering"},{"line_number":181,"context_line":"            return"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        if not self._check_router_can_do_metering(ri):"},{"line_number":184,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_8842d30e","line":181,"in_reply_to":"7faddb67_eea7da0a","updated":"2019-08-12 13:42:36.000000000","message":"No, this check is for router gateway IPs only.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            return"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        gw_port \u003d ri.get_ex_gw_port()"},{"line_number":187,"context_line":"        if not gw_port or not ri._snat_enabled:"},{"line_number":188,"context_line":"            return"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        interface_name \u003d ri.get_external_device_name("}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ce7bfe78","line":187,"range":{"start_line":187,"start_character":30,"end_line":187,"end_character":46},"updated":"2019-08-09 20:00:05.000000000","message":"What if we are just routing?  If internal and external address scopes are the same there should be stats too.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"23309b14476620cf016ee406a21f93b718127748","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            return"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        gw_port \u003d ri.get_ex_gw_port()"},{"line_number":187,"context_line":"        if not gw_port or not ri._snat_enabled:"},{"line_number":188,"context_line":"            return"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        interface_name \u003d ri.get_external_device_name("}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_9f5201de","line":187,"range":{"start_line":187,"start_character":30,"end_line":187,"end_character":46},"in_reply_to":"7faddb67_48c5bb3c","updated":"2019-08-12 14:15:34.000000000","message":"But you can have an external IP and route without SNAT.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"38e1a9cc80dbb498a37372285cc6a95b060230d7","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            return"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        gw_port \u003d ri.get_ex_gw_port()"},{"line_number":187,"context_line":"        if not gw_port or not ri._snat_enabled:"},{"line_number":188,"context_line":"            return"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        interface_name \u003d ri.get_external_device_name("}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_16580f54","line":187,"range":{"start_line":187,"start_character":30,"end_line":187,"end_character":46},"in_reply_to":"7faddb67_ce7bfe78","updated":"2019-08-14 14:18:27.000000000","message":"Make sense, removed.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            return"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        gw_port \u003d ri.get_ex_gw_port()"},{"line_number":187,"context_line":"        if not gw_port or not ri._snat_enabled:"},{"line_number":188,"context_line":"            return"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        interface_name \u003d ri.get_external_device_name("}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_48c5bb3c","line":187,"range":{"start_line":187,"start_character":30,"end_line":187,"end_character":46},"in_reply_to":"7faddb67_ce7bfe78","updated":"2019-08-12 13:42:36.000000000","message":"Then no SNAT traffic, this metering here is for the router external gateway IP.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        accs \u003d {}"},{"line_number":197,"context_line":"        for ip_addr in gw_port[\u0027fixed_ips\u0027]:"},{"line_number":198,"context_line":"            ex_gw_ip \u003d ip_addr[\u0027ip_address\u0027]"},{"line_number":199,"context_line":"            if netaddr.IPAddress(ex_gw_ip).version \u003d\u003d 4:"},{"line_number":200,"context_line":"                for direction in lib_const.VALID_DIRECTIONS:"},{"line_number":201,"context_line":"                    label_id \u003d self._get_label_id(ex_gw_ip, direction)"},{"line_number":202,"context_line":"                    acc \u003d self._get_traffic_counter(ri,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_2e2bb282","line":199,"range":{"start_line":199,"start_character":54,"end_line":199,"end_character":55},"updated":"2019-08-09 20:00:05.000000000","message":"There\u0027s a constant for this, lib_const.IP_VERSION_4\n\nAnd what about IPv6?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"38e1a9cc80dbb498a37372285cc6a95b060230d7","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        accs \u003d {}"},{"line_number":197,"context_line":"        for ip_addr in gw_port[\u0027fixed_ips\u0027]:"},{"line_number":198,"context_line":"            ex_gw_ip \u003d ip_addr[\u0027ip_address\u0027]"},{"line_number":199,"context_line":"            if netaddr.IPAddress(ex_gw_ip).version \u003d\u003d 4:"},{"line_number":200,"context_line":"                for direction in lib_const.VALID_DIRECTIONS:"},{"line_number":201,"context_line":"                    label_id \u003d self._get_label_id(ex_gw_ip, direction)"},{"line_number":202,"context_line":"                    acc \u003d self._get_traffic_counter(ri,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_f61bf37c","line":199,"range":{"start_line":199,"start_character":54,"end_line":199,"end_character":55},"in_reply_to":"7faddb67_2e2bb282","updated":"2019-08-14 14:18:27.000000000","message":"\u003e There\u0027s a constant for this, lib_const.IP_VERSION_4\n \u003e \n \u003e And what about IPv6?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        accs \u003d {}"},{"line_number":197,"context_line":"        for ip_addr in gw_port[\u0027fixed_ips\u0027]:"},{"line_number":198,"context_line":"            ex_gw_ip \u003d ip_addr[\u0027ip_address\u0027]"},{"line_number":199,"context_line":"            if netaddr.IPAddress(ex_gw_ip).version \u003d\u003d 4:"},{"line_number":200,"context_line":"                for direction in lib_const.VALID_DIRECTIONS:"},{"line_number":201,"context_line":"                    label_id \u003d self._get_label_id(ex_gw_ip, direction)"},{"line_number":202,"context_line":"                    acc \u003d self._get_traffic_counter(ri,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_68e517dc","line":199,"range":{"start_line":199,"start_character":54,"end_line":199,"end_character":55},"in_reply_to":"7faddb67_2e2bb282","updated":"2019-08-12 13:42:36.000000000","message":"There is no ralated TC filter implemented for IPv6, so not support.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f9ac3241e337141fc4308542cd3e2b03757a7d67","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        accs \u003d {}"},{"line_number":197,"context_line":"        for ip_addr in gw_port[\u0027fixed_ips\u0027]:"},{"line_number":198,"context_line":"            ex_gw_ip \u003d ip_addr[\u0027ip_address\u0027]"},{"line_number":199,"context_line":"            if netaddr.IPAddress(ex_gw_ip).version \u003d\u003d 4:"},{"line_number":200,"context_line":"                for direction in lib_const.VALID_DIRECTIONS:"},{"line_number":201,"context_line":"                    label_id \u003d self._get_label_id(ex_gw_ip, direction)"},{"line_number":202,"context_line":"                    acc \u003d self._get_traffic_counter(ri,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_bfec9dbb","line":199,"range":{"start_line":199,"start_character":54,"end_line":199,"end_character":55},"updated":"2019-08-12 14:29:34.000000000","message":"You didn\u0027t change this to the constant :)","commit_id":"97d6ce0c834e569835a2c7503aa9f11ab4e36abd"}],"neutron/agent/l3/extensions/qos/base.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    agent_mode \u003d router_info.agent_conf.agent_mode"},{"line_number":60,"context_line":"    is_distributed_router \u003d router_info.router.get(\u0027distributed\u0027)"},{"line_number":61,"context_line":"    if is_distributed_router and agent_mode \u003d\u003d ("},{"line_number":62,"context_line":"            constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":63,"context_line":"        # DVR edge (or DVR edge ha) router"},{"line_number":64,"context_line":"        if not router_info._is_this_snat_host():"},{"line_number":65,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ae3b22c6","line":62,"updated":"2019-08-09 20:00:05.000000000","message":"nit: parens should be around entire thing like L83","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    agent_mode \u003d router_info.agent_conf.agent_mode"},{"line_number":60,"context_line":"    is_distributed_router \u003d router_info.router.get(\u0027distributed\u0027)"},{"line_number":61,"context_line":"    if is_distributed_router and agent_mode \u003d\u003d ("},{"line_number":62,"context_line":"            constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":63,"context_line":"        # DVR edge (or DVR edge ha) router"},{"line_number":64,"context_line":"        if not router_info._is_this_snat_host():"},{"line_number":65,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_08ed83b6","line":62,"in_reply_to":"7faddb67_ae3b22c6","updated":"2019-08-12 13:42:36.000000000","message":"Done","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"}],"neutron/agent/l3/l3_agent_extensions_manager.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                extension.obj.before_add_router(context, data)"},{"line_number":43,"context_line":"            else:"},{"line_number":44,"context_line":"                LOG.error("},{"line_number":45,"context_line":"                    \"Agent Extension \u0027%(name)s\u0027 does not \""},{"line_number":46,"context_line":"                    \"implement method before_add_router\","},{"line_number":47,"context_line":"                    {\u0027name\u0027: extension.name}"},{"line_number":48,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_cec9beac","line":45,"range":{"start_line":45,"start_character":21,"end_line":45,"end_character":26},"updated":"2019-08-09 20:00:05.000000000","message":"s/L3 Agent ?  And below","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                extension.obj.before_add_router(context, data)"},{"line_number":43,"context_line":"            else:"},{"line_number":44,"context_line":"                LOG.error("},{"line_number":45,"context_line":"                    \"Agent Extension \u0027%(name)s\u0027 does not \""},{"line_number":46,"context_line":"                    \"implement method before_add_router\","},{"line_number":47,"context_line":"                    {\u0027name\u0027: extension.name}"},{"line_number":48,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_c82c4b03","line":45,"range":{"start_line":45,"start_character":21,"end_line":45,"end_character":26},"in_reply_to":"7faddb67_cec9beac","updated":"2019-08-12 13:42:36.000000000","message":"Let\u0027s make consistent with the existing funtions.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"}],"neutron/agent/l3/router_info.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":1196,"context_line":"    def get_router_ip_statistics(self, device, direction, ip):"},{"line_number":1197,"context_line":"        if not device or not device.exists():"},{"line_number":1198,"context_line":"            return"},{"line_number":1199,"context_line":"        LOG.debug(\"Get metering statistics for IP: %s \""},{"line_number":1200,"context_line":"                  \"in direction: %s.\", ip, direction)"},{"line_number":1201,"context_line":"        tc_wrapper \u003d tc_lib.FloatingIPTcCommand("},{"line_number":1202,"context_line":"            device.name, namespace\u003ddevice.namespace)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ce3e9e8a","line":1199,"range":{"start_line":1199,"start_character":51,"end_line":1199,"end_character":53},"updated":"2019-08-09 20:00:05.000000000","message":"nit: %(ip)s, etc","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":1196,"context_line":"    def get_router_ip_statistics(self, device, direction, ip):"},{"line_number":1197,"context_line":"        if not device or not device.exists():"},{"line_number":1198,"context_line":"            return"},{"line_number":1199,"context_line":"        LOG.debug(\"Get metering statistics for IP: %s \""},{"line_number":1200,"context_line":"                  \"in direction: %s.\", ip, direction)"},{"line_number":1201,"context_line":"        tc_wrapper \u003d tc_lib.FloatingIPTcCommand("},{"line_number":1202,"context_line":"            device.name, namespace\u003ddevice.namespace)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_88365351","line":1199,"range":{"start_line":1199,"start_character":51,"end_line":1199,"end_character":53},"in_reply_to":"7faddb67_ce3e9e8a","updated":"2019-08-12 13:42:36.000000000","message":"Done","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"}],"neutron/conf/agent/l3/config.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"               default\u003d\u00270x2\u0027,"},{"line_number":92,"context_line":"               help\u003d_(\u0027Iptables mangle mark used to mark ingress from \u0027"},{"line_number":93,"context_line":"                      \u0027external network. This mark will be masked with \u0027"},{"line_number":94,"context_line":"                      \u00270xffff so that only the lower 16 bits will be used.\u0027)),"},{"line_number":95,"context_line":"    cfg.StrOpt(\u0027store_to_file_path\u0027, default\u003d\u0027\u0027,"},{"line_number":96,"context_line":"               help\u003d(\"If set, report the data to local file.\")),"},{"line_number":97,"context_line":"    cfg.IntOpt(\u0027max_store_item\u0027, default\u003d100,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ae1c8213","line":94,"updated":"2019-08-09 20:00:05.000000000","message":"Meta-comment: this is a lot of new config options, and we try to be very conservative in adding them.  Is there a better way?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":91,"context_line":"               default\u003d\u00270x2\u0027,"},{"line_number":92,"context_line":"               help\u003d_(\u0027Iptables mangle mark used to mark ingress from \u0027"},{"line_number":93,"context_line":"                      \u0027external network. This mark will be masked with \u0027"},{"line_number":94,"context_line":"                      \u00270xffff so that only the lower 16 bits will be used.\u0027)),"},{"line_number":95,"context_line":"    cfg.StrOpt(\u0027store_to_file_path\u0027, default\u003d\u0027\u0027,"},{"line_number":96,"context_line":"               help\u003d(\"If set, report the data to local file.\")),"},{"line_number":97,"context_line":"    cfg.IntOpt(\u0027max_store_item\u0027, default\u003d100,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_158b5b68","line":94,"in_reply_to":"7faddb67_ae1c8213","updated":"2019-08-12 13:42:36.000000000","message":"Most of the configuration items here are for one purpose, to make the monitoring data more accurate. TC filter stastics data increases linearly, but monitoring data requires the amount of data used within a time interval. It is something like this:\nassuming the measure_interval is 30s, the raw data collected will be:\n[100, 200, 300, 400, 500, 600, 700, 800];\nthe processed data will be:\n[0, 100, 100, 100, 100, 100, 100, 100, 100], the data increment of every 30s.\n\nAnd we should limit the file size, it can\u0027t be too large.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    cfg.StrOpt(\u0027store_to_file_path\u0027, default\u003d\u0027\u0027,"},{"line_number":96,"context_line":"               help\u003d(\"If set, report the data to local file.\")),"},{"line_number":97,"context_line":"    cfg.IntOpt(\u0027max_store_item\u0027, default\u003d100,"},{"line_number":98,"context_line":"               help\u003d(\"Max line of the data store file.\")),"},{"line_number":99,"context_line":"    cfg.StrOpt(\u0027report_to_file_path\u0027, default\u003d\u0027\u0027,"},{"line_number":100,"context_line":"               help\u003d(\"If set, report the data to local file.\")),"},{"line_number":101,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ee111a06","line":98,"updated":"2019-08-09 20:00:05.000000000","message":"Max number of lines?  I don\u0027t understand what this is.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    cfg.IntOpt(\u0027max_store_item\u0027, default\u003d100,"},{"line_number":98,"context_line":"               help\u003d(\"Max line of the data store file.\")),"},{"line_number":99,"context_line":"    cfg.StrOpt(\u0027report_to_file_path\u0027, default\u003d\u0027\u0027,"},{"line_number":100,"context_line":"               help\u003d(\"If set, report the data to local file.\")),"},{"line_number":101,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"},{"line_number":102,"context_line":"               help\u003d(\"Max line of the data report file.\")),"},{"line_number":103,"context_line":"    cfg.IntOpt(\u0027measure_interval\u0027, default\u003d30,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_6e68ca86","line":100,"updated":"2019-08-09 20:00:05.000000000","message":"This and L96 have the same description, which is correct?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"               help\u003d(\"If set, report the data to local file.\")),"},{"line_number":101,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"},{"line_number":102,"context_line":"               help\u003d(\"Max line of the data report file.\")),"},{"line_number":103,"context_line":"    cfg.IntOpt(\u0027measure_interval\u0027, default\u003d30,"},{"line_number":104,"context_line":"               help\u003d_(\"Interval between two metering measures\")),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027metering_report_interval\u0027, default\u003d30,"},{"line_number":106,"context_line":"               help\u003d_(\u0027Seconds between metering data reporting; \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_8e1f4608","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":23},"updated":"2019-08-09 20:00:05.000000000","message":"s/measurement ?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":100,"context_line":"               help\u003d(\"If set, report the data to local file.\")),"},{"line_number":101,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"},{"line_number":102,"context_line":"               help\u003d(\"Max line of the data report file.\")),"},{"line_number":103,"context_line":"    cfg.IntOpt(\u0027measure_interval\u0027, default\u003d30,"},{"line_number":104,"context_line":"               help\u003d_(\"Interval between two metering measures\")),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027metering_report_interval\u0027, default\u003d30,"},{"line_number":106,"context_line":"               help\u003d_(\u0027Seconds between metering data reporting; \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_29163e4b","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":23},"in_reply_to":"7faddb67_8e1f4608","updated":"2019-08-12 13:42:36.000000000","message":"This is a copy of current metering agent conf.","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"},{"line_number":102,"context_line":"               help\u003d(\"Max line of the data report file.\")),"},{"line_number":103,"context_line":"    cfg.IntOpt(\u0027measure_interval\u0027, default\u003d30,"},{"line_number":104,"context_line":"               help\u003d_(\"Interval between two metering measures\")),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027metering_report_interval\u0027, default\u003d30,"},{"line_number":106,"context_line":"               help\u003d_(\u0027Seconds between metering data reporting; \u0027"},{"line_number":107,"context_line":"                      \u0027should be lager than measure_interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ae6ec293","line":104,"range":{"start_line":104,"start_character":53,"end_line":104,"end_character":61},"updated":"2019-08-09 20:00:05.000000000","message":"s/measurements.  ?","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"23b3efeb9f7fe00cbd25a41a9e6faa731fa96662","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"},{"line_number":102,"context_line":"               help\u003d(\"Max line of the data report file.\")),"},{"line_number":103,"context_line":"    cfg.IntOpt(\u0027measure_interval\u0027, default\u003d30,"},{"line_number":104,"context_line":"               help\u003d_(\"Interval between two metering measures\")),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027metering_report_interval\u0027, default\u003d30,"},{"line_number":106,"context_line":"               help\u003d_(\u0027Seconds between metering data reporting; \u0027"},{"line_number":107,"context_line":"                      \u0027should be lager than measure_interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_49113a53","line":104,"range":{"start_line":104,"start_character":53,"end_line":104,"end_character":61},"in_reply_to":"7faddb67_ae6ec293","updated":"2019-08-12 13:42:36.000000000","message":"ditto","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6618ae59f1cf0160633b17145b02235cb3f4ac5b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"               help\u003d_(\"Interval between two metering measures\")),"},{"line_number":105,"context_line":"    cfg.IntOpt(\u0027metering_report_interval\u0027, default\u003d30,"},{"line_number":106,"context_line":"               help\u003d_(\u0027Seconds between metering data reporting; \u0027"},{"line_number":107,"context_line":"                      \u0027should be lager than measure_interval.\u0027)),"},{"line_number":108,"context_line":"]"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ee5cbaee","line":107,"range":{"start_line":107,"start_character":33,"end_line":107,"end_character":38},"updated":"2019-08-09 20:00:05.000000000","message":"s/larger","commit_id":"447612a284559183fa1c349a72b267be1cdf9f13"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f9ac3241e337141fc4308542cd3e2b03757a7d67","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"METERING_OPTS \u003d ["},{"line_number":98,"context_line":"    cfg.IntOpt(\u0027measure_interval\u0027, default\u003d30,"},{"line_number":99,"context_line":"               help\u003d_(\"Interval between two metering measures\")),"},{"line_number":100,"context_line":"    cfg.IntOpt(\u0027report_interval\u0027, default\u003d30,"},{"line_number":101,"context_line":"               help\u003d_(\u0027Seconds between metering data reporting; \u0027"},{"line_number":102,"context_line":"                      \u0027should be larger than measure_interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_ffd3f5d1","line":99,"updated":"2019-08-12 14:29:34.000000000","message":"nit: one thing I noticed is that some of your help messages use \" and some use \u0027","commit_id":"97d6ce0c834e569835a2c7503aa9f11ab4e36abd"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"38e1a9cc80dbb498a37372285cc6a95b060230d7","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"METERING_OPTS \u003d ["},{"line_number":98,"context_line":"    cfg.IntOpt(\u0027measure_interval\u0027, default\u003d30,"},{"line_number":99,"context_line":"               help\u003d_(\"Interval between two metering measures\")),"},{"line_number":100,"context_line":"    cfg.IntOpt(\u0027report_interval\u0027, default\u003d30,"},{"line_number":101,"context_line":"               help\u003d_(\u0027Seconds between metering data reporting; \u0027"},{"line_number":102,"context_line":"                      \u0027should be larger than measure_interval.\u0027)),"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_312f5589","line":99,"in_reply_to":"7faddb67_ffd3f5d1","updated":"2019-08-14 14:18:27.000000000","message":"Done","commit_id":"97d6ce0c834e569835a2c7503aa9f11ab4e36abd"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f9ac3241e337141fc4308542cd3e2b03757a7d67","unresolved":false,"context_lines":[{"line_number":104,"context_line":"               help\u003d(\"If set, store the raw data to local file.\")),"},{"line_number":105,"context_line":"    cfg.StrOpt(\u0027report_to_file_path\u0027, default\u003d\u0027\u0027,"},{"line_number":106,"context_line":"               help\u003d(\"If set, report the metering data to local file.\")),"},{"line_number":107,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"},{"line_number":108,"context_line":"               help\u003d(\"Max number of lines of the data report file.\")),"},{"line_number":109,"context_line":"]"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_9f576127","line":107,"range":{"start_line":107,"start_character":32,"end_line":107,"end_character":36},"updated":"2019-08-12 14:29:34.000000000","message":"nit: s/lines","commit_id":"97d6ce0c834e569835a2c7503aa9f11ab4e36abd"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"38e1a9cc80dbb498a37372285cc6a95b060230d7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"               help\u003d(\"If set, store the raw data to local file.\")),"},{"line_number":105,"context_line":"    cfg.StrOpt(\u0027report_to_file_path\u0027, default\u003d\u0027\u0027,"},{"line_number":106,"context_line":"               help\u003d(\"If set, report the metering data to local file.\")),"},{"line_number":107,"context_line":"    cfg.IntOpt(\u0027max_report_file_line\u0027, default\u003d1000,"},{"line_number":108,"context_line":"               help\u003d(\"Max number of lines of the data report file.\")),"},{"line_number":109,"context_line":"]"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_3116754b","line":107,"range":{"start_line":107,"start_character":32,"end_line":107,"end_character":36},"in_reply_to":"7faddb67_9f576127","updated":"2019-08-14 14:18:27.000000000","message":"Done","commit_id":"97d6ce0c834e569835a2c7503aa9f11ab4e36abd"}],"neutron/tests/unit/agent/l3/extensions/test_l3_ip_metering.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4f3fed3608088e8f468c0d347699d1745f37c658","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from unittest import mock"},{"line_number":15,"context_line":"from neutron_lib import constants as lib_const"},{"line_number":16,"context_line":"from neutron_lib.tests.unit import fake_notifier"},{"line_number":17,"context_line":"from oslo_utils import fixture as utils_fixture"},{"line_number":18,"context_line":"from oslo_utils import timeutils"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff570b3c_d00a241e","line":15,"updated":"2020-05-29 19:03:01.000000000","message":"pep8: H306: imports not in alphabetical order (unittest.mock, neutron_lib.constants)","commit_id":"b08d1f7d7adb7d7edece36180e98485a4ae0d12c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4776edbddeb535d02b72f4b8d348f008fe841e02","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from oslo_utils import fixture as utils_fixture"},{"line_number":17,"context_line":"from oslo_utils import timeutils"},{"line_number":18,"context_line":"from oslo_utils import uuidutils"},{"line_number":19,"context_line":"from unittest import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.agent.l3 import agent as l3_agent"},{"line_number":22,"context_line":"from neutron.agent.l3.extensions import l3_ip_metering"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f560f44_5cd076c8","line":19,"updated":"2020-09-12 20:08:22.000000000","message":"pep8: I100 Import statements are in the wrong order. from unittest should be before from oslo_utils","commit_id":"2e32dca8e54eea82a9303997096b488c9dc6993f"}]}
