)]}'
{"etc/neutron/rootwrap.d/l3.filters":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"cc5e4e1b887c313394f3d32dbab1f4a94449ae2b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"ip_exec: IpNetnsExecFilter, ip, root"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# l3_tc_lib"},{"line_number":38,"context_line":"tc: CommandFilter, tc, root"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# For ip monitor"},{"line_number":41,"context_line":"kill_ip_monitor: KillFilter, root, ip, -9"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"ff0f0b1f_6f437c6d","line":38,"updated":"2017-05-23 20:24:51.000000000","message":"can\u0027t You be more specific and write some more detailed commands which are allowed? Check https://github.com/openstack/neutron/blob/master/etc/neutron/rootwrap.d/linuxbridge-plugin.filters for example","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03ecc23b2da42f7dee7cb23322fb1b2882bb64ca","unresolved":false,"context_lines":[{"line_number":35,"context_line":"ip_exec: IpNetnsExecFilter, ip, root"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# l3_tc_lib"},{"line_number":38,"context_line":"tc: CommandFilter, tc, root"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# For ip monitor"},{"line_number":41,"context_line":"kill_ip_monitor: KillFilter, root, ip, -9"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"ff0f0b1f_b858b987","line":38,"in_reply_to":"ff0f0b1f_6f437c6d","updated":"2017-05-24 01:37:40.000000000","message":"Done","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5704faaf8064f70f73f19a9a4f2a652dc21e0fc4","unresolved":false,"context_lines":[{"line_number":34,"context_line":"find: RegExpFilter, find, root, find, /sys/class/net, -maxdepth, 1, -type, l, -printf, %.*"},{"line_number":35,"context_line":"ip_exec: IpNetnsExecFilter, ip, root"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# l3_tc_lib"},{"line_number":38,"context_line":"l3_tc_show_qdisc: RegExpFilter, tc, root, tc, qdisc, show, dev, .+"},{"line_number":39,"context_line":"l3_tc_add_qdisc_ingress: RegExpFilter, tc, root, tc, qdisc, add, dev, .+, ingress"},{"line_number":40,"context_line":"l3_tc_add_qdisc_egress: RegExpFilter, tc, root, tc, qdisc, add, dev, .+, root, handle, 1:, htb"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"df3967d1_726d3603","line":37,"updated":"2017-08-01 07:13:27.000000000","message":"nit: I think in this new implementation, you should start using privsep. Anyway, I prefer a core to decide on this.","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"}],"neutron/agent/linux/l3_tc_lib.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"064d066e6678812da9d576fd98e5047d18a3e3e7","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"TC_DIRECTION_INGRESS \u003d \"ingress\""},{"line_number":27,"context_line":"TC_DIRECTION_EGRESS \u003d \"egress\""},{"line_number":28,"context_line":"RATE_LIMIT_DIRECTIONS \u003d [TC_DIRECTION_INGRESS, TC_DIRECTION_EGRESS]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class MultipleFilterIDForIPFound(exceptions.Conflict):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_3a8554ae","line":28,"range":{"start_line":26,"start_character":0,"end_line":28,"end_character":67},"updated":"2017-05-04 15:47:27.000000000","message":"Please, use neutron/common/constants.py\n\nINGRESS_DIRECTION \u003d \u0027ingress\u0027\nEGRESS_DIRECTION \u003d \u0027egress\u0027\n\nVALID_DIRECTIONS \u003d (INGRESS_DIRECTION, EGRESS_DIRECTION)","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"76e2074857365a53bc0550969ab6dfe9e8dc7ee0","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"TC_DIRECTION_INGRESS \u003d \"ingress\""},{"line_number":27,"context_line":"TC_DIRECTION_EGRESS \u003d \"egress\""},{"line_number":28,"context_line":"RATE_LIMIT_DIRECTIONS \u003d [TC_DIRECTION_INGRESS, TC_DIRECTION_EGRESS]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class MultipleFilterIDForIPFound(exceptions.Conflict):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_fbcb5d50","line":28,"range":{"start_line":26,"start_character":0,"end_line":28,"end_character":67},"in_reply_to":"3f044301_3a8554ae","updated":"2017-05-05 05:48:32.000000000","message":"Done","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"064d066e6678812da9d576fd98e5047d18a3e3e7","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _add_qdisc(self, direction):"},{"line_number":68,"context_line":"        if direction \u003d\u003d TC_DIRECTION_EGRESS:"},{"line_number":69,"context_line":"            args \u003d [\u0027root\u0027, \u0027htb\u0027]"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            args \u003d [\u0027ingress\u0027]"},{"line_number":72,"context_line":"        cmd \u003d [\u0027qdisc\u0027, \u0027add\u0027, \u0027dev\u0027, self.name] + args"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_ffa8fe77","line":69,"updated":"2017-05-04 15:47:27.000000000","message":"It is customary to name the root qdisc \u00271:\u0027.\n\nThe command to add the root qdisc should be:\n  tc add qdisc dev device root handle 1: htb","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"76e2074857365a53bc0550969ab6dfe9e8dc7ee0","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _add_qdisc(self, direction):"},{"line_number":68,"context_line":"        if direction \u003d\u003d TC_DIRECTION_EGRESS:"},{"line_number":69,"context_line":"            args \u003d [\u0027root\u0027, \u0027htb\u0027]"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            args \u003d [\u0027ingress\u0027]"},{"line_number":72,"context_line":"        cmd \u003d [\u0027qdisc\u0027, \u0027add\u0027, \u0027dev\u0027, self.name] + args"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_fb3ebd27","line":69,"in_reply_to":"3f044301_ffa8fe77","updated":"2017-05-05 05:48:32.000000000","message":"Done","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"064d066e6678812da9d576fd98e5047d18a3e3e7","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        return qdisc_id"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":165,"context_line":"        # RESERVED: for future use."}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_1af3b8a0","line":162,"updated":"2017-05-04 15:47:27.000000000","message":"In case the QoS policy is deleted from this FIP, did you consider to delete the qdisc too?","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"76e2074857365a53bc0550969ab6dfe9e8dc7ee0","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        return qdisc_id"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":165,"context_line":"        # RESERVED: for future use."}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_1b13a9b7","line":162,"in_reply_to":"3f044301_1af3b8a0","updated":"2017-05-05 05:48:32.000000000","message":"qdisc will be shared for a router namespace, it\u0027s better to keep it to avoid unnecessary re-creation operations.","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"064d066e6678812da9d576fd98e5047d18a3e3e7","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":219,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":220,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":221,"context_line":"        except MultipleFilterIDForIPFound:"},{"line_number":222,"context_line":"            raise"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"},{"line_number":225,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_1a77383d","line":222,"range":{"start_line":221,"start_character":8,"end_line":222,"end_character":17},"updated":"2017-05-04 15:47:27.000000000","message":"If you don\u0027t catch this exception here, it will raise anyway. You can remove this.","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"76e2074857365a53bc0550969ab6dfe9e8dc7ee0","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":219,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":220,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":221,"context_line":"        except MultipleFilterIDForIPFound:"},{"line_number":222,"context_line":"            raise"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"},{"line_number":225,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_fb27dd11","line":222,"range":{"start_line":221,"start_character":8,"end_line":222,"end_character":17},"in_reply_to":"3f044301_1a77383d","updated":"2017-05-05 05:48:32.000000000","message":"Done","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"064d066e6678812da9d576fd98e5047d18a3e3e7","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":233,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":234,"context_line":"                            \"action.\"), ip)"},{"line_number":235,"context_line":"        except MultipleFilterIDForIPFound:"},{"line_number":236,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_ba93a44f","line":236,"range":{"start_line":235,"start_character":0,"end_line":236,"end_character":17},"updated":"2017-05-04 15:47:27.000000000","message":"ditto","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"76e2074857365a53bc0550969ab6dfe9e8dc7ee0","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":233,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":234,"context_line":"                            \"action.\"), ip)"},{"line_number":235,"context_line":"        except MultipleFilterIDForIPFound:"},{"line_number":236,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f044301_db242110","line":236,"range":{"start_line":235,"start_character":0,"end_line":236,"end_character":17},"in_reply_to":"3f044301_ba93a44f","updated":"2017-05-05 05:48:32.000000000","message":"Done","commit_id":"8d8093afe28f674fc592baaef0dbbd6fdfd78c46"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5f1dd598ec3948faa5f6377a62f9e34c5afe6bc4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class MultipleFilterIDForIPFound(exceptions.Conflict):"},{"line_number":29,"context_line":"    message \u003d _(\"Multiple filter IDs for IP %(ip)s found.\")"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class FilterIDForIPNotFound(exceptions.NotFound):"},{"line_number":33,"context_line":"    message \u003d _(\"Filter ID for IP %(ip)s could not be found.\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class FailedToAddQdiscToDevice(exceptions.NeutronException):"},{"line_number":37,"context_line":"    message \u003d _(\"Failed to add %(direction)s qdisc \""},{"line_number":38,"context_line":"                \"to device %(device)s.\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_c7350f48","line":38,"range":{"start_line":28,"start_character":0,"end_line":38,"end_character":40},"updated":"2017-05-22 10:03:38.000000000","message":"These exceptions should be in neutron_lib","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"18a5b11bc236770ff763257e5ba32324ee67bf72","unresolved":false,"context_lines":[{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class MultipleFilterIDForIPFound(exceptions.Conflict):"},{"line_number":29,"context_line":"    message \u003d _(\"Multiple filter IDs for IP %(ip)s found.\")"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class FilterIDForIPNotFound(exceptions.NotFound):"},{"line_number":33,"context_line":"    message \u003d _(\"Filter ID for IP %(ip)s could not be found.\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class FailedToAddQdiscToDevice(exceptions.NeutronException):"},{"line_number":37,"context_line":"    message \u003d _(\"Failed to add %(direction)s qdisc \""},{"line_number":38,"context_line":"                \"to device %(device)s.\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_2d0029ab","line":38,"range":{"start_line":28,"start_character":0,"end_line":38,"end_character":40},"in_reply_to":"ff0f0b1f_c7350f48","updated":"2017-05-22 11:34:41.000000000","message":"Done","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"cc5e4e1b887c313394f3d32dbab1f4a94449ae2b","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                \"to device %(device)s.\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _execute_tc_cmd(self, cmd, **kwargs):"},{"line_number":44,"context_line":"        cmd \u003d [\u0027tc\u0027] + cmd"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_4a0b0623","line":41,"updated":"2017-05-23 20:24:51.000000000","message":"I don\u0027t see a reason why You propose it in new file and new classes. There is already file tc_lib.py with class to use tc.\nOf course it might be required to make some changes there to reuse as much code as possible but for sure it\u0027s possible. There is _execute_tc_command there already, get_qdiscs and filters are also there (maybe not in same way but IMHO better would be to refactor and reuse existing code, not duplicate it)","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"03ecc23b2da42f7dee7cb23322fb1b2882bb64ca","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                \"to device %(device)s.\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _execute_tc_cmd(self, cmd, **kwargs):"},{"line_number":44,"context_line":"        cmd \u003d [\u0027tc\u0027] + cmd"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_fb550bfb","line":41,"in_reply_to":"ff0f0b1f_4a0b0623","updated":"2017-05-24 01:37:40.000000000","message":"No, I don\u0027t think so.\nAs I said that \" l3_tc_lib has much differences from original tc_lib. The file is stored separately is more clearly.\" in patch set 3. Then, we get a better readability, and least impact on the existing.\n\nAnd tc_lib does not have the function get_qdiscs and get_filters.\nExcept that _execute_tc_command fucntion, the others is totally not the same. So move this _execute_tc_command function out of tc_lib and l3_tc_lib to a utils lib, but this is not what I want, aka has impact on the existing. Or maybe inherit the TcCommand and do some refactor for __init__, which makes the FloatingIPTcCommand has much ugly and never-use functions.","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4d1ced9c201496ea8439387fcd54920c464991b1","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                \"to device %(device)s.\")"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def _execute_tc_cmd(self, cmd, **kwargs):"},{"line_number":44,"context_line":"        cmd \u003d [\u0027tc\u0027] + cmd"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_0d6f5afc","line":41,"in_reply_to":"ff0f0b1f_fb550bfb","updated":"2017-05-24 08:28:05.000000000","message":"For example in existing tc_lib there are methods for example to add ingress qdisc. There are no methods to manage htb qdiscs but it can be just added there.\nYou didn\u0027t convince me to split it into two separate files but if core reviewers will accept that, then it\u0027s fine :)","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5f1dd598ec3948faa5f6377a62f9e34c5afe6bc4","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        _match \u003d \u0027src\u0027 if direction \u003d\u003d constants.EGRESS_DIRECTION else \u0027dst\u0027"},{"line_number":140,"context_line":"        match \u003d [\u0027u32\u0027, \u0027match\u0027, \u0027ip\u0027, _match, ip]"},{"line_number":141,"context_line":"        police \u003d [\u0027police\u0027, \u0027rate\u0027, rate_value, \u0027burst\u0027, burst_value,"},{"line_number":142,"context_line":"                  \u0027mtu\u0027, \u002764kb\u0027, \u0027drop\u0027, \u0027flowid\u0027, \u0027:1\u0027]"},{"line_number":143,"context_line":"        args \u003d protocol + prio + match + police"},{"line_number":144,"context_line":"        cmd \u003d [\u0027filter\u0027, \u0027add\u0027, \u0027dev\u0027, self.name,"},{"line_number":145,"context_line":"               \u0027parent\u0027, qdisc_id] + args"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_7d95b63f","line":142,"updated":"2017-05-22 10:03:38.000000000","message":"This filter will collide with L2 QoS rule in the gateway port.\n\nBecause this one is prio 1, will overlap the L2 one (prio 49).\n\nPlease, refer in the SPEC how are you going to deal with it.","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"18a5b11bc236770ff763257e5ba32324ee67bf72","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        _match \u003d \u0027src\u0027 if direction \u003d\u003d constants.EGRESS_DIRECTION else \u0027dst\u0027"},{"line_number":140,"context_line":"        match \u003d [\u0027u32\u0027, \u0027match\u0027, \u0027ip\u0027, _match, ip]"},{"line_number":141,"context_line":"        police \u003d [\u0027police\u0027, \u0027rate\u0027, rate_value, \u0027burst\u0027, burst_value,"},{"line_number":142,"context_line":"                  \u0027mtu\u0027, \u002764kb\u0027, \u0027drop\u0027, \u0027flowid\u0027, \u0027:1\u0027]"},{"line_number":143,"context_line":"        args \u003d protocol + prio + match + police"},{"line_number":144,"context_line":"        cmd \u003d [\u0027filter\u0027, \u0027add\u0027, \u0027dev\u0027, self.name,"},{"line_number":145,"context_line":"               \u0027parent\u0027, qdisc_id] + args"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_4df7ddd4","line":142,"in_reply_to":"ff0f0b1f_7d95b63f","updated":"2017-05-22 11:34:41.000000000","message":"Done, thank you very much, will consider that.","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5f1dd598ec3948faa5f6377a62f9e34c5afe6bc4","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                           \u0027ip\u0027: ip,"},{"line_number":213,"context_line":"                           \u0027direction\u0027: direction})"},{"line_number":214,"context_line":"                self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":215,"context_line":"                self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":216,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":217,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_3de73e43","line":215,"updated":"2017-05-22 10:03:38.000000000","message":"In the spec [1] you are talking about using a HTB qdisc to filter set the speed limits. In the spec you make reference to [2], which is an example of how to use classfull HTB algorithm to shape the traffic.\n\nBut this implementation is policing the traffic by using filters, not shaping traffic.\n\nPlease, make sure:\n1) You specify in the spec, the LB implementation is not shaping traffic.\n2) and also in the commit message\n\n[1] https://review.openstack.org/#/c/374506/\n[2] http://www.linuxjournal.com/article/7562","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"18a5b11bc236770ff763257e5ba32324ee67bf72","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                           \u0027ip\u0027: ip,"},{"line_number":213,"context_line":"                           \u0027direction\u0027: direction})"},{"line_number":214,"context_line":"                self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":215,"context_line":"                self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":216,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":217,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_2d6b8985","line":215,"in_reply_to":"ff0f0b1f_3de73e43","updated":"2017-05-22 11:34:41.000000000","message":"1) All floating IP will be limited. If floating IP is bonding to a LB VIP, and setting the qos policy, it will be restricted.\n2) [1] is only a ref for HTB. Not all principle of this implementation.\n\n\n [1]   `Linux HTB Queuing \u003chttp://www.linuxjournal.com/article/7562\u003e`_","commit_id":"f63eb8d17ac1acdf5be50c3a30c28f8918994cae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def _get_qdisc_id_for_filter(self, direction):"},{"line_number":51,"context_line":"        qdisc_results \u003d self._get_qdiscs().split(\u0027\\n\u0027)"},{"line_number":52,"context_line":"        for qdisc in qdisc_results:"},{"line_number":53,"context_line":"            if direction \u003d\u003d constants.EGRESS_DIRECTION:"},{"line_number":54,"context_line":"                pattern \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                pattern \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":57,"context_line":"            m \u003d pattern.match(qdisc)"},{"line_number":58,"context_line":"            if m:"},{"line_number":59,"context_line":"                # No chance to get multiple qdiscs"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_2acbac72","line":56,"range":{"start_line":53,"start_character":12,"end_line":56,"end_character":63},"updated":"2017-07-25 09:37:06.000000000","message":"This is just for clarification: the direction in Neutron is always from the VM point of view.\n\nIf the traffic is \"egress\" (from the VM point of view), the qdisc matching should be ingress.\n\nOr did you change it internally? Because the functions using \"_get_qdisc_id_for_filter\" seams to use the direction used in the Neutron agent (from the VM point of view).","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ff5aaac490c023b6f99317e1eac954e5ebea7ae6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def _get_qdisc_id_for_filter(self, direction):"},{"line_number":51,"context_line":"        qdisc_results \u003d self._get_qdiscs().split(\u0027\\n\u0027)"},{"line_number":52,"context_line":"        for qdisc in qdisc_results:"},{"line_number":53,"context_line":"            if direction \u003d\u003d constants.EGRESS_DIRECTION:"},{"line_number":54,"context_line":"                pattern \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":55,"context_line":"            else:"},{"line_number":56,"context_line":"                pattern \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":57,"context_line":"            m \u003d pattern.match(qdisc)"},{"line_number":58,"context_line":"            if m:"},{"line_number":59,"context_line":"                # No chance to get multiple qdiscs"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_98f8af49","line":56,"range":{"start_line":53,"start_character":12,"end_line":56,"end_character":63},"in_reply_to":"ff346bd7_2acbac72","updated":"2017-07-25 10:54:09.000000000","message":"Yes, this is the VM point of view. Consider the floating IP was binding to a VM, we can assume that they are one integrated thing.","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def _get_filterid_for_ip(self, qdisc_id, ip):"},{"line_number":76,"context_line":"        filterids_for_ip \u003d []"},{"line_number":77,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":78,"context_line":"        for line in filter_results:"},{"line_number":79,"context_line":"            line \u003d line.strip()"},{"line_number":80,"context_line":"            parts \u003d line.split(\" \")"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_c5653147","line":77,"range":{"start_line":77,"start_character":53,"end_line":77,"end_character":64},"updated":"2017-07-25 09:37:06.000000000","message":"splitlines()\n\nIt will remove the final \\n if its present. I.e,\n  \u0027foo\\nbar\\n\u0027.split() \u003d\u003d [\u0027foo\u0027, \u0027bar\u0027, \u0027\u0027]\n  str.splitlines(\u0027foo\\nbar\\n\u0027) \u003d\u003d [\u0027foo\u0027, \u0027bar\u0027]","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                continue"},{"line_number":89,"context_line":"            elif not line.startswith(\u0027match\u0027):"},{"line_number":90,"context_line":"                continue"},{"line_number":91,"context_line":"            if ip + \u0027/32\u0027 in parts:"},{"line_number":92,"context_line":"                filterids_for_ip.append(filter_id)"},{"line_number":93,"context_line":"        if len(filterids_for_ip) \u003e 1:"},{"line_number":94,"context_line":"            raise MultipleFilterIDForIPFound(ip\u003dip)"},{"line_number":95,"context_line":"        if len(filterids_for_ip) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_00c5675b","line":92,"range":{"start_line":91,"start_character":12,"end_line":92,"end_character":50},"updated":"2017-07-25 09:37:06.000000000","message":"Or maybe, instead of a loop, you can make a regex for the whole line","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ff5aaac490c023b6f99317e1eac954e5ebea7ae6","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                continue"},{"line_number":89,"context_line":"            elif not line.startswith(\u0027match\u0027):"},{"line_number":90,"context_line":"                continue"},{"line_number":91,"context_line":"            if ip + \u0027/32\u0027 in parts:"},{"line_number":92,"context_line":"                filterids_for_ip.append(filter_id)"},{"line_number":93,"context_line":"        if len(filterids_for_ip) \u003e 1:"},{"line_number":94,"context_line":"            raise MultipleFilterIDForIPFound(ip\u003dip)"},{"line_number":95,"context_line":"        if len(filterids_for_ip) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_78a18ba9","line":92,"range":{"start_line":91,"start_character":12,"end_line":92,"end_character":50},"in_reply_to":"ff346bd7_00c5675b","updated":"2017-07-25 10:54:09.000000000","message":"The filter_id and the IP/32 are not in the same line.","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e5d55e9af6cf7b39879cfb6bf0bb6b6e7ded2c64","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                continue"},{"line_number":89,"context_line":"            elif not line.startswith(\u0027match\u0027):"},{"line_number":90,"context_line":"                continue"},{"line_number":91,"context_line":"            if ip + \u0027/32\u0027 in parts:"},{"line_number":92,"context_line":"                filterids_for_ip.append(filter_id)"},{"line_number":93,"context_line":"        if len(filterids_for_ip) \u003e 1:"},{"line_number":94,"context_line":"            raise MultipleFilterIDForIPFound(ip\u003dip)"},{"line_number":95,"context_line":"        if len(filterids_for_ip) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_dd9a2112","line":92,"range":{"start_line":91,"start_character":12,"end_line":92,"end_character":50},"in_reply_to":"ff346bd7_78a18ba9","updated":"2017-07-28 15:07:16.000000000","message":"No, I mean instead of searching a string in several strings, taking \"line\" and make a unique regex. Just a suggestion, nothing else.","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        return acc"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def clear_all_filters(self, direction):"},{"line_number":176,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":177,"context_line":"        if not qdisc_id:"},{"line_number":178,"context_line":"            return"},{"line_number":179,"context_line":"        filterids \u003d self._get_qdisc_filters(qdisc_id)"},{"line_number":180,"context_line":"        for filterid in filterids:"},{"line_number":181,"context_line":"            self._del_filter_by_id(qdisc_id, filterid)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def get_filter_id_for_ip(self, direction, ip):"},{"line_number":184,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_e02b83e8","line":181,"range":{"start_line":176,"start_character":0,"end_line":181,"end_character":54},"updated":"2017-07-25 09:37:06.000000000","message":"You can replace this by:\n\nfor filterid in self.get_existing_filter_ids(direction) or []:\n    self._del_filter_by_id(qdisc_id, filterid)","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"494c2302d1186674de834e3149c6338552a9a45d","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        return acc"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def clear_all_filters(self, direction):"},{"line_number":176,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":177,"context_line":"        if not qdisc_id:"},{"line_number":178,"context_line":"            return"},{"line_number":179,"context_line":"        filterids \u003d self._get_qdisc_filters(qdisc_id)"},{"line_number":180,"context_line":"        for filterid in filterids:"},{"line_number":181,"context_line":"            self._del_filter_by_id(qdisc_id, filterid)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def get_filter_id_for_ip(self, direction, ip):"},{"line_number":184,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_b807f31c","line":181,"range":{"start_line":176,"start_character":0,"end_line":181,"end_character":54},"in_reply_to":"ff346bd7_3884230c","updated":"2017-07-25 11:03:21.000000000","message":"Sorry, the qdisc_id is needed by _del_filter_by_id, so we can\u0027t replace it.","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ff5aaac490c023b6f99317e1eac954e5ebea7ae6","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        return acc"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def clear_all_filters(self, direction):"},{"line_number":176,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":177,"context_line":"        if not qdisc_id:"},{"line_number":178,"context_line":"            return"},{"line_number":179,"context_line":"        filterids \u003d self._get_qdisc_filters(qdisc_id)"},{"line_number":180,"context_line":"        for filterid in filterids:"},{"line_number":181,"context_line":"            self._del_filter_by_id(qdisc_id, filterid)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def get_filter_id_for_ip(self, direction, ip):"},{"line_number":184,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_3884230c","line":181,"range":{"start_line":176,"start_character":0,"end_line":181,"end_character":54},"in_reply_to":"ff346bd7_e02b83e8","updated":"2017-07-25 10:54:09.000000000","message":"Done","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        qdisc_id \u003d self._get_or_create_qdisc(direction)"},{"line_number":204,"context_line":"        try:"},{"line_number":205,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":206,"context_line":"            if filter_id:"},{"line_number":207,"context_line":"                LOG.debug(\"Filter %(filter)s for IP %(ip)s in %(direction)s \""},{"line_number":208,"context_line":"                          \"qdisc already existed. Do updating.\","},{"line_number":209,"context_line":"                          {\u0027filter\u0027: filter_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_4579412d","line":206,"range":{"start_line":206,"start_character":12,"end_line":206,"end_character":25},"updated":"2017-07-25 09:37:06.000000000","message":"\"filter_id\" is always something (if returned) because of lines L93-97","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ff5aaac490c023b6f99317e1eac954e5ebea7ae6","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        qdisc_id \u003d self._get_or_create_qdisc(direction)"},{"line_number":204,"context_line":"        try:"},{"line_number":205,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":206,"context_line":"            if filter_id:"},{"line_number":207,"context_line":"                LOG.debug(\"Filter %(filter)s for IP %(ip)s in %(direction)s \""},{"line_number":208,"context_line":"                          \"qdisc already existed. Do updating.\","},{"line_number":209,"context_line":"                          {\u0027filter\u0027: filter_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_18127f0a","line":206,"range":{"start_line":206,"start_character":12,"end_line":206,"end_character":25},"in_reply_to":"ff346bd7_4579412d","updated":"2017-07-25 10:54:09.000000000","message":"Done","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":213,"context_line":"                self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":214,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":215,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"},{"line_number":218,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_05a8d974","line":215,"updated":"2017-07-25 09:37:06.000000000","message":"What is happening if \"_get_filterid_for_ip\" raises \"MultipleFilterIDForIPFound\"? Why don\u0027t delete all filters and create only one?","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ff5aaac490c023b6f99317e1eac954e5ebea7ae6","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":213,"context_line":"                self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":214,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":215,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"},{"line_number":218,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_f83e9b27","line":215,"in_reply_to":"ff346bd7_05a8d974","updated":"2017-07-25 10:54:09.000000000","message":"MultipleFilterIDForIPFound will be raised to client [1].\n\nWe can not delete all filters because the legacy router floating IPs filters may exist in the same router qg-device. On the other hand, an IP has multiple filter IDs then something may go wrong, we should not proceed.\n\n\n[1] \n https://review.openstack.org/#/c/453458/4/neutron/agent/linux/l3_tc_lib.py@222","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            return"},{"line_number":221,"context_line":"        try:"},{"line_number":222,"context_line":"            filterid \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":223,"context_line":"            if filterid:"},{"line_number":224,"context_line":"                self._del_filter_by_id(qdisc_id, filterid)"},{"line_number":225,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":226,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_c5bbf1c1","line":223,"range":{"start_line":223,"start_character":15,"end_line":223,"end_character":23},"updated":"2017-07-25 09:37:06.000000000","message":"ditto","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ff5aaac490c023b6f99317e1eac954e5ebea7ae6","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            return"},{"line_number":221,"context_line":"        try:"},{"line_number":222,"context_line":"            filterid \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":223,"context_line":"            if filterid:"},{"line_number":224,"context_line":"                self._del_filter_by_id(qdisc_id, filterid)"},{"line_number":225,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":226,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_f8f8dbc4","line":223,"range":{"start_line":223,"start_character":15,"end_line":223,"end_character":23},"in_reply_to":"ff346bd7_c5bbf1c1","updated":"2017-07-25 10:54:09.000000000","message":"Done","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4891f0d444410c3ae3a9580ff89466200f0c1c36","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                self._del_filter_by_id(qdisc_id, filterid)"},{"line_number":225,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":226,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":227,"context_line":"                            \"action.\"), ip)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_85b5e9cf","line":227,"updated":"2017-07-25 09:37:06.000000000","message":"ditto","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ff5aaac490c023b6f99317e1eac954e5ebea7ae6","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                self._del_filter_by_id(qdisc_id, filterid)"},{"line_number":225,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":226,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":227,"context_line":"                            \"action.\"), ip)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_380e638d","line":227,"in_reply_to":"ff346bd7_85b5e9cf","updated":"2017-07-25 10:54:09.000000000","message":"ditto","commit_id":"7f2253faf213122a8d45350aa32ce0b1da8ec50c"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"79ade5e4f1970b1c820a036b3ad5edf29fb46fd8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from neutron_lib import exceptions"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron._i18n import _, _LW"},{"line_number":19,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":20,"context_line":"from neutron.agent.linux import tc_lib"},{"line_number":21,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_ff11cbad","line":18,"range":{"start_line":18,"start_character":29,"end_line":18,"end_character":32},"updated":"2017-08-02 04:14:51.000000000","message":"AFAIK _LW is deprecated, just use _ or make log message plains in English","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"154dd08db8d658173aa5fd61e4dc6dc712fc8523","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from neutron_lib import exceptions"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron._i18n import _, _LW"},{"line_number":19,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":20,"context_line":"from neutron.agent.linux import tc_lib"},{"line_number":21,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_e8ed3cb7","line":18,"range":{"start_line":18,"start_character":29,"end_line":18,"end_character":32},"in_reply_to":"df3967d1_d72c5d03","updated":"2017-08-04 08:47:26.000000000","message":"Liu, please take a look at:\n- Remove log translations patches: https://review.openstack.org/#/q/Remove+log+translations\n- i18n contributor meetup: http://lists.openstack.org/pipermail/openstack-i18n/2016-November/002574.html\n\nYou need to remove this line.","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"9b22b88d1c7b8b0cac18edd2bc36de6b7001ca83","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from neutron_lib import exceptions"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron._i18n import _, _LW"},{"line_number":19,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":20,"context_line":"from neutron.agent.linux import tc_lib"},{"line_number":21,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf3e73b7_dc50a3d7","line":18,"range":{"start_line":18,"start_character":29,"end_line":18,"end_character":32},"in_reply_to":"df3967d1_e8ed3cb7","updated":"2017-08-07 04:45:45.000000000","message":"Done","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0768b1bb87cdecd94948f006f047334ecadd446f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from neutron_lib import exceptions"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron._i18n import _, _LW"},{"line_number":19,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":20,"context_line":"from neutron.agent.linux import tc_lib"},{"line_number":21,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_d72c5d03","line":18,"range":{"start_line":18,"start_character":29,"end_line":18,"end_character":32},"in_reply_to":"df3967d1_ff11cbad","updated":"2017-08-04 06:47:04.000000000","message":"Almost every LOG.warning in neutron code has _LW. And I don\u0027t fine a deprecated warning in oslo.i18n.","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"154dd08db8d658173aa5fd61e4dc6dc712fc8523","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class MultipleFilterIDForIPFound(exceptions.Conflict):"},{"line_number":27,"context_line":"    message \u003d _(\"Multiple filter IDs for IP %(ip)s found.\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class FilterIDForIPNotFound(exceptions.NotFound):"},{"line_number":31,"context_line":"    message \u003d _(\"Filter ID for IP %(ip)s could not be found.\")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class FailedToAddQdiscToDevice(exceptions.NeutronException):"},{"line_number":35,"context_line":"    message \u003d _(\"Failed to add %(direction)s qdisc \""},{"line_number":36,"context_line":"                \"to device %(device)s.\")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_880b507b","line":36,"range":{"start_line":26,"start_character":0,"end_line":36,"end_character":40},"updated":"2017-08-04 08:47:26.000000000","message":"This must go to meutron/common/exceptions.py","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"9b22b88d1c7b8b0cac18edd2bc36de6b7001ca83","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class MultipleFilterIDForIPFound(exceptions.Conflict):"},{"line_number":27,"context_line":"    message \u003d _(\"Multiple filter IDs for IP %(ip)s found.\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class FilterIDForIPNotFound(exceptions.NotFound):"},{"line_number":31,"context_line":"    message \u003d _(\"Filter ID for IP %(ip)s could not be found.\")"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class FailedToAddQdiscToDevice(exceptions.NeutronException):"},{"line_number":35,"context_line":"    message \u003d _(\"Failed to add %(direction)s qdisc \""},{"line_number":36,"context_line":"                \"to device %(device)s.\")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf3e73b7_bc5f1fe4","line":36,"range":{"start_line":26,"start_character":0,"end_line":36,"end_character":40},"in_reply_to":"df3967d1_880b507b","updated":"2017-08-07 04:45:45.000000000","message":"Done","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"cb09c67ea521161502a85f6e123d0314e2db5e0b","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":222,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":223,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":224,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":225,"context_line":"                            \"action.\"), ip)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_ac1c4d6a","line":224,"updated":"2017-08-01 17:18:33.000000000","message":"AFAIR: Logs messages shouldn\u0027t be translated","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"154dd08db8d658173aa5fd61e4dc6dc712fc8523","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":222,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":223,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":224,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":225,"context_line":"                            \"action.\"), ip)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_a868541c","line":224,"range":{"start_line":224,"start_character":12,"end_line":224,"end_character":77},"updated":"2017-08-04 08:47:26.000000000","message":"As Slawek pointed out, this line should be:\n\n LOG.warning(\"No filter found for %s, skipping filter delete \"","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"9b22b88d1c7b8b0cac18edd2bc36de6b7001ca83","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":222,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":223,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":224,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":225,"context_line":"                            \"action.\"), ip)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf3e73b7_9c645bbb","line":224,"range":{"start_line":224,"start_character":12,"end_line":224,"end_character":77},"in_reply_to":"df3967d1_a868541c","updated":"2017-08-07 04:45:45.000000000","message":"Done","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0768b1bb87cdecd94948f006f047334ecadd446f","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":222,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":223,"context_line":"        except FilterIDForIPNotFound:"},{"line_number":224,"context_line":"            LOG.warning(_LW(\"No filter found for %s, skipping filter delete \""},{"line_number":225,"context_line":"                            \"action.\"), ip)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_9732555d","line":224,"in_reply_to":"df3967d1_ac1c4d6a","updated":"2017-08-04 06:47:04.000000000","message":"Almost every LOG.warning in neutron code has _LW. And I don\u0027t fine a deprecated warning in oslo.i18n.","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a43220efba0cb41956437c16d31e034e733b74f9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        qdisc_results \u003d self._get_qdiscs().split(\u0027\\n\u0027)"},{"line_number":38,"context_line":"        for qdisc in qdisc_results:"},{"line_number":39,"context_line":"            if direction \u003d\u003d constants.EGRESS_DIRECTION:"},{"line_number":40,"context_line":"                pattern \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":41,"context_line":"            else:"},{"line_number":42,"context_line":"                pattern \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":43,"context_line":"            m \u003d pattern.match(qdisc)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_5c13930e","line":40,"updated":"2017-08-07 04:51:37.000000000","message":"why not do the compilation at the init of the class?","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d5d897f818632b6e93772be5996a95ccacec34b3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        qdisc_results \u003d self._get_qdiscs().split(\u0027\\n\u0027)"},{"line_number":38,"context_line":"        for qdisc in qdisc_results:"},{"line_number":39,"context_line":"            if direction \u003d\u003d constants.EGRESS_DIRECTION:"},{"line_number":40,"context_line":"                pattern \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":41,"context_line":"            else:"},{"line_number":42,"context_line":"                pattern \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":43,"context_line":"            m \u003d pattern.match(qdisc)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_09602cce","line":40,"in_reply_to":"bf3e73b7_5c13930e","updated":"2017-08-07 06:39:08.000000000","message":"Done, move to file head.","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a43220efba0cb41956437c16d31e034e733b74f9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            if direction \u003d\u003d constants.EGRESS_DIRECTION:"},{"line_number":40,"context_line":"                pattern \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":41,"context_line":"            else:"},{"line_number":42,"context_line":"                pattern \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":43,"context_line":"            m \u003d pattern.match(qdisc)"},{"line_number":44,"context_line":"            if m:"},{"line_number":45,"context_line":"                # No chance to get multiple qdiscs"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_fc0127b1","line":42,"updated":"2017-08-07 04:51:37.000000000","message":"ditto","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d5d897f818632b6e93772be5996a95ccacec34b3","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            if direction \u003d\u003d constants.EGRESS_DIRECTION:"},{"line_number":40,"context_line":"                pattern \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":41,"context_line":"            else:"},{"line_number":42,"context_line":"                pattern \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":43,"context_line":"            m \u003d pattern.match(qdisc)"},{"line_number":44,"context_line":"            if m:"},{"line_number":45,"context_line":"                # No chance to get multiple qdiscs"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_89a9bce0","line":42,"in_reply_to":"bf3e73b7_fc0127b1","updated":"2017-08-07 06:39:08.000000000","message":"Done","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a43220efba0cb41956437c16d31e034e733b74f9","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        for line in filter_results:"},{"line_number":65,"context_line":"            line \u003d line.strip()"},{"line_number":66,"context_line":"            parts \u003d line.split(\" \")"},{"line_number":67,"context_line":"            pattern \u003d re.compile("},{"line_number":68,"context_line":"                r\"filter protocol ip u32 fh (\\w+::\\w+) *\""},{"line_number":69,"context_line":"            )"},{"line_number":70,"context_line":"            m \u003d pattern.match(line)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_1cf50bcc","line":67,"updated":"2017-08-07 04:51:37.000000000","message":"ditto","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d5d897f818632b6e93772be5996a95ccacec34b3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        for line in filter_results:"},{"line_number":65,"context_line":"            line \u003d line.strip()"},{"line_number":66,"context_line":"            parts \u003d line.split(\" \")"},{"line_number":67,"context_line":"            pattern \u003d re.compile("},{"line_number":68,"context_line":"                r\"filter protocol ip u32 fh (\\w+::\\w+) *\""},{"line_number":69,"context_line":"            )"},{"line_number":70,"context_line":"            m \u003d pattern.match(line)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_29b89028","line":67,"in_reply_to":"bf3e73b7_1cf50bcc","updated":"2017-08-07 06:39:08.000000000","message":"Done","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a43220efba0cb41956437c16d31e034e733b74f9","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                       \u0027direction\u0027: direction})"},{"line_number":197,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":198,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":199,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":200,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_bcd27f33","line":199,"updated":"2017-08-07 04:51:37.000000000","message":"consider logging like below (line 210)","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d5d897f818632b6e93772be5996a95ccacec34b3","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                       \u0027direction\u0027: direction})"},{"line_number":197,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":198,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":199,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":200,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf3e73b7_09b5cc31","line":199,"in_reply_to":"bf3e73b7_bcd27f33","updated":"2017-08-07 06:39:08.000000000","message":"Done, add debug log.","commit_id":"98ea507de0e133e757481455d68d6adee321d9be"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"584e093604747f4ea545e50b1dfc1a60af90fa02","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"QDISC_IN_REGEX \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":25,"context_line":"QDISC_OUT_REGEX \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":26,"context_line":"FIlter_ID_REGEX \u003d re.compile(r\"filter protocol ip u32 fh (\\w+::\\w+) *\")"},{"line_number":27,"context_line":"FILTER_STATS_REGEX \u003d re.compile(r\"Sent (\\w+) bytes (\\w+) pkts *\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_f13496fd","line":26,"updated":"2017-10-30 10:04:56.000000000","message":"nit: s/FIlter/FILTER","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"480cd9f95c3e02d8ee1aaff39625afaf1a59fb9f","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"QDISC_IN_REGEX \u003d re.compile(r\"qdisc ingress (\\w+:) *\")"},{"line_number":25,"context_line":"QDISC_OUT_REGEX \u003d re.compile(r\"qdisc htb (\\w+:) *\")"},{"line_number":26,"context_line":"FIlter_ID_REGEX \u003d re.compile(r\"filter protocol ip u32 fh (\\w+::\\w+) *\")"},{"line_number":27,"context_line":"FILTER_STATS_REGEX \u003d re.compile(r\"Sent (\\w+) bytes (\\w+) pkts *\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_77aad6d2","line":26,"in_reply_to":"3f4b6375_f13496fd","updated":"2017-10-30 11:10:09.000000000","message":"Done","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"584e093604747f4ea545e50b1dfc1a60af90fa02","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":95,"context_line":"        for line in filter_results:"},{"line_number":96,"context_line":"            line \u003d line.strip()"},{"line_number":97,"context_line":"            m \u003d FIlter_ID_REGEX.match(line)"},{"line_number":98,"context_line":"            if m:"},{"line_number":99,"context_line":"                filter_id \u003d m.group(1)"},{"line_number":100,"context_line":"                filterids.append(filter_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_d1399af2","line":97,"updated":"2017-10-30 10:04:56.000000000","message":"nit: s/FIlter/FILTER","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"480cd9f95c3e02d8ee1aaff39625afaf1a59fb9f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":95,"context_line":"        for line in filter_results:"},{"line_number":96,"context_line":"            line \u003d line.strip()"},{"line_number":97,"context_line":"            m \u003d FIlter_ID_REGEX.match(line)"},{"line_number":98,"context_line":"            if m:"},{"line_number":99,"context_line":"                filter_id \u003d m.group(1)"},{"line_number":100,"context_line":"                filterids.append(filter_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_57b7da3b","line":97,"in_reply_to":"3f4b6375_d1399af2","updated":"2017-10-30 11:10:09.000000000","message":"Done","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"584e093604747f4ea545e50b1dfc1a60af90fa02","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        return qdisc_id"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_b13e1ed8","line":141,"updated":"2017-10-30 10:04:56.000000000","message":"why You split it into 2 different classes instead if put all methods in one?","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"480cd9f95c3e02d8ee1aaff39625afaf1a59fb9f","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        return qdisc_id"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_77d8967e","line":141,"in_reply_to":"3f4b6375_b13e1ed8","updated":"2017-10-30 11:10:09.000000000","message":"For readability, put all the `public` methods here.","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"584e093604747f4ea545e50b1dfc1a60af90fa02","unresolved":false,"context_lines":[{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."},{"line_number":145,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":146,"context_line":"        if not qdisc_id:"},{"line_number":147,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_912322bf","line":144,"updated":"2017-10-30 10:04:56.000000000","message":"do You really need to add methods now for \"future\" use?","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1e1f23c70afdf31f4566173d9fe32bbc97146e3b","unresolved":false,"context_lines":[{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."},{"line_number":145,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":146,"context_line":"        if not qdisc_id:"},{"line_number":147,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_8354f155","line":144,"in_reply_to":"3f4b6375_77c1b680","updated":"2017-10-30 15:41:25.000000000","message":"yes, but if so, why not add methods to cover all tc functions into this lib? IMHO it\u0027s not necessary to add code which will be not used at all.\nYou can add it when it will be needed.\nI might be also confusing if someone will check \"git blame\" and check Your commit then - it might look that this function was required to make bw limit working for FIP","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1de8786b55118ec83faf32a5db7165db5eda8019","unresolved":false,"context_lines":[{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."},{"line_number":145,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":146,"context_line":"        if not qdisc_id:"},{"line_number":147,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_e620419e","line":144,"in_reply_to":"3f4b6375_8354f155","updated":"2017-10-31 03:19:24.000000000","message":"Done","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"480cd9f95c3e02d8ee1aaff39625afaf1a59fb9f","unresolved":false,"context_lines":[{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."},{"line_number":145,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":146,"context_line":"        if not qdisc_id:"},{"line_number":147,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_77c1b680","line":144,"in_reply_to":"3f4b6375_912322bf","updated":"2017-10-30 11:10:09.000000000","message":"Nothing hurt either, right? : )","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"584e093604747f4ea545e50b1dfc1a60af90fa02","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":206,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":207,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":208,"context_line":"            LOG.warning(\"No filter found for IP %(ip)s in %(direction)s, \""},{"line_number":209,"context_line":"                        \"skipping deletion.\","},{"line_number":210,"context_line":"                        {\u0027ip\u0027: ip,"},{"line_number":211,"context_line":"                         \u0027direction\u0027: direction})"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_7120a6b1","line":208,"updated":"2017-10-30 10:04:56.000000000","message":"is it really warning? maybe INFO would be enough?","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"480cd9f95c3e02d8ee1aaff39625afaf1a59fb9f","unresolved":false,"context_lines":[{"line_number":205,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":206,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":207,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":208,"context_line":"            LOG.warning(\"No filter found for IP %(ip)s in %(direction)s, \""},{"line_number":209,"context_line":"                        \"skipping deletion.\","},{"line_number":210,"context_line":"                        {\u0027ip\u0027: ip,"},{"line_number":211,"context_line":"                         \u0027direction\u0027: direction})"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_b744ce1c","line":208,"in_reply_to":"3f4b6375_7120a6b1","updated":"2017-10-30 11:10:09.000000000","message":"Done","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"65a5b3b09f1be53f52cc5661229591c4e1772488","unresolved":false,"context_lines":[{"line_number":27,"context_line":"FILTER_STATS_REGEX \u003d re.compile(r\"Sent (\\w+) bytes (\\w+) pkts *\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _execute_tc_cmd(self, cmd, **kwargs):"},{"line_number":33,"context_line":"        cmd \u003d [\u0027tc\u0027] + cmd"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_492df344","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":29},"updated":"2017-10-30 22:06:22.000000000","message":"Should this be _FloatingIPTcCommandBase?","commit_id":"af697bf127ffc50ee52638e327e011ab6faa4738"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4a307431bfebe3bfb4080f0a90712fa8396c993e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"FILTER_STATS_REGEX \u003d re.compile(r\"Sent (\\w+) bytes (\\w+) pkts *\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class FloatingIPTcCommandBase(ip_lib.IPDevice):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _execute_tc_cmd(self, cmd, **kwargs):"},{"line_number":33,"context_line":"        cmd \u003d [\u0027tc\u0027] + cmd"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_06035d0f","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":29},"in_reply_to":"3f4b6375_492df344","updated":"2017-10-31 03:13:57.000000000","message":"It has a suffix `Base`. : )","commit_id":"af697bf127ffc50ee52638e327e011ab6faa4738"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"65a5b3b09f1be53f52cc5661229591c4e1772488","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                filterids.append(filter_id)"},{"line_number":101,"context_line":"        return filterids"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _get_filter_statictics_line(self, qdisc_id, ip):"},{"line_number":104,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":105,"context_line":"        for index, line in enumerate(filter_results):"},{"line_number":106,"context_line":"            line \u003d line.strip()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_cf6b231d","line":103,"updated":"2017-10-30 22:06:22.000000000","message":"see comment to L143","commit_id":"af697bf127ffc50ee52638e327e011ab6faa4738"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4a307431bfebe3bfb4080f0a90712fa8396c993e","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                filterids.append(filter_id)"},{"line_number":101,"context_line":"        return filterids"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _get_filter_statictics_line(self, qdisc_id, ip):"},{"line_number":104,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":105,"context_line":"        for index, line in enumerate(filter_results):"},{"line_number":106,"context_line":"            line \u003d line.strip()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_c60c253d","line":103,"in_reply_to":"3f4b6375_cf6b231d","updated":"2017-10-31 03:13:57.000000000","message":"Done","commit_id":"af697bf127ffc50ee52638e327e011ab6faa4738"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"65a5b3b09f1be53f52cc5661229591c4e1772488","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."},{"line_number":145,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":146,"context_line":"        if not qdisc_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_af3a2731","line":143,"updated":"2017-10-30 22:06:22.000000000","message":"IMO this future method should be removed. You justified separating private and public methods of readability grounds. I buy it. But by the similar reasoning, readability is also affected by having code that is not used. It confuses reviewers and readers","commit_id":"af697bf127ffc50ee52638e327e011ab6faa4738"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4a307431bfebe3bfb4080f0a90712fa8396c993e","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"class FloatingIPTcCommand(FloatingIPTcCommandBase):"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_traffic_counters(self, direction, ip):"},{"line_number":144,"context_line":"        # RESERVED: for future use."},{"line_number":145,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"},{"line_number":146,"context_line":"        if not qdisc_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_860e2d30","line":143,"in_reply_to":"3f4b6375_af3a2731","updated":"2017-10-31 03:13:57.000000000","message":"Done, removed.","commit_id":"af697bf127ffc50ee52638e327e011ab6faa4738"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def _execute_tc_cmd(self, cmd, **kwargs):"},{"line_number":33,"context_line":"        cmd \u003d [\u0027tc\u0027] + cmd"},{"line_number":34,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(self.namespace)"},{"line_number":35,"context_line":"        return ip_wrapper.netns.execute(cmd, run_as_root\u003dTrue, **kwargs)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _get_qdiscs(self):"},{"line_number":38,"context_line":"        cmd \u003d [\u0027qdisc\u0027, \u0027show\u0027, \u0027dev\u0027, self.name]"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_3b458218","line":35,"updated":"2017-11-09 19:32:46.000000000","message":"Just thinking out loud - almost makes me think the ip_lib code should not hardcode the command to [\u0027ip\u0027] in it\u0027s _execute() code, but that\u0027s not something to do here, maybe a future re-factor since it might allow for more re-use.","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_filterid_for_ip(self, qdisc_id, ip):"},{"line_number":66,"context_line":"        filterids_for_ip \u003d []"},{"line_number":67,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":68,"context_line":"        for line in filter_results:"},{"line_number":69,"context_line":"            line \u003d line.strip()"},{"line_number":70,"context_line":"            parts \u003d line.split(\" \")"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_5b56fe08","line":67,"updated":"2017-11-09 19:32:46.000000000","message":"Can _get_filters() return None?","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_filterid_for_ip(self, qdisc_id, ip):"},{"line_number":66,"context_line":"        filterids_for_ip \u003d []"},{"line_number":67,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":68,"context_line":"        for line in filter_results:"},{"line_number":69,"context_line":"            line \u003d line.strip()"},{"line_number":70,"context_line":"            parts \u003d line.split(\" \")"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_d8442fba","line":67,"in_reply_to":"1f485f77_5b56fe08","updated":"2017-11-10 02:47:30.000000000","message":"Will add a condition and test cases.","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":68,"context_line":"        for line in filter_results:"},{"line_number":69,"context_line":"            line \u003d line.strip()"},{"line_number":70,"context_line":"            parts \u003d line.split(\" \")"},{"line_number":71,"context_line":"            m \u003d FILTER_ID_REGEX.match(line)"},{"line_number":72,"context_line":"            if m:"},{"line_number":73,"context_line":"                filter_id \u003d m.group(1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_205f9342","line":70,"updated":"2017-11-09 19:32:46.000000000","message":"nit: could move to L78 since it\u0027s not used in some cases until then","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":68,"context_line":"        for line in filter_results:"},{"line_number":69,"context_line":"            line \u003d line.strip()"},{"line_number":70,"context_line":"            parts \u003d line.split(\" \")"},{"line_number":71,"context_line":"            m \u003d FILTER_ID_REGEX.match(line)"},{"line_number":72,"context_line":"            if m:"},{"line_number":73,"context_line":"                filter_id \u003d m.group(1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_183be738","line":70,"in_reply_to":"1f485f77_205f9342","updated":"2017-11-10 02:47:30.000000000","message":"Done","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                filterids_for_ip.append(filter_id)"},{"line_number":80,"context_line":"        if len(filterids_for_ip) \u003e 1:"},{"line_number":81,"context_line":"            raise exceptions.MultipleFilterIDForIPFound(ip\u003dip)"},{"line_number":82,"context_line":"        if len(filterids_for_ip) \u003d\u003d 0:"},{"line_number":83,"context_line":"            raise exceptions.FilterIDForIPNotFound(ip\u003dip)"},{"line_number":84,"context_line":"        return filterids_for_ip[0]"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_a04b8385","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":10},"updated":"2017-11-09 19:32:46.000000000","message":"nit: s/elif","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                filterids_for_ip.append(filter_id)"},{"line_number":80,"context_line":"        if len(filterids_for_ip) \u003e 1:"},{"line_number":81,"context_line":"            raise exceptions.MultipleFilterIDForIPFound(ip\u003dip)"},{"line_number":82,"context_line":"        if len(filterids_for_ip) \u003d\u003d 0:"},{"line_number":83,"context_line":"            raise exceptions.FilterIDForIPNotFound(ip\u003dip)"},{"line_number":84,"context_line":"        return filterids_for_ip[0]"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_982fd7f5","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":10},"in_reply_to":"1f485f77_a04b8385","updated":"2017-11-10 02:47:30.000000000","message":"Done","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _get_qdisc_filters(self, qdisc_id):"},{"line_number":93,"context_line":"        filterids \u003d []"},{"line_number":94,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":95,"context_line":"        for line in filter_results:"},{"line_number":96,"context_line":"            line \u003d line.strip()"},{"line_number":97,"context_line":"            m \u003d FILTER_ID_REGEX.match(line)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_3b5b422f","line":94,"updated":"2017-11-09 19:32:46.000000000","message":"Can _get_filters() return None?","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _get_qdisc_filters(self, qdisc_id):"},{"line_number":93,"context_line":"        filterids \u003d []"},{"line_number":94,"context_line":"        filter_results \u003d self._get_filters(qdisc_id).split(\u0027\\n\u0027)"},{"line_number":95,"context_line":"        for line in filter_results:"},{"line_number":96,"context_line":"            line \u003d line.strip()"},{"line_number":97,"context_line":"            m \u003d FILTER_ID_REGEX.match(line)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_987d97e9","line":94,"in_reply_to":"1f485f77_3b5b422f","updated":"2017-11-10 02:47:30.000000000","message":"ditto","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":164,"context_line":"            LOG.debug(\"Filter %(filter)s for IP %(ip)s in %(direction)s \""},{"line_number":165,"context_line":"                      \"qdisc already existed. Do updating.\","},{"line_number":166,"context_line":"                      {\u0027filter\u0027: filter_id,"},{"line_number":167,"context_line":"                       \u0027ip\u0027: ip,"},{"line_number":168,"context_line":"                       \u0027direction\u0027: direction})"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_5b7dde6c","line":165,"range":{"start_line":165,"start_character":37,"end_line":165,"end_character":57},"updated":"2017-11-09 19:32:46.000000000","message":"s/existed, removing.\n\nThen the \"add\" debug message will cover the rest.","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        try:"},{"line_number":163,"context_line":"            filter_id \u003d self._get_filterid_for_ip(qdisc_id, ip)"},{"line_number":164,"context_line":"            LOG.debug(\"Filter %(filter)s for IP %(ip)s in %(direction)s \""},{"line_number":165,"context_line":"                      \"qdisc already existed. Do updating.\","},{"line_number":166,"context_line":"                      {\u0027filter\u0027: filter_id,"},{"line_number":167,"context_line":"                       \u0027ip\u0027: ip,"},{"line_number":168,"context_line":"                       \u0027direction\u0027: direction})"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_b82a93e4","line":165,"range":{"start_line":165,"start_character":37,"end_line":165,"end_character":57},"in_reply_to":"1f485f77_5b7dde6c","updated":"2017-11-10 02:47:30.000000000","message":"Done","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                       \u0027ip\u0027: ip,"},{"line_number":168,"context_line":"                       \u0027direction\u0027: direction})"},{"line_number":169,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":170,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":171,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":172,"context_line":"            LOG.debug(\"Adding filter for IP %(ip)s in %(direction)s.\","},{"line_number":173,"context_line":"                      {\u0027ip\u0027: ip,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_3ba902df","line":170,"updated":"2017-11-09 19:32:46.000000000","message":"I think this can be removed","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                       \u0027ip\u0027: ip,"},{"line_number":168,"context_line":"                       \u0027direction\u0027: direction})"},{"line_number":169,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":170,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":171,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":172,"context_line":"            LOG.debug(\"Adding filter for IP %(ip)s in %(direction)s.\","},{"line_number":173,"context_line":"                      {\u0027ip\u0027: ip,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_d8ef8fae","line":170,"in_reply_to":"1f485f77_3ba902df","updated":"2017-11-10 02:47:30.000000000","message":"Done","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            LOG.debug(\"Adding filter for IP %(ip)s in %(direction)s.\","},{"line_number":173,"context_line":"                      {\u0027ip\u0027: ip,"},{"line_number":174,"context_line":"                       \u0027direction\u0027: direction})"},{"line_number":175,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"},{"line_number":178,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_dbb78e3a","line":175,"updated":"2017-11-09 19:32:46.000000000","message":"and L172 to here un-indented.  This really just needs a \u0027pass\u0027 here since it\u0027s catching the _del_filter_by_id() exception.","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            LOG.debug(\"Adding filter for IP %(ip)s in %(direction)s.\","},{"line_number":173,"context_line":"                      {\u0027ip\u0027: ip,"},{"line_number":174,"context_line":"                       \u0027direction\u0027: direction})"},{"line_number":175,"context_line":"            self._add_filter(qdisc_id, direction, ip, rate, burst)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def clear_ip_rate_limit(self, direction, ip):"},{"line_number":178,"context_line":"        qdisc_id \u003d self._get_qdisc_id_for_filter(direction)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_f8f24b9a","line":175,"in_reply_to":"1f485f77_dbb78e3a","updated":"2017-11-10 02:47:30.000000000","message":"Done","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"72999fe51df6bc91b8c6bd2ab4cda058e7f13695","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":184,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":185,"context_line":"            LOG.warning(\"No filter found for IP %(ip)s in %(direction)s, \""},{"line_number":186,"context_line":"                        \"skipping deletion.\","},{"line_number":187,"context_line":"                        {\u0027ip\u0027: ip,"},{"line_number":188,"context_line":"                         \u0027direction\u0027: direction})"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_fbd80a80","line":186,"range":{"start_line":186,"start_character":24,"end_line":186,"end_character":44},"updated":"2017-11-09 19:32:46.000000000","message":"Don\u0027t think you need this \"skipping deletion\" since it was already tried and just failed.  Also, should this be at warning level or just debug?  Technically the filter was cleared.","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1756b1d26137f15d1a5c431d52592b875fa1885b","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            self._del_filter_by_id(qdisc_id, filter_id)"},{"line_number":184,"context_line":"        except exceptions.FilterIDForIPNotFound:"},{"line_number":185,"context_line":"            LOG.warning(\"No filter found for IP %(ip)s in %(direction)s, \""},{"line_number":186,"context_line":"                        \"skipping deletion.\","},{"line_number":187,"context_line":"                        {\u0027ip\u0027: ip,"},{"line_number":188,"context_line":"                         \u0027direction\u0027: direction})"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_18f64791","line":186,"range":{"start_line":186,"start_character":24,"end_line":186,"end_character":44},"in_reply_to":"1f485f77_fbd80a80","updated":"2017-11-10 02:47:30.000000000","message":"Done, will set to debug level","commit_id":"b89d6fac9bf906efb5cebdfa5d4c9881bf1b5c44"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"59f900471506cb2ff7aa20f79e779e5afd43194a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def _get_filterid_for_ip(self, qdisc_id, ip):"},{"line_number":66,"context_line":"        filterids_for_ip \u003d []"},{"line_number":67,"context_line":"        filters_output \u003d self._get_filters(qdisc_id)"},{"line_number":68,"context_line":"        if not filters_output:"},{"line_number":69,"context_line":"            raise exceptions.FilterIDForIPNotFound(ip\u003dip)"},{"line_number":70,"context_line":"        filter_lines \u003d filters_output.split(\u0027\\n\u0027)"},{"line_number":71,"context_line":"        for line in filter_lines:"},{"line_number":72,"context_line":"            line \u003d line.strip()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1f485f77_1c6dfb03","line":69,"range":{"start_line":68,"start_character":1,"end_line":69,"end_character":57},"updated":"2017-11-13 02:48:12.000000000","message":"just a nic:\nThis line raise the same exception with L86, and here means no output by qdisc_id, L86 means there is no some string match \u0027IP/32\u0027. Looks like not the same. Just a question. Please feel free to correct. Thanks","commit_id":"629c3d685209c96b0197d4e0b92eb52d030366c2"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ec9a687bd5493600bdaf4d44020e20c25db7247c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def _get_filterid_for_ip(self, qdisc_id, ip):"},{"line_number":66,"context_line":"        filterids_for_ip \u003d []"},{"line_number":67,"context_line":"        filters_output \u003d self._get_filters(qdisc_id)"},{"line_number":68,"context_line":"        if not filters_output:"},{"line_number":69,"context_line":"            raise exceptions.FilterIDForIPNotFound(ip\u003dip)"},{"line_number":70,"context_line":"        filter_lines \u003d filters_output.split(\u0027\\n\u0027)"},{"line_number":71,"context_line":"        for line in filter_lines:"},{"line_number":72,"context_line":"            line \u003d line.strip()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1f485f77_ffa9f1de","line":69,"range":{"start_line":68,"start_character":1,"end_line":69,"end_character":57},"in_reply_to":"1f485f77_1c6dfb03","updated":"2017-11-13 02:54:08.000000000","message":"Here means if _get_filters return a None or empty str, we can not find a filter of an IP at all.\n\nL86 is that there are many filters, but no one is matched this IP.\n\nThank you for the feedback. : )","commit_id":"629c3d685209c96b0197d4e0b92eb52d030366c2"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5ff2e18cbc2bad5d4d24df2a6918eed710c7059a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def _get_filterid_for_ip(self, qdisc_id, ip):"},{"line_number":66,"context_line":"        filterids_for_ip \u003d []"},{"line_number":67,"context_line":"        filters_output \u003d self._get_filters(qdisc_id)"},{"line_number":68,"context_line":"        if not filters_output:"},{"line_number":69,"context_line":"            raise exceptions.FilterIDForIPNotFound(ip\u003dip)"},{"line_number":70,"context_line":"        filter_lines \u003d filters_output.split(\u0027\\n\u0027)"},{"line_number":71,"context_line":"        for line in filter_lines:"},{"line_number":72,"context_line":"            line \u003d line.strip()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1f485f77_0d9ff05f","line":69,"range":{"start_line":68,"start_character":1,"end_line":69,"end_character":57},"in_reply_to":"1f485f77_ffa9f1de","updated":"2017-11-13 21:34:28.000000000","message":"Yes, I noticed the same thing, but was thinking there could be just one line, but I think it will complicate the code.","commit_id":"629c3d685209c96b0197d4e0b92eb52d030366c2"},{"author":{"_account_id":23430,"name":"sunzuohua","email":"zuohuasun@gmail.com","username":"ZuohuaSun"},"change_message_id":"94b2b52c8a16c98c8de92a52068fdfec05df1a00","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        )"},{"line_number":115,"context_line":"        protocol \u003d [\u0027protocol\u0027, \u0027ip\u0027]"},{"line_number":116,"context_line":"        prio \u003d [\u0027prio\u0027, 1]"},{"line_number":117,"context_line":"        _match \u003d \u0027src\u0027 if direction \u003d\u003d constants.EGRESS_DIRECTION else \u0027dst\u0027"},{"line_number":118,"context_line":"        match \u003d [\u0027u32\u0027, \u0027match\u0027, \u0027ip\u0027, _match, ip]"},{"line_number":119,"context_line":"        police \u003d [\u0027police\u0027, \u0027rate\u0027, rate_value, \u0027burst\u0027, burst_value,"},{"line_number":120,"context_line":"                  \u0027drop\u0027, \u0027flowid\u0027, \u0027:1\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff82abbf_f9b8ff76","line":117,"updated":"2017-11-23 01:28:01.000000000","message":"I have tried to limit the bandwidth using your method. But it failed in the direction of egress and succeed in the direction of ingress.Did you test them successfully in both directions?","commit_id":"f40128b437e58e39efc9f02af7135c02f7826b42"}],"neutron/tests/functional/agent/linux/test_l3_tc_lib.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"584e093604747f4ea545e50b1dfc1a60af90fa02","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TcLibTestCase(functional_base.BaseSudoTestCase):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def create_namespace_and_device(self):"},{"line_number":31,"context_line":"        ns_name \u003d uuidutils.generate_uuid()"},{"line_number":32,"context_line":"        namespace \u003d namespaces.Namespace("},{"line_number":33,"context_line":"            ns_name, None,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_31558e1e","line":30,"updated":"2017-10-30 10:04:56.000000000","message":"I see some inconsistency here: name of method is \"create_namespace_and_device\" and it returns You wrapper to FloatingIPTcCommand object, maybe name of this method should be changed?","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"480cd9f95c3e02d8ee1aaff39625afaf1a59fb9f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TcLibTestCase(functional_base.BaseSudoTestCase):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def create_namespace_and_device(self):"},{"line_number":31,"context_line":"        ns_name \u003d uuidutils.generate_uuid()"},{"line_number":32,"context_line":"        namespace \u003d namespaces.Namespace("},{"line_number":33,"context_line":"            ns_name, None,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_3750ded4","line":30,"in_reply_to":"3f4b6375_31558e1e","updated":"2017-10-30 11:10:09.000000000","message":"Done","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"cf68ab86fcad9283df07747803b37582f40311cd","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TcLibTestCase(functional_base.BaseSudoTestCase):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def create_namespace_and_device(self):"},{"line_number":31,"context_line":"        ns_name \u003d uuidutils.generate_uuid()"},{"line_number":32,"context_line":"        namespace \u003d namespaces.Namespace("},{"line_number":33,"context_line":"            ns_name, None,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_bc5dd5ea","line":30,"in_reply_to":"3f4b6375_31558e1e","updated":"2017-10-30 10:23:09.000000000","message":"I think You can move it to setUp() class and then it should be executed before each of tests","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"eb0fd287e775fe5d43ac7ee6f612e2d29757e3b0","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TcLibTestCase(functional_base.BaseSudoTestCase):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def create_namespace_and_device(self):"},{"line_number":31,"context_line":"        ns_name \u003d uuidutils.generate_uuid()"},{"line_number":32,"context_line":"        namespace \u003d namespaces.Namespace("},{"line_number":33,"context_line":"            ns_name, None,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_f35d9715","line":30,"in_reply_to":"3f4b6375_35943a44","updated":"2017-10-31 11:00:00.000000000","message":"Firstly, I think current implementation is enough. Secondly, each test case needs a tc warpper, how to send the namespace/or namespace-name to each case? Add class attributes will case that race condition. So let\u0027s save the time and move forward. : )","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1e1f23c70afdf31f4566173d9fe32bbc97146e3b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TcLibTestCase(functional_base.BaseSudoTestCase):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def create_namespace_and_device(self):"},{"line_number":31,"context_line":"        ns_name \u003d uuidutils.generate_uuid()"},{"line_number":32,"context_line":"        namespace \u003d namespaces.Namespace("},{"line_number":33,"context_line":"            ns_name, None,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_e3ca8518","line":30,"in_reply_to":"3f4b6375_3750ded4","updated":"2017-10-30 15:41:25.000000000","message":"how about using setUp() method?","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"0e18f2cc43588e5b6b703e6a75bdb48109c9b907","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TcLibTestCase(functional_base.BaseSudoTestCase):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def create_namespace_and_device(self):"},{"line_number":31,"context_line":"        ns_name \u003d uuidutils.generate_uuid()"},{"line_number":32,"context_line":"        namespace \u003d namespaces.Namespace("},{"line_number":33,"context_line":"            ns_name, None,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_35943a44","line":30,"in_reply_to":"3f4b6375_4646f551","updated":"2017-10-31 07:57:30.000000000","message":"can\u0027t You use some random namespace name for each of those tests? It should prevent such race conditions.\nAlso how Your method which is running at the beginning of each test (exactly as setUp) can prevent such races?","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1de8786b55118ec83faf32a5db7165db5eda8019","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TcLibTestCase(functional_base.BaseSudoTestCase):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def create_namespace_and_device(self):"},{"line_number":31,"context_line":"        ns_name \u003d uuidutils.generate_uuid()"},{"line_number":32,"context_line":"        namespace \u003d namespaces.Namespace("},{"line_number":33,"context_line":"            ns_name, None,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_4646f551","line":30,"in_reply_to":"3f4b6375_e3ca8518","updated":"2017-10-31 03:19:24.000000000","message":"Seems a race condition will be raised that way, one case try to do tc stuffs in namespace and one try to cleanup the ns.","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"584e093604747f4ea545e50b1dfc1a60af90fa02","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        namespace.create()"},{"line_number":36,"context_line":"        self.addCleanup(namespace.delete)"},{"line_number":37,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dns_name)"},{"line_number":38,"context_line":"        tc_device \u003d ip_wrapper.add_tuntap(DEV_NAME)"},{"line_number":39,"context_line":"        tc_device.link.set_up()"},{"line_number":40,"context_line":"        return l3_tc_lib.FloatingIPTcCommand("},{"line_number":41,"context_line":"            DEV_NAME,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_11305207","line":38,"updated":"2017-10-30 10:04:56.000000000","message":"don\u0027t You need to add cleanup function for this tuntap device?","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"480cd9f95c3e02d8ee1aaff39625afaf1a59fb9f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        namespace.create()"},{"line_number":36,"context_line":"        self.addCleanup(namespace.delete)"},{"line_number":37,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dns_name)"},{"line_number":38,"context_line":"        tc_device \u003d ip_wrapper.add_tuntap(DEV_NAME)"},{"line_number":39,"context_line":"        tc_device.link.set_up()"},{"line_number":40,"context_line":"        return l3_tc_lib.FloatingIPTcCommand("},{"line_number":41,"context_line":"            DEV_NAME,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_57535ae3","line":38,"in_reply_to":"3f4b6375_11305207","updated":"2017-10-30 11:10:09.000000000","message":"It will be removed since the namespace is cleared up.","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"1e1f23c70afdf31f4566173d9fe32bbc97146e3b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        namespace.create()"},{"line_number":36,"context_line":"        self.addCleanup(namespace.delete)"},{"line_number":37,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dns_name)"},{"line_number":38,"context_line":"        tc_device \u003d ip_wrapper.add_tuntap(DEV_NAME)"},{"line_number":39,"context_line":"        tc_device.link.set_up()"},{"line_number":40,"context_line":"        return l3_tc_lib.FloatingIPTcCommand("},{"line_number":41,"context_line":"            DEV_NAME,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f4b6375_234bfdb0","line":38,"in_reply_to":"3f4b6375_57535ae3","updated":"2017-10-30 15:41:25.000000000","message":"ok","commit_id":"3c3631911f5dce721efb738cdc1ce3c937c500bf"}],"neutron/tests/unit/agent/linux/test_l3_tc_lib.py":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"79ade5e4f1970b1c820a036b3ad5edf29fb46fd8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"FILETER_ID_2 \u003d \"800::801\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"TC_INGRESS_FILTERS \u003d ("},{"line_number":28,"context_line":"    \u0027filter protocol ip u32 \\n\u0027"},{"line_number":29,"context_line":"    \u0027filter protocol ip u32 fh 800: ht divisor 1 \\n\u0027"},{"line_number":30,"context_line":"    \u0027filter protocol ip u32 fh %(filter_id1)s order 2048 key \u0027"},{"line_number":31,"context_line":"    \u0027ht 800 bkt 0 \u0027"},{"line_number":32,"context_line":"    \u0027flowid :1  (rule hit 0 success 0)\\n\u0027"},{"line_number":33,"context_line":"    \u0027  match IP dst %(fip1)s/32 (success 0 ) \\n\u0027"},{"line_number":34,"context_line":"    \u0027 police 0x3 rate 3000Kbit burst 3Mb mtu 64Kb action drop overhead 0b \\n\u0027"},{"line_number":35,"context_line":"    \u0027ref 1 bind 1\\n\u0027"},{"line_number":36,"context_line":"    \u0027\\n\u0027"},{"line_number":37,"context_line":"    \u0027 Sent 111 bytes 222 pkts (dropped 0, overlimits 0) \\n\u0027"},{"line_number":38,"context_line":"    \u0027filter protocol ip u32 fh %(filter_id2)s order 2049 key \u0027"},{"line_number":39,"context_line":"    \u0027ht 800 bkt 0 \u0027"},{"line_number":40,"context_line":"    \u0027flowid :1  (rule hit 0 success 0)\\n\u0027"},{"line_number":41,"context_line":"    \u0027  match IP dst %(fip2)s/32 (success 0 ) \\n\u0027"},{"line_number":42,"context_line":"    \u0027 police 0x1b rate 22000Kbit burst 22Mb mtu 64Kb action drop \u0027"},{"line_number":43,"context_line":"    \u0027overhead 0b \\n\u0027"},{"line_number":44,"context_line":"    \u0027ref 1 bind 1\\n\u0027"},{"line_number":45,"context_line":"    \u0027\\n\u0027"},{"line_number":46,"context_line":"    \u0027 Sent 111 bytes 222 pkts (dropped 0, overlimits 0)\\n\u0027) % {"},{"line_number":47,"context_line":"        \"filter_id1\": FILETER_ID_1,"},{"line_number":48,"context_line":"        \"fip1\": FLOATING_IP_1,"},{"line_number":49,"context_line":"        \"filter_id2\": FILETER_ID_2,"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_3f7d13e7","line":46,"range":{"start_line":28,"start_character":4,"end_line":46,"end_character":58},"updated":"2017-08-02 04:14:51.000000000","message":"use docstring will help you avoid multiple lines concatenation and manual newline (\\n)","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0768b1bb87cdecd94948f006f047334ecadd446f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"FILETER_ID_2 \u003d \"800::801\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"TC_INGRESS_FILTERS \u003d ("},{"line_number":28,"context_line":"    \u0027filter protocol ip u32 \\n\u0027"},{"line_number":29,"context_line":"    \u0027filter protocol ip u32 fh 800: ht divisor 1 \\n\u0027"},{"line_number":30,"context_line":"    \u0027filter protocol ip u32 fh %(filter_id1)s order 2048 key \u0027"},{"line_number":31,"context_line":"    \u0027ht 800 bkt 0 \u0027"},{"line_number":32,"context_line":"    \u0027flowid :1  (rule hit 0 success 0)\\n\u0027"},{"line_number":33,"context_line":"    \u0027  match IP dst %(fip1)s/32 (success 0 ) \\n\u0027"},{"line_number":34,"context_line":"    \u0027 police 0x3 rate 3000Kbit burst 3Mb mtu 64Kb action drop overhead 0b \\n\u0027"},{"line_number":35,"context_line":"    \u0027ref 1 bind 1\\n\u0027"},{"line_number":36,"context_line":"    \u0027\\n\u0027"},{"line_number":37,"context_line":"    \u0027 Sent 111 bytes 222 pkts (dropped 0, overlimits 0) \\n\u0027"},{"line_number":38,"context_line":"    \u0027filter protocol ip u32 fh %(filter_id2)s order 2049 key \u0027"},{"line_number":39,"context_line":"    \u0027ht 800 bkt 0 \u0027"},{"line_number":40,"context_line":"    \u0027flowid :1  (rule hit 0 success 0)\\n\u0027"},{"line_number":41,"context_line":"    \u0027  match IP dst %(fip2)s/32 (success 0 ) \\n\u0027"},{"line_number":42,"context_line":"    \u0027 police 0x1b rate 22000Kbit burst 22Mb mtu 64Kb action drop \u0027"},{"line_number":43,"context_line":"    \u0027overhead 0b \\n\u0027"},{"line_number":44,"context_line":"    \u0027ref 1 bind 1\\n\u0027"},{"line_number":45,"context_line":"    \u0027\\n\u0027"},{"line_number":46,"context_line":"    \u0027 Sent 111 bytes 222 pkts (dropped 0, overlimits 0)\\n\u0027) % {"},{"line_number":47,"context_line":"        \"filter_id1\": FILETER_ID_1,"},{"line_number":48,"context_line":"        \"fip1\": FLOATING_IP_1,"},{"line_number":49,"context_line":"        \"filter_id2\": FILETER_ID_2,"}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_970b757b","line":46,"range":{"start_line":28,"start_character":4,"end_line":46,"end_character":58},"in_reply_to":"df3967d1_3f7d13e7","updated":"2017-08-04 06:47:04.000000000","message":"Nothing helpful, this is enough.","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"79ade5e4f1970b1c820a036b3ad5edf29fb46fd8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        \"fip2\": FLOATING_IP_2}"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"TC_INGRESS_FILTERS_DUP \u003d TC_INGRESS_FILTERS + ("},{"line_number":53,"context_line":"    \u0027filter protocol ip u32 fh %(filter_id2)s order 2049 key \u0027"},{"line_number":54,"context_line":"    \u0027ht 800 bkt 0 \u0027"},{"line_number":55,"context_line":"    \u0027flowid :1  (rule hit 0 success 0)\\n\u0027"},{"line_number":56,"context_line":"    \u0027  match IP dst %(fip2)s/32 (success 0 ) \\n\u0027"},{"line_number":57,"context_line":"    \u0027 police 0x1b rate 22000Kbit burst 22Mb mtu 64Kb action drop \u0027"},{"line_number":58,"context_line":"    \u0027overhead 0b \\n\u0027"},{"line_number":59,"context_line":"    \u0027ref 1 bind 1\\n\u0027"},{"line_number":60,"context_line":"    \u0027\\n\u0027"},{"line_number":61,"context_line":"    \u0027 Sent 111 bytes 222 pkts (dropped 0, overlimits 0)\\n\u0027) % {"},{"line_number":62,"context_line":"        \"filter_id2\": FILETER_ID_2,"},{"line_number":63,"context_line":"        \"fip2\": FLOATING_IP_2}"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"df3967d1_ff866bdb","line":61,"range":{"start_line":53,"start_character":4,"end_line":61,"end_character":58},"updated":"2017-08-02 04:14:51.000000000","message":"ditto","commit_id":"f82ddd3f4635963cf3ef80f90c39a0067d336689"}]}
