)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"e3a7e572dd863557ebb5182bd7c0e0b1402cdf6b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"linuxbridge doesn\u0027t check that cfg.CONF.VXLAN.local_ip is not empty"},{"line_number":18,"context_line":"before using it (a bug, surely). Since it\u0027s out of scope of this patch"},{"line_number":19,"context_line":"to fix this, workarounds were implemented to make sure the tests ignore"},{"line_number":20,"context_line":"the option instead."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Closes-Bug: #1506503"},{"line_number":23,"context_line":"Change-Id: Iad285d7c763b0e8e8f877c6892aadb0043e9a186"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a29b11f_f36b2eef","line":20,"updated":"2015-10-22 18:16:44.000000000","message":"If so, why not report/open another bug/patch for that, otherwise I think some inline comments should be added for those updated tests.","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"66540289c52649800c1f0923e30ec68451e9ac29","unresolved":false,"context_lines":[{"line_number":17,"context_line":"linuxbridge doesn\u0027t check that cfg.CONF.VXLAN.local_ip is not empty"},{"line_number":18,"context_line":"before using it (a bug, surely). Since it\u0027s out of scope of this patch"},{"line_number":19,"context_line":"to fix this, workarounds were implemented to make sure the tests ignore"},{"line_number":20,"context_line":"the option instead."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Closes-Bug: #1506503"},{"line_number":23,"context_line":"Change-Id: Iad285d7c763b0e8e8f877c6892aadb0043e9a186"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a29b11f_9c93d75a","line":20,"in_reply_to":"3a29b11f_d19a9861","updated":"2015-10-23 09:36:51.000000000","message":"TL;DR: The original get_device_by_ip is faulty, causing tests to pass due to a bug in the code. This code fixes this bug, causing said tests to fail.\n\nLooking again at the code and at the bug report I attached, it seems to (still) be fixed. However, the tests that were patched failed since they assume that the LinuxbridgeManager class that\u0027s initialised has been initialised properly, even though it doesn\u0027t: since local_ip is never specified and enable_vxlan is True by default, it always tries to make sure local_ip is valid and fails. The original code had a bug in it that masked this bug - when calling get_device_by_ip with ip\u003dNone, it in turns calls device.addr.list(to\u003dip\u003dNone). The code itself then says \"oh, \u0027to\u0027 is None so I don\u0027t need to use it\", causing the code to return the first device with an IP - thus causing the tests (and perhaps linuxbridge itself) to run even though it shouldn\u0027t.\n\nOnce this code is put into place, we explicitly return None if local_ip is None - which is the case for the linuxbridge cases. This also correctly notifies the user if it\u0027s running linuxbridge with an empty local_ip.\n\nI\u0027ve posted a comment on the bug report I\u0027ve mentioned earlier to make sure it\u0027s visible there, but I don\u0027t feel this deserves its own bug report since it\u0027s sort of a regression caused (and fixed) by this patch. It also doesn\u0027t directly resolve that bug report, so adding a tag doesn\u0027t seem right.\n\nAdding a \u0027related-bug\u0027 tag could be done, if there\u0027s another revision - though it\u0027ll have the same effect as just posting about this there, so...","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"899b1be414d898e06a075a5ba5b196c48a6708a1","unresolved":false,"context_lines":[{"line_number":17,"context_line":"linuxbridge doesn\u0027t check that cfg.CONF.VXLAN.local_ip is not empty"},{"line_number":18,"context_line":"before using it (a bug, surely). Since it\u0027s out of scope of this patch"},{"line_number":19,"context_line":"to fix this, workarounds were implemented to make sure the tests ignore"},{"line_number":20,"context_line":"the option instead."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Closes-Bug: #1506503"},{"line_number":23,"context_line":"Change-Id: Iad285d7c763b0e8e8f877c6892aadb0043e9a186"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a29b11f_d1e93880","line":20,"in_reply_to":"3a29b11f_d19a9861","updated":"2015-10-23 09:19:22.000000000","message":"Thanks, I get it now.","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d98ffda8b013d0e487d33912131e595363d6c4f7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"linuxbridge doesn\u0027t check that cfg.CONF.VXLAN.local_ip is not empty"},{"line_number":18,"context_line":"before using it (a bug, surely). Since it\u0027s out of scope of this patch"},{"line_number":19,"context_line":"to fix this, workarounds were implemented to make sure the tests ignore"},{"line_number":20,"context_line":"the option instead."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Closes-Bug: #1506503"},{"line_number":23,"context_line":"Change-Id: Iad285d7c763b0e8e8f877c6892aadb0043e9a186"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a29b11f_d19a9861","line":20,"in_reply_to":"3a29b11f_f36b2eef","updated":"2015-10-23 09:07:52.000000000","message":"There is a bug report that can be found at [1]. However, I noticed that the fix was a bit faulty (it returns the first device to hold *some* IP, not necessarily matching the given local_ip). Still, it\u0027s out of scope and should be dealt with in [1]. This note here just states why the linuxbridge changes were made, since they seem  out of scope.\n\n[1]: https://bugs.launchpad.net/neutron/+bug/1483497","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"}],"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"d6a53fe863d9a8728208cafb24b7f37c275a04da","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        return retval"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def get_device_by_ip(self, ip):"},{"line_number":132,"context_line":"        \"\"\"Get the IPDevice from system which has ip configured.\"\"\""},{"line_number":133,"context_line":"        for device in self.get_devices():"},{"line_number":134,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_856a1280","line":131,"updated":"2015-10-15 15:08:18.000000000","message":"What if instead, we change this function to list all addresses in the namespace, and then correlate \u0027ip\u0027 to its device? This will save many calls to the \u0027ip\u0027 binary and make it less raceful.","commit_id":"2df552965da3038175a0d0fd142e2498930e5c61"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"1b7bfca98945a4ee812b0e9a4fcd98eaac29a4d3","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        return retval"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def get_device_by_ip(self, ip):"},{"line_number":132,"context_line":"        \"\"\"Get the IPDevice from system which has ip configured.\"\"\""},{"line_number":133,"context_line":"        for device in self.get_devices():"},{"line_number":134,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a29b11f_e3e1a0d1","line":131,"in_reply_to":"5a2ca52d_856a1280","updated":"2015-10-20 11:51:06.000000000","message":"Done","commit_id":"2df552965da3038175a0d0fd142e2498930e5c61"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"09b0c98791ed6536741de2763d86ecdd8703ef1f","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            try:"},{"line_number":135,"context_line":"                if device.addr.list(to\u003dip):"},{"line_number":136,"context_line":"                    return device"},{"line_number":137,"context_line":"            except RuntimeError:"},{"line_number":138,"context_line":"                # Device could\u0027ve been deleted by someone else, so it can\u0027t"},{"line_number":139,"context_line":"                # be a match!"},{"line_number":140,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_bf2e2441","line":137,"updated":"2015-10-16 01:03:41.000000000","message":"I understand that get_devices() may return a list of devices that could change underneath, but this is going to inevitably mask issues where you genuinely are passing an invalid \u0027ip\u0027 input.\n\nThis should not be as opinionated as you did here, IMO. Let the caller determine whether the exception is valid or not. You could consider enhancing so that the caller can choose to let it fail silently (as you did here) or raising on error.","commit_id":"2df552965da3038175a0d0fd142e2498930e5c61"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"1b7bfca98945a4ee812b0e9a4fcd98eaac29a4d3","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            try:"},{"line_number":135,"context_line":"                if device.addr.list(to\u003dip):"},{"line_number":136,"context_line":"                    return device"},{"line_number":137,"context_line":"            except RuntimeError:"},{"line_number":138,"context_line":"                # Device could\u0027ve been deleted by someone else, so it can\u0027t"},{"line_number":139,"context_line":"                # be a match!"},{"line_number":140,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a29b11f_4b63d4dc","line":137,"in_reply_to":"5a2ca52d_bf2e2441","updated":"2015-10-20 11:51:06.000000000","message":"The purpose here is to silently continue in cases were a single device (among all those that are checked) was removed by some other entity. In this case it\u0027s not necessarily an exception we wish to raise (\"this device does not contain the IP, but others might\") so we need to continue checking the others.\n\nChecking for invalid IP addresses should be done elsewhere. In the case of inserting an invalid local_ip option (for either linuxbridge or openvswitch), oslo.config raises the exception much earlier in the parse process. Since this function is only used for making sure that the option is valid, I don\u0027t see why it should be changed (let alone in this changeset).","commit_id":"2df552965da3038175a0d0fd142e2498930e5c61"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"46eeaa4063cfc16ae38b9a76360471ef3279ec6c","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def get_device_by_ip(self, ip):"},{"line_number":133,"context_line":"        \"\"\"Get the IPDevice from system which has ip configured.\"\"\""},{"line_number":134,"context_line":"        addr \u003d IpAddrCommand(self)"},{"line_number":135,"context_line":"        for device in addr.get_devices_with_ip():"},{"line_number":136,"context_line":"            device_ip \u003d device[\u0027cidr\u0027].split(\"/\")[0]"},{"line_number":137,"context_line":"            if device_ip \u003d\u003d ip:"},{"line_number":138,"context_line":"                return IPDevice(device[\u0027name\u0027], namespace\u003dself.namespace)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_8c5b302e","line":135,"updated":"2015-10-20 15:43:08.000000000","message":"You should pass \u0027to\u003dip\u0027 here to optimize it a little bit.\n\nOnce you do that the result will contain a list of devices with that IP. It can actually return more than a single device, in the case you call this function with an IPv6 link local address, that address is generated by the MAC address and so if you created a bridge over a NIC, both devices will have the same MAC and IPv6 link local addresses. Right now the method just returns one of the two devices, and this patch shouldn\u0027t change that.\n\nSo basically this should be changed so that you pass the \u0027to\u0027 parameter then something like:\n\ndevices \u003d IpAddrCommand(self).get_devices_with_ip(to\u003dip)\nif devices:\n  return IPDevice(devices[0][\u0027name\u0027], namespace\u003dself.namespace)\n\nFor extra brownie points, perhaps add a doctext note stating that this function simply returns the first / a random device if more than a single device contains the \u0027ip\u0027 argument, and that this can happen with IPv6 LLADR.","commit_id":"77c3483d52f2a6ec5079f902db5328b95bcd0f3e"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9c7ff68b1607afc1cd3cfc873e8e7e70e0ff6fec","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def get_device_by_ip(self, ip):"},{"line_number":133,"context_line":"        \"\"\"Get the IPDevice from system which has ip configured.\"\"\""},{"line_number":134,"context_line":"        addr \u003d IpAddrCommand(self)"},{"line_number":135,"context_line":"        for device in addr.get_devices_with_ip():"},{"line_number":136,"context_line":"            device_ip \u003d device[\u0027cidr\u0027].split(\"/\")[0]"},{"line_number":137,"context_line":"            if device_ip \u003d\u003d ip:"},{"line_number":138,"context_line":"                return IPDevice(device[\u0027name\u0027], namespace\u003dself.namespace)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_989b0a66","line":135,"in_reply_to":"3a29b11f_7ff09867","updated":"2015-10-22 11:51:11.000000000","message":"Done","commit_id":"77c3483d52f2a6ec5079f902db5328b95bcd0f3e"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"2e3ad3d6fa20f9533c292aaa83de0f9c257098b6","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def get_device_by_ip(self, ip):"},{"line_number":133,"context_line":"        \"\"\"Get the IPDevice from system which has ip configured.\"\"\""},{"line_number":134,"context_line":"        addr \u003d IpAddrCommand(self)"},{"line_number":135,"context_line":"        for device in addr.get_devices_with_ip():"},{"line_number":136,"context_line":"            device_ip \u003d device[\u0027cidr\u0027].split(\"/\")[0]"},{"line_number":137,"context_line":"            if device_ip \u003d\u003d ip:"},{"line_number":138,"context_line":"                return IPDevice(device[\u0027name\u0027], namespace\u003dself.namespace)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_7ff09867","line":135,"in_reply_to":"3a29b11f_8c5b302e","updated":"2015-10-21 06:46:38.000000000","message":"Agree, suspect functional test failure is caused by not passing ip.","commit_id":"77c3483d52f2a6ec5079f902db5328b95bcd0f3e"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"2e3ad3d6fa20f9533c292aaa83de0f9c257098b6","unresolved":false,"context_lines":[{"line_number":557,"context_line":"                else:"},{"line_number":558,"context_line":"                    scope \u003d parts[3]"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"            retval.append(dict(name\u003ddevice_name,"},{"line_number":561,"context_line":"                               cidr\u003dparts[1],"},{"line_number":562,"context_line":"                               scope\u003dscope,"},{"line_number":563,"context_line":"                               dynamic\u003d(\u0027dynamic\u0027 \u003d\u003d parts[-1]),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_e4565f5b","line":560,"updated":"2015-10-21 06:46:38.000000000","message":"Need update UT for new added return element.","commit_id":"77c3483d52f2a6ec5079f902db5328b95bcd0f3e"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9c7ff68b1607afc1cd3cfc873e8e7e70e0ff6fec","unresolved":false,"context_lines":[{"line_number":557,"context_line":"                else:"},{"line_number":558,"context_line":"                    scope \u003d parts[3]"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"            retval.append(dict(name\u003ddevice_name,"},{"line_number":561,"context_line":"                               cidr\u003dparts[1],"},{"line_number":562,"context_line":"                               scope\u003dscope,"},{"line_number":563,"context_line":"                               dynamic\u003d(\u0027dynamic\u0027 \u003d\u003d parts[-1]),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_38a756ab","line":560,"in_reply_to":"3a29b11f_e4565f5b","updated":"2015-10-22 11:51:11.000000000","message":"Done","commit_id":"77c3483d52f2a6ec5079f902db5328b95bcd0f3e"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"f83912957e691463dee916422cb3d2eedc8af1b9","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        addr \u003d IpAddrCommand(self)"},{"line_number":135,"context_line":"        for device in addr.get_devices_with_ip(to\u003dip):"},{"line_number":136,"context_line":"            device_ip \u003d device[\u0027cidr\u0027].split(\"/\")[0]"},{"line_number":137,"context_line":"            if device_ip \u003d\u003d ip:"},{"line_number":138,"context_line":"                return IPDevice(device[\u0027name\u0027], namespace\u003dself.namespace)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def add_tuntap(self, name, mode\u003d\u0027tap\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a29b11f_b214dee8","line":137,"updated":"2015-10-22 13:41:38.000000000","message":"How can this if return False? Isn\u0027t it enough to:\n\nresult \u003d addr.get_devices_with_ip(to\u003dip)\nif result:\n  return IPDevice(result[0][\u0027name\u0027], namespace\u003dself.namespace)","commit_id":"2ab2dd7944a846cc4ec884b7a264cdd87453adbe"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"e6dcdbf3b347f9f63dfb2557380146ec6844ce30","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        addr \u003d IpAddrCommand(self)"},{"line_number":135,"context_line":"        for device in addr.get_devices_with_ip(to\u003dip):"},{"line_number":136,"context_line":"            device_ip \u003d device[\u0027cidr\u0027].split(\"/\")[0]"},{"line_number":137,"context_line":"            if device_ip \u003d\u003d ip:"},{"line_number":138,"context_line":"                return IPDevice(device[\u0027name\u0027], namespace\u003dself.namespace)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def add_tuntap(self, name, mode\u003d\u0027tap\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a29b11f_2d595335","line":137,"in_reply_to":"3a29b11f_b214dee8","updated":"2015-10-22 14:58:56.000000000","message":"Done","commit_id":"2ab2dd7944a846cc4ec884b7a264cdd87453adbe"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"e3a7e572dd863557ebb5182bd7c0e0b1402cdf6b","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        addr \u003d IpAddrCommand(self)"},{"line_number":143,"context_line":"        devices \u003d addr.get_devices_with_ip(to\u003dip)"},{"line_number":144,"context_line":"        if devices:"},{"line_number":145,"context_line":"            return IPDevice(devices[0][\u0027name\u0027], namespace\u003dself.namespace)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def add_tuntap(self, name, mode\u003d\u0027tap\u0027):"},{"line_number":148,"context_line":"        self._as_root([], \u0027tuntap\u0027, (\u0027add\u0027, name, \u0027mode\u0027, mode))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_9343daae","line":145,"updated":"2015-10-22 18:16:44.000000000","message":"I prefer a doctext to explain \"devices[0]\", just like Assaf\u0027s comment in PS3.","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d98ffda8b013d0e487d33912131e595363d6c4f7","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        addr \u003d IpAddrCommand(self)"},{"line_number":143,"context_line":"        devices \u003d addr.get_devices_with_ip(to\u003dip)"},{"line_number":144,"context_line":"        if devices:"},{"line_number":145,"context_line":"            return IPDevice(devices[0][\u0027name\u0027], namespace\u003dself.namespace)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def add_tuntap(self, name, mode\u003d\u0027tap\u0027):"},{"line_number":148,"context_line":"        self._as_root([], \u0027tuntap\u0027, (\u0027add\u0027, name, \u0027mode\u0027, mode))"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_514f6833","line":145,"in_reply_to":"3a29b11f_9343daae","updated":"2015-10-23 09:07:52.000000000","message":"If there\u0027s another revision, sure.","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"},{"author":{"_account_id":14033,"name":"James Reeves","email":"james.reeves5546@gmail.com","username":"trombongod"},"change_message_id":"d6eec0eaf34ff28bcbced041f65bc18c0e496c94","unresolved":false,"context_lines":[{"line_number":549,"context_line":""},{"line_number":550,"context_line":"            match \u003d DEVICE_NAME_PATTERN.search(line)"},{"line_number":551,"context_line":"            if match:"},{"line_number":552,"context_line":"                # Found a match for a device name, but its\u0027 addresses will"},{"line_number":553,"context_line":"                # only appear in following lines, so we may as well continue."},{"line_number":554,"context_line":"                device_name \u003d match.group(2)"},{"line_number":555,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_9048b0b4","line":552,"updated":"2015-10-22 18:23:46.000000000","message":"very small nit...but it should read \u0027for a device name, but its addresses\u0027. no need for the extra apostrophe. Certainly not worthy of a -1. just pointing it out.","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"},{"author":{"_account_id":14033,"name":"James Reeves","email":"james.reeves5546@gmail.com","username":"trombongod"},"change_message_id":"d6eec0eaf34ff28bcbced041f65bc18c0e496c94","unresolved":false,"context_lines":[{"line_number":565,"context_line":"                else:"},{"line_number":566,"context_line":"                    scope \u003d parts[3]"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"            retval.append(dict(name\u003ddevice_name,"},{"line_number":569,"context_line":"                               cidr\u003dparts[1],"},{"line_number":570,"context_line":"                               scope\u003dscope,"},{"line_number":571,"context_line":"                               dynamic\u003d(\u0027dynamic\u0027 \u003d\u003d parts[-1]),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_3392064d","line":568,"updated":"2015-10-22 18:23:46.000000000","message":"Will the device name always appear in at least the second line of the match? because otherwise the device_name won\u0027t have a value...","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"d98ffda8b013d0e487d33912131e595363d6c4f7","unresolved":false,"context_lines":[{"line_number":565,"context_line":"                else:"},{"line_number":566,"context_line":"                    scope \u003d parts[3]"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"            retval.append(dict(name\u003ddevice_name,"},{"line_number":569,"context_line":"                               cidr\u003dparts[1],"},{"line_number":570,"context_line":"                               scope\u003dscope,"},{"line_number":571,"context_line":"                               dynamic\u003d(\u0027dynamic\u0027 \u003d\u003d parts[-1]),"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_318f4c76","line":568,"in_reply_to":"3a29b11f_3392064d","updated":"2015-10-23 09:07:52.000000000","message":"An example output might be:\n\n 2: eth0: \u003cBROADCAST,MULTICAST,UP,LOWER_UP\u003e mtu 1500 qdisc pfifo_fast state UP group default qlen 1000\n    link/ether 66:1a:4a:23:11:8f brd ff:ff:ff:ff:ff:ff\n    inet 10.35.6.13/23 brd 10.35.7.255 scope global eth0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::641a:4aff:fe23:118f/64 scope link\n       valid_lft forever preferred_ft forever\n\nThis practically guarantees that if a device_name such as \u0027eth0\u0027 was discovered, all IP addresses that are found after that belong to eth0. So device_name will always have a value at this point.","commit_id":"f3dece785e591ea68ed5bbecbbfa4ac3a29fbc8f"}]}
