)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c7728365e17b17b801bde548c57576623a8de66a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ARP updates happen at once."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Idd528c0b402d1c9fc4b030f2aaa6d641d86ec02a"},{"line_number":15,"context_line":"Closes-Bug: #1511134"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba5201f7_062fae88","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":6},"updated":"2017-01-11 14:52:15.000000000","message":"maybe not quite fair to say \u0027close\u0027 as the bug is about batching","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"caba0d475a90f342c22757bd893bc78c804eda38","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ARP updates happen at once."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Idd528c0b402d1c9fc4b030f2aaa6d641d86ec02a"},{"line_number":15,"context_line":"Closes-Bug: #1511134"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba5201f7_9606611a","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":6},"in_reply_to":"ba5201f7_062fae88","updated":"2017-01-11 17:48:17.000000000","message":"Yes, it\u0027s more \u0027partial\u0027 or I need another bug more along the lines of increasing performance - that is hopefully what this will do.  pyroute does have a batch mode, but it didn\u0027t seem to work for neigh commands.","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"}],"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"8228887c8d6f643f8b5dbbecc4e303cffac39c5c","unresolved":false,"context_lines":[{"line_number":838,"context_line":"                                      self.name,"},{"line_number":839,"context_line":"                                      self._parent.namespace)"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def dump(self, ip_version):"},{"line_number":842,"context_line":"        privileged.dump_neigh_entries(ip_version[0],"},{"line_number":843,"context_line":"                                      self.name,"},{"line_number":844,"context_line":"                                      self._parent.namespace)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_217d95b1","line":841,"range":{"start_line":841,"start_character":4,"end_line":841,"end_character":12},"updated":"2017-01-11 08:10:09.000000000","message":"should it replace \u0027show\u0027?","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"130a880c946a7297e6d8774cdc4e4711e70735f1","unresolved":false,"context_lines":[{"line_number":838,"context_line":"                                      self.name,"},{"line_number":839,"context_line":"                                      self._parent.namespace)"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def dump(self, ip_version):"},{"line_number":842,"context_line":"        privileged.dump_neigh_entries(ip_version[0],"},{"line_number":843,"context_line":"                                      self.name,"},{"line_number":844,"context_line":"                                      self._parent.namespace)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_a2e251ff","line":841,"range":{"start_line":841,"start_character":4,"end_line":841,"end_character":12},"in_reply_to":"ba5201f7_217d95b1","updated":"2017-01-11 14:14:45.000000000","message":"It could, I\u0027d just have to change the callers since it returns a list, not the output of \u0027ip neigh show\u0027.  I only found one caller of show so far, so it might not be worth it anyways since it didn\u0027t seem performance-critical.","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fd41c95f35daa72bf7a216ee0870e71bea3e542e","unresolved":false,"context_lines":[{"line_number":839,"context_line":"                                      self._parent.namespace)"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def dump(self, ip_version):"},{"line_number":842,"context_line":"        privileged.dump_neigh_entries(ip_version[0],"},{"line_number":843,"context_line":"                                      self.name,"},{"line_number":844,"context_line":"                                      self._parent.namespace)"},{"line_number":845,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_5f115b51","line":842,"updated":"2017-01-12 02:48:39.000000000","message":"This needs to return the entries for it to work","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4ddcad52480fdbc514bdbaaecc64bc362a5b5d91","unresolved":false,"context_lines":[{"line_number":838,"context_line":"                                      self.name,"},{"line_number":839,"context_line":"                                      self._parent.namespace)"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def dump(self, ip_version):"},{"line_number":842,"context_line":"        return privileged.dump_neigh_entries(ip_version[0],"},{"line_number":843,"context_line":"                                             self.name,"},{"line_number":844,"context_line":"                                             self._parent.namespace)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a57fde8_34e8bf7c","line":841,"updated":"2017-01-12 18:04:29.000000000","message":"I might just defer this method since some thought should be put into what exactly it should return - the pyroute2 code could return more information than we do today in show()","commit_id":"cecc355c50eec71caa6788fb8e67f7f3827dc0bc"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6dea39e7f8184c3e2513922179c4113f30447d57","unresolved":false,"context_lines":[{"line_number":965,"context_line":""},{"line_number":966,"context_line":""},{"line_number":967,"context_line":"# NOTE(haleyb): These neighbour functions live outside the IpNeighCommand"},{"line_number":968,"context_line":"# class since not all callers require it."},{"line_number":969,"context_line":"def add_neigh_entry(ip_address, mac_address, device, namespace\u003dNone, **kwargs):"},{"line_number":970,"context_line":"    \"\"\"Add a neighbour entry."},{"line_number":971,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_ebdbf879","line":968,"range":{"start_line":968,"start_character":8,"end_line":968,"end_character":41},"updated":"2017-01-18 07:54:45.000000000","message":"not sure I got the reasoning.. what are the callers who doesn\u0027t require IpNeighCommand; what\u0027s the overhead?","commit_id":"f5583f2a09a96e6153def37deb76e34109369935"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"82532c8edc1ed9e3b4859fda0410f07772f60aea","unresolved":false,"context_lines":[{"line_number":965,"context_line":""},{"line_number":966,"context_line":""},{"line_number":967,"context_line":"# NOTE(haleyb): These neighbour functions live outside the IpNeighCommand"},{"line_number":968,"context_line":"# class since not all callers require it."},{"line_number":969,"context_line":"def add_neigh_entry(ip_address, mac_address, device, namespace\u003dNone, **kwargs):"},{"line_number":970,"context_line":"    \"\"\"Add a neighbour entry."},{"line_number":971,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_488cf9d9","line":968,"range":{"start_line":968,"start_character":8,"end_line":968,"end_character":41},"in_reply_to":"7a3c09a3_ebdbf879","updated":"2017-01-18 22:18:24.000000000","message":"It was really just the linuxbridge agent, see https://review.openstack.org/#/c/420209/  I can put it back in the class I guess.","commit_id":"f5583f2a09a96e6153def37deb76e34109369935"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0567a52cf0ba189d323c6df783cc0722edf88c10","unresolved":false,"context_lines":[{"line_number":842,"context_line":"                                  self._parent.namespace,"},{"line_number":843,"context_line":"                                  **kwargs)"},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"    def show(self, ip_version):"},{"line_number":846,"context_line":"        options \u003d [ip_version]"},{"line_number":847,"context_line":"        return self._as_root(options,"},{"line_number":848,"context_line":"                             (\u0027show\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a3905b3_bb1b2072","line":845,"updated":"2017-01-23 14:38:15.000000000","message":"Should I mark this as deprecated?  Maybe in the follow-on where I change all the callers?","commit_id":"d7a6827e43a60a740a7d12c40fc1ead027046348"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"0774ae59c1fa48011de3f68abf475c61d9eb7484","unresolved":false,"context_lines":[{"line_number":842,"context_line":"                                  self._parent.namespace,"},{"line_number":843,"context_line":"                                  **kwargs)"},{"line_number":844,"context_line":""},{"line_number":845,"context_line":"    def show(self, ip_version):"},{"line_number":846,"context_line":"        options \u003d [ip_version]"},{"line_number":847,"context_line":"        return self._as_root(options,"},{"line_number":848,"context_line":"                             (\u0027show\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a3905b3_7b7e181a","line":845,"in_reply_to":"5a3905b3_bb1b2072","updated":"2017-01-23 14:45:20.000000000","message":"++, follow-on seems the right place to depracate","commit_id":"d7a6827e43a60a740a7d12c40fc1ead027046348"}],"neutron/privileged/agent/linux/ip_lib.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fd41c95f35daa72bf7a216ee0870e71bea3e542e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    try:"},{"line_number":86,"context_line":"        with _get_iproute(namespace) as ip:"},{"line_number":87,"context_line":"            idx \u003d ip.link_lookup(ifname\u003ddevice)[0]"},{"line_number":88,"context_line":"            ip.neigh(command, ifindex\u003didx, **kwargs)"},{"line_number":89,"context_line":"    except OSError as e:"},{"line_number":90,"context_line":"        if e.errno \u003d\u003d errno.ENOENT:"},{"line_number":91,"context_line":"            raise NetworkNamespaceNotFound(netns_name\u003dnamespace)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_ff1ccf67","line":88,"updated":"2017-01-12 02:48:39.000000000","message":"This needs to return the call output for \u0027dump\u0027 to work.","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fd41c95f35daa72bf7a216ee0870e71bea3e542e","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    :returns a list of netlink NDB records"},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"},{"line_number":139,"context_line":"    _run_iproute(\u0027dump\u0027,"},{"line_number":140,"context_line":"                 device,"},{"line_number":141,"context_line":"                 namespace,"},{"line_number":142,"context_line":"                 family\u003dfamily)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_9f2e638a","line":139,"updated":"2017-01-12 02:48:39.000000000","message":"return needed here too","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4ddcad52480fdbc514bdbaaecc64bc362a5b5d91","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    :param ip_address: IP address of entry to delete"},{"line_number":117,"context_line":"    :param mac_address: MAC address of entry to delete"},{"line_number":118,"context_line":"    :param device: Device name to add entry for"},{"line_number":119,"context_line":"    :param namespace: The name of the namespace in which to delete the entry"},{"line_number":120,"context_line":"    \"\"\""},{"line_number":121,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a57fde8_cf1a7e6e","line":118,"range":{"start_line":118,"start_character":34,"end_line":118,"end_character":37},"updated":"2017-01-12 18:04:29.000000000","message":"copy/paste, will fix","commit_id":"cecc355c50eec71caa6788fb8e67f7f3827dc0bc"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6dea39e7f8184c3e2513922179c4113f30447d57","unresolved":false,"context_lines":[{"line_number":83,"context_line":"def _run_iproute(command, device, namespace, **kwargs):"},{"line_number":84,"context_line":"    try:"},{"line_number":85,"context_line":"        with _get_iproute(namespace) as ip:"},{"line_number":86,"context_line":"            idx \u003d ip.link_lookup(ifname\u003ddevice)[0]"},{"line_number":87,"context_line":"            return ip.neigh(command, ifindex\u003didx, **kwargs)"},{"line_number":88,"context_line":"    except OSError as e:"},{"line_number":89,"context_line":"        if e.errno \u003d\u003d errno.ENOENT:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_cb163c4b","line":86,"range":{"start_line":86,"start_character":18,"end_line":86,"end_character":50},"updated":"2017-01-18 07:54:45.000000000","message":"I think it\u0027s better to handle IndexError (device not found) explicitly","commit_id":"f5583f2a09a96e6153def37deb76e34109369935"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"82532c8edc1ed9e3b4859fda0410f07772f60aea","unresolved":false,"context_lines":[{"line_number":83,"context_line":"def _run_iproute(command, device, namespace, **kwargs):"},{"line_number":84,"context_line":"    try:"},{"line_number":85,"context_line":"        with _get_iproute(namespace) as ip:"},{"line_number":86,"context_line":"            idx \u003d ip.link_lookup(ifname\u003ddevice)[0]"},{"line_number":87,"context_line":"            return ip.neigh(command, ifindex\u003didx, **kwargs)"},{"line_number":88,"context_line":"    except OSError as e:"},{"line_number":89,"context_line":"        if e.errno \u003d\u003d errno.ENOENT:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_899eca61","line":86,"range":{"start_line":86,"start_character":18,"end_line":86,"end_character":50},"in_reply_to":"7a3c09a3_cb163c4b","updated":"2017-01-18 22:18:24.000000000","message":"I can catch it and throw an new error message, but we aren\u0027t catching it in the existing code either.","commit_id":"f5583f2a09a96e6153def37deb76e34109369935"}],"neutron/tests/unit/agent/linux/test_ip_lib.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fd41c95f35daa72bf7a216ee0870e71bea3e542e","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"        mock_netns_instance \u003d mock_netns.return_value"},{"line_number":1633,"context_line":"        mock_netns_enter \u003d mock_netns_instance.__enter__.return_value"},{"line_number":1634,"context_line":"        mock_netns_enter.link_lookup.return_value \u003d [1]"},{"line_number":1635,"context_line":"        self.neigh_cmd.dump([4])"},{"line_number":1636,"context_line":"        mock_netns_enter.link_lookup.assert_called_once_with(ifname\u003d\u0027tap0\u0027)"},{"line_number":1637,"context_line":"        mock_netns_enter.neigh.assert_called_once_with("},{"line_number":1638,"context_line":"            \u0027dump\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_3f42d73e","line":1635,"updated":"2017-01-12 02:48:39.000000000","message":"This should verify dump() returns something by first adding some entries, etc.","commit_id":"d6bee4382ee242b82b7da0f4b2b24e82e175421d"}]}
