)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d4109e01eeff585a09e87934d376ab8073a5c68a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add ip_monitor command implemented using Pyroute2"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This method allows to track any IP address change in a"},{"line_number":10,"context_line":"namespace. In future patches, this method will replace"},{"line_number":11,"context_line":"the current IP monitor used in the keepalived_state_change"},{"line_number":12,"context_line":"daemon. The current implementation relays in a spawned shell,"},{"line_number":13,"context_line":"executed in root mode, and the output of this shell,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bfb3d3c7_93a4fba7","line":10,"range":{"start_line":10,"start_character":47,"end_line":10,"end_character":54},"updated":"2019-05-26 09:14:39.000000000","message":"Then how to upgrade, what will happen to the existing \"ip -o monitor\" processes? But yes, I may see the answer in the future patches.","commit_id":"6ae5ee53067f7dab1da0d3bc1f5832bcb4e3fdf8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"811761fd6ad38db4b962ea02704a6f10fc0f88e9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add ip_monitor command implemented using Pyroute2"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This method allows to track any IP address change in a"},{"line_number":10,"context_line":"namespace. In future patches, this method will replace"},{"line_number":11,"context_line":"the current IP monitor used in the keepalived_state_change"},{"line_number":12,"context_line":"daemon. The current implementation relays in a spawned shell,"},{"line_number":13,"context_line":"executed in root mode, and the output of this shell,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bfb3d3c7_24c060e1","line":10,"range":{"start_line":10,"start_character":47,"end_line":10,"end_character":54},"in_reply_to":"bfb3d3c7_93a4fba7","updated":"2019-05-26 19:14:34.000000000","message":"Yes, there is a WIP patch (very early patch, please don\u0027t waste time now reviewing it) using it: https://review.opendev.org/#/c/660722/","commit_id":"6ae5ee53067f7dab1da0d3bc1f5832bcb4e3fdf8"}],"etc/neutron/rootwrap.d/ip-monitor.filters":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d682b6b032137327581987724f3607094001d35e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"[Filters]"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"ip-monitor-functional-testing: CommandFilter, ip_monitor, root"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"bfb3d3c7_d66da504","line":11,"updated":"2019-05-23 07:38:55.000000000","message":"can\u0027t we add this filter to l3.filters file?","commit_id":"855d966f3fc98ff2a6013051830b7edc9503a0f4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"46bad4fd0d987a8dab69128cdbd4abe8825c43c4","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"[Filters]"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"ip-monitor-functional-testing: CommandFilter, ip_monitor, root"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"bfb3d3c7_070d4936","line":11,"in_reply_to":"bfb3d3c7_d66da504","updated":"2019-05-23 09:19:32.000000000","message":"It makes sense","commit_id":"855d966f3fc98ff2a6013051830b7edc9503a0f4"}],"neutron/tests/functional/agent/linux/bin/ip_monitor.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1254338236fceddc7b345a995aecb996ff443335","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def sigterm_handler(_signo, _stack_frame):"},{"line_number":33,"context_line":"    global GT_IP_MONITOR"},{"line_number":34,"context_line":"    global GT_READ"},{"line_number":35,"context_line":"    if GT_IP_MONITOR:"},{"line_number":36,"context_line":"        GT_IP_MONITOR.kill()"},{"line_number":37,"context_line":"    if GT_READ:"},{"line_number":38,"context_line":"        GT_READ.kill()"},{"line_number":39,"context_line":"    exit(0)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bfb3d3c7_d838673e","line":38,"range":{"start_line":35,"start_character":0,"end_line":38,"end_character":22},"updated":"2019-05-23 17:40:32.000000000","message":"This is not correct. spawn_n returns nothing. Also spawn_n creates a greenlet, not a greenthread.","commit_id":"44943b81aa5400c20e921e116b588012128072e6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8a46a555d6c7686643f40617bb89f5c04bedd413","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            f.write(jsonutils.dumps(retval) + \u0027\\n\u0027)"},{"line_number":55,"context_line":"            f.close()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    f \u003d open(temp_file, \u0027a+\u0027)"},{"line_number":58,"context_line":"    f.write(\u0027fistroooooo\\n\u0027)"},{"line_number":59,"context_line":"    f.close()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def main(temp_file, namespace):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bfb3d3c7_1fa8148b","line":59,"range":{"start_line":57,"start_character":0,"end_line":59,"end_character":13},"updated":"2019-05-24 14:00:36.000000000","message":"sorry, I need to remove this","commit_id":"668d132bd14598a02a343863c11f665640d76752"}],"neutron/tests/functional/agent/linux/test_ip_lib.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d682b6b032137327581987724f3607094001d35e","unresolved":false,"context_lines":[{"line_number":698,"context_line":"                for device in self.devices:"},{"line_number":699,"context_line":"                    priv_ip_lib.delete_interface(device, self.namespace)"},{"line_number":700,"context_line":"            except:"},{"line_number":701,"context_line":"                pass"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    @staticmethod"},{"line_number":704,"context_line":"    def _normalize_module_name(name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_69189e74","line":701,"range":{"start_line":701,"start_character":16,"end_line":701,"end_character":20},"updated":"2019-05-23 07:38:55.000000000","message":"should we simply hide all possible errors here? I\u0027m just asking, maybe it\u0027s fine as it is only tests :)","commit_id":"855d966f3fc98ff2a6013051830b7edc9503a0f4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"46bad4fd0d987a8dab69128cdbd4abe8825c43c4","unresolved":false,"context_lines":[{"line_number":698,"context_line":"                for device in self.devices:"},{"line_number":699,"context_line":"                    priv_ip_lib.delete_interface(device, self.namespace)"},{"line_number":700,"context_line":"            except:"},{"line_number":701,"context_line":"                pass"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    @staticmethod"},{"line_number":704,"context_line":"    def _normalize_module_name(name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_875ff90c","line":701,"range":{"start_line":701,"start_character":16,"end_line":701,"end_character":20},"in_reply_to":"bfb3d3c7_69189e74","updated":"2019-05-23 09:19:32.000000000","message":"Actually what I need to \"hide\" is the case when the network interface doesn\u0027t exist. I\u0027ll change that.","commit_id":"855d966f3fc98ff2a6013051830b7edc9503a0f4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d682b6b032137327581987724f3607094001d35e","unresolved":false,"context_lines":[{"line_number":725,"context_line":"                    registers.append({\u0027name\u0027: register[\u0027name\u0027],"},{"line_number":726,"context_line":"                                      \u0027cidr\u0027: register[\u0027cidr\u0027],"},{"line_number":727,"context_line":"                                      \u0027event\u0027: register[\u0027event\u0027]})"},{"line_number":728,"context_line":"            for ip_address in ip_addresses:"},{"line_number":729,"context_line":"                for _ in (r for r in registers if r \u003d\u003d ip_address):"},{"line_number":730,"context_line":"                    break"},{"line_number":731,"context_line":"                else:"},{"line_number":732,"context_line":"                    return False"},{"line_number":733,"context_line":"            else:"},{"line_number":734,"context_line":"                return True"},{"line_number":735,"context_line":"        except OSError:"},{"line_number":736,"context_line":"            return False"},{"line_number":737,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_c95aeaf1","line":734,"range":{"start_line":728,"start_character":0,"end_line":734,"end_character":27},"updated":"2019-05-23 07:38:55.000000000","message":"maybe it\u0027s only me but IMO something like:\n\n    for ip_address in ip_addresses:\n        if ip_address not in registers:\n            return False\n    return True\n\nis easier to read (and should have the same result I hope) :)","commit_id":"855d966f3fc98ff2a6013051830b7edc9503a0f4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"46bad4fd0d987a8dab69128cdbd4abe8825c43c4","unresolved":false,"context_lines":[{"line_number":725,"context_line":"                    registers.append({\u0027name\u0027: register[\u0027name\u0027],"},{"line_number":726,"context_line":"                                      \u0027cidr\u0027: register[\u0027cidr\u0027],"},{"line_number":727,"context_line":"                                      \u0027event\u0027: register[\u0027event\u0027]})"},{"line_number":728,"context_line":"            for ip_address in ip_addresses:"},{"line_number":729,"context_line":"                for _ in (r for r in registers if r \u003d\u003d ip_address):"},{"line_number":730,"context_line":"                    break"},{"line_number":731,"context_line":"                else:"},{"line_number":732,"context_line":"                    return False"},{"line_number":733,"context_line":"            else:"},{"line_number":734,"context_line":"                return True"},{"line_number":735,"context_line":"        except OSError:"},{"line_number":736,"context_line":"            return False"},{"line_number":737,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_27b96dcb","line":734,"range":{"start_line":728,"start_character":0,"end_line":734,"end_character":27},"in_reply_to":"bfb3d3c7_c95aeaf1","updated":"2019-05-23 09:19:32.000000000","message":"Much better!","commit_id":"855d966f3fc98ff2a6013051830b7edc9503a0f4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d4109e01eeff585a09e87934d376ab8073a5c68a","unresolved":false,"context_lines":[{"line_number":684,"context_line":"        self.devices \u003d [(\u0027int_\u0027 + uuidutils.generate_uuid())["},{"line_number":685,"context_line":"                        :constants.DEVICE_NAME_MAX_LEN] for _ in range(5)]"},{"line_number":686,"context_line":"        self.ip_wrapper \u003d ip_lib.IPWrapper(self.namespace)"},{"line_number":687,"context_line":"        # self.temp_file \u003d self.get_temp_file_path(\u0027out_\u0027 + self.devices[0] +"},{"line_number":688,"context_line":"        #                                          \u0027.tmp\u0027)"},{"line_number":689,"context_line":"        # RAH: to be removed."},{"line_number":690,"context_line":"        self.temp_file \u003d \u0027/home/zuul/logs/out_\u0027 + self.devices[0] + \u0027.tmp\u0027"},{"line_number":691,"context_line":"        self.proc \u003d self._run_ip_monitor(ip_monitor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bfb3d3c7_731ce7c0","line":688,"range":{"start_line":687,"start_character":8,"end_line":688,"end_character":58},"updated":"2019-05-26 09:14:39.000000000","message":"Use this?","commit_id":"6ae5ee53067f7dab1da0d3bc1f5832bcb4e3fdf8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"811761fd6ad38db4b962ea02704a6f10fc0f88e9","unresolved":false,"context_lines":[{"line_number":684,"context_line":"        self.devices \u003d [(\u0027int_\u0027 + uuidutils.generate_uuid())["},{"line_number":685,"context_line":"                        :constants.DEVICE_NAME_MAX_LEN] for _ in range(5)]"},{"line_number":686,"context_line":"        self.ip_wrapper \u003d ip_lib.IPWrapper(self.namespace)"},{"line_number":687,"context_line":"        # self.temp_file \u003d self.get_temp_file_path(\u0027out_\u0027 + self.devices[0] +"},{"line_number":688,"context_line":"        #                                          \u0027.tmp\u0027)"},{"line_number":689,"context_line":"        # RAH: to be removed."},{"line_number":690,"context_line":"        self.temp_file \u003d \u0027/home/zuul/logs/out_\u0027 + self.devices[0] + \u0027.tmp\u0027"},{"line_number":691,"context_line":"        self.proc \u003d self._run_ip_monitor(ip_monitor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bfb3d3c7_44c554f0","line":688,"range":{"start_line":687,"start_character":8,"end_line":688,"end_character":58},"in_reply_to":"bfb3d3c7_731ce7c0","updated":"2019-05-26 19:14:34.000000000","message":"Yes, I\u0027m still testing...","commit_id":"6ae5ee53067f7dab1da0d3bc1f5832bcb4e3fdf8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8aaf4a46715cea2c102f5cbdf76391751111df90","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        self._check_read_file(ip_addresses)"},{"line_number":776,"context_line":""},{"line_number":777,"context_line":"    def test_remove_interface(self):"},{"line_number":778,"context_line":"        for device in self.devices:"},{"line_number":779,"context_line":"            self.ip_wrapper.add_dummy(device)"},{"line_number":780,"context_line":"        utils.wait_until_true(lambda: self._read_file({}), timeout\u003d30)"},{"line_number":781,"context_line":"        ip_addresses \u003d ["},{"line_number":782,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.11/24\u0027, \u0027event\u0027: \u0027added\u0027,"},{"line_number":783,"context_line":"             \u0027name\u0027: self.devices[0]},"},{"line_number":784,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.12/24\u0027, \u0027event\u0027: \u0027added\u0027,"},{"line_number":785,"context_line":"             \u0027name\u0027: self.devices[1]},"},{"line_number":786,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.11/24\u0027, \u0027event\u0027: \u0027removed\u0027,"},{"line_number":787,"context_line":"             \u0027name\u0027: self.devices[0]},"},{"line_number":788,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.12/24\u0027, \u0027event\u0027: \u0027removed\u0027,"},{"line_number":789,"context_line":"             \u0027name\u0027: self.devices[1]},"},{"line_number":790,"context_line":"            {\u0027cidr\u0027: \u00272001:db8::11/64\u0027, \u0027event\u0027: \u0027added\u0027,"},{"line_number":791,"context_line":"             \u0027name\u0027: self.devices[4]},"},{"line_number":792,"context_line":"            {\u0027cidr\u0027: \u00272001:db8::11/64\u0027, \u0027event\u0027: \u0027removed\u0027,"},{"line_number":793,"context_line":"             \u0027name\u0027: self.devices[4]}]"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"        self._handle_ip_addresses(\u0027added\u0027, ip_addresses)"},{"line_number":796,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bfb3d3c7_b128fb96","line":793,"range":{"start_line":778,"start_character":0,"end_line":793,"end_character":38},"updated":"2019-05-28 10:34:53.000000000","message":"this is almost the same as L754-L771. Maybe You can merge it into one test which will first add addresses and then remove them? Should be a bit faster :)","commit_id":"97de888d2a8a564c3527f13552d40277fd815915"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"770eef50713f30c830742d7088c70bfba53d1298","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        self._check_read_file(ip_addresses)"},{"line_number":776,"context_line":""},{"line_number":777,"context_line":"    def test_remove_interface(self):"},{"line_number":778,"context_line":"        for device in self.devices:"},{"line_number":779,"context_line":"            self.ip_wrapper.add_dummy(device)"},{"line_number":780,"context_line":"        utils.wait_until_true(lambda: self._read_file({}), timeout\u003d30)"},{"line_number":781,"context_line":"        ip_addresses \u003d ["},{"line_number":782,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.11/24\u0027, \u0027event\u0027: \u0027added\u0027,"},{"line_number":783,"context_line":"             \u0027name\u0027: self.devices[0]},"},{"line_number":784,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.12/24\u0027, \u0027event\u0027: \u0027added\u0027,"},{"line_number":785,"context_line":"             \u0027name\u0027: self.devices[1]},"},{"line_number":786,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.11/24\u0027, \u0027event\u0027: \u0027removed\u0027,"},{"line_number":787,"context_line":"             \u0027name\u0027: self.devices[0]},"},{"line_number":788,"context_line":"            {\u0027cidr\u0027: \u0027192.168.250.12/24\u0027, \u0027event\u0027: \u0027removed\u0027,"},{"line_number":789,"context_line":"             \u0027name\u0027: self.devices[1]},"},{"line_number":790,"context_line":"            {\u0027cidr\u0027: \u00272001:db8::11/64\u0027, \u0027event\u0027: \u0027added\u0027,"},{"line_number":791,"context_line":"             \u0027name\u0027: self.devices[4]},"},{"line_number":792,"context_line":"            {\u0027cidr\u0027: \u00272001:db8::11/64\u0027, \u0027event\u0027: \u0027removed\u0027,"},{"line_number":793,"context_line":"             \u0027name\u0027: self.devices[4]}]"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"        self._handle_ip_addresses(\u0027added\u0027, ip_addresses)"},{"line_number":796,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bfb3d3c7_0cd8c91b","line":793,"range":{"start_line":778,"start_character":0,"end_line":793,"end_character":38},"in_reply_to":"bfb3d3c7_b128fb96","updated":"2019-05-28 16:23:32.000000000","message":"Done","commit_id":"97de888d2a8a564c3527f13552d40277fd815915"}]}
