)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1438d2464792a29ba372d789ae7581c135a8bcea","unresolved":false,"context_lines":[{"line_number":11,"context_line":"This method uses linux specific implementation that fails on windows."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch fixes this bug by adding a implementation for validate_local_ip"},{"line_number":14,"context_line":"that works on both platforms using netifaces."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Ia8299512687d9d7135fe013fbb38f2b28d54125d"},{"line_number":17,"context_line":"Closes-Bug: #1497940"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a2fa921_1d1af06e","line":14,"updated":"2015-10-07 15:22:10.000000000","message":"strictly speaking, for Unix we leave existing implementation that is not netifaces based.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"a519f06bdf1d79bee5cd190fa9d0e62e0090658a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adelina Tuvenie \u003catuvenie@cloudbasesolutions.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-20 15:03:53 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fixes \u0027ovs_neutron_agent doesn\u0027t start on Windows of validate_local_ip\u0027"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change I4b4527c28d0738890e33b343c9e17941e780bc24 introduced a validate_local_ip"},{"line_number":10,"context_line":"sanity check for the local_ip to see that it belongs to the host."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a29b11f_1cfc0bb7","line":7,"updated":"2015-10-21 09:10:18.000000000","message":"Typo? \"of\"","commit_id":"61c69b5b2030bd8e1e5c0a55bfe003efa3b6da43"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"ae6346c0f0c7e374bc013ec9f59a5a1765c2bb23","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adelina Tuvenie \u003catuvenie@cloudbasesolutions.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-20 15:03:53 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fixes \u0027ovs_neutron_agent doesn\u0027t start on Windows of validate_local_ip\u0027"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change I4b4527c28d0738890e33b343c9e17941e780bc24 introduced a validate_local_ip"},{"line_number":10,"context_line":"sanity check for the local_ip to see that it belongs to the host."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a29b11f_7ceadfad","line":7,"in_reply_to":"3a29b11f_1cfc0bb7","updated":"2015-10-21 09:15:27.000000000","message":"Indeed","commit_id":"61c69b5b2030bd8e1e5c0a55bfe003efa3b6da43"}],"neutron/agent/windows/ip_lib.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"011539edfa5b56215fcac3d35983d03d461dc26f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"OPTS \u003d []"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class IPWrapper():"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_device_by_ip(self, local_ip):"},{"line_number":28,"context_line":"        if not local_ip:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_25cbdb1f","line":25,"updated":"2016-03-15 02:02:33.000000000","message":"these should derive from object.","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"8f9ffc55be8e48170228216e4436872612e1b2b3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"OPTS \u003d []"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class IPWrapper():"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_device_by_ip(self, local_ip):"},{"line_number":28,"context_line":"        if not local_ip:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_d5a8de79","line":25,"in_reply_to":"3afc51ec_25cbdb1f","updated":"2016-03-15 08:26:01.000000000","message":"Done","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"011539edfa5b56215fcac3d35983d03d461dc26f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            ifaces \u003d netifaces.interfaces()"},{"line_number":34,"context_line":"        except (OSError, MemoryError):"},{"line_number":35,"context_line":"            LOG.error(_LE(\"Failed to get network interfaces.\"))"},{"line_number":36,"context_line":"        for iface in ifaces:"},{"line_number":37,"context_line":"            try:"},{"line_number":38,"context_line":"                addresses \u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":39,"context_line":"                    netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_65ecc38f","line":36,"updated":"2016-03-15 02:02:33.000000000","message":"if the try-except fails, ifaces won\u0027t be defined and you\u0027ll get a stacktrace here.","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"011539edfa5b56215fcac3d35983d03d461dc26f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            except OSError:"},{"line_number":43,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: %s.\"),"},{"line_number":44,"context_line":"                    iface)"},{"line_number":45,"context_line":"                raise SystemExit(1)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class IPDevice():"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_05e7bfb0","line":45,"updated":"2016-03-15 02:02:33.000000000","message":"is there a better way to fail gracefully? please do not raise SystemExit","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"011539edfa5b56215fcac3d35983d03d461dc26f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                raise SystemExit(1)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class IPDevice():"},{"line_number":49,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_85d2afd0","line":48,"updated":"2016-03-15 02:02:33.000000000","message":"ditto","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"8f9ffc55be8e48170228216e4436872612e1b2b3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                raise SystemExit(1)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class IPDevice():"},{"line_number":49,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_35b822c8","line":48,"in_reply_to":"3afc51ec_85d2afd0","updated":"2016-03-15 08:26:01.000000000","message":"Done","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6908881d206d84742357036496d94e5388cf3302","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class IPWrapper(object):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_device_by_ip(self, local_ip):"},{"line_number":28,"context_line":"        if not local_ip:"},{"line_number":29,"context_line":"            return None"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_c1cca06c","line":27,"updated":"2016-03-15 09:11:55.000000000","message":"This does not have the same interface as the IPWrapper in the linux module. This is getting increasingly error prone and difficult to track down. I think we have to reconsider the strategy for ovs working on both platforms. This lose implementation (without interface inheritance) is getting out of hand.","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"3052e635141562ab8611cba9d0d4d760e874e38e","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class IPWrapper(object):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_device_by_ip(self, local_ip):"},{"line_number":28,"context_line":"        if not local_ip:"},{"line_number":29,"context_line":"            return None"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_93ae6b7f","line":27,"in_reply_to":"3afc51ec_c1cca06c","updated":"2016-03-15 09:48:02.000000000","message":"Changed to ip.","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6908881d206d84742357036496d94e5388cf3302","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_device_by_ip(self, local_ip):"},{"line_number":28,"context_line":"        if not local_ip:"},{"line_number":29,"context_line":"            return None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        addresses \u003d []"},{"line_number":32,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_e1ec3cf5","line":29,"updated":"2016-03-15 09:11:55.000000000","message":"return alone suffices.","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"3052e635141562ab8611cba9d0d4d760e874e38e","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_device_by_ip(self, local_ip):"},{"line_number":28,"context_line":"        if not local_ip:"},{"line_number":29,"context_line":"            return None"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        addresses \u003d []"},{"line_number":32,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_b3c9e75b","line":29,"in_reply_to":"3afc51ec_e1ec3cf5","updated":"2016-03-15 09:48:02.000000000","message":"Done","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6908881d206d84742357036496d94e5388cf3302","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            ifaces \u003d netifaces.interfaces()"},{"line_number":34,"context_line":"        except (OSError, MemoryError):"},{"line_number":35,"context_line":"            LOG.error(_LE(\"Failed to get network interfaces.\"))"},{"line_number":36,"context_line":"            return None"},{"line_number":37,"context_line":"        for iface in ifaces:"},{"line_number":38,"context_line":"            try:"},{"line_number":39,"context_line":"                addresses \u003d [ip[\u0027addr\u0027] for ip in"}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_41bc10dc","line":36,"updated":"2016-03-15 09:11:55.000000000","message":"ditto","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6908881d206d84742357036496d94e5388cf3302","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                addresses \u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":40,"context_line":"                    netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":41,"context_line":"                if local_ip in addresses:"},{"line_number":42,"context_line":"                    return True"},{"line_number":43,"context_line":"            except OSError:"},{"line_number":44,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: %s.\"),"},{"line_number":45,"context_line":"                    iface)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_418a501c","line":42,"updated":"2016-03-15 09:11:55.000000000","message":"hang on, I am confused. This returns True or None otherwise?","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"3052e635141562ab8611cba9d0d4d760e874e38e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                addresses \u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":40,"context_line":"                    netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":41,"context_line":"                if local_ip in addresses:"},{"line_number":42,"context_line":"                    return True"},{"line_number":43,"context_line":"            except OSError:"},{"line_number":44,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: %s.\"),"},{"line_number":45,"context_line":"                    iface)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_131ffbb7","line":42,"in_reply_to":"3afc51ec_418a501c","updated":"2016-03-15 09:48:02.000000000","message":"I could make it return an IPDevice like on linux. The point is it has to return something.","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6908881d206d84742357036496d94e5388cf3302","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            except OSError:"},{"line_number":44,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: %s.\"),"},{"line_number":45,"context_line":"                    iface)"},{"line_number":46,"context_line":"                return None"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class IPDevice(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_81b29804","line":46,"updated":"2016-03-15 09:11:55.000000000","message":"ditto","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"3052e635141562ab8611cba9d0d4d760e874e38e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            except OSError:"},{"line_number":44,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: %s.\"),"},{"line_number":45,"context_line":"                    iface)"},{"line_number":46,"context_line":"                return None"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class IPDevice(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3afc51ec_f3bfefa7","line":46,"in_reply_to":"3afc51ec_81b29804","updated":"2016-03-15 09:48:02.000000000","message":"Done","commit_id":"21818de8a9041d3e7e63922bb9fa1edc5475adee"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"912e36cc2468e7487b850cd49de11a979d770a25","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                return"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class IPDevice(object):"},{"line_number":50,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":12,"id":"3afc51ec_368025c0","line":49,"updated":"2016-03-15 10:11:46.000000000","message":"you may get past the initial startup errors, but the ovs agent expects this IPDevice to be more than a dummy object. Right now the IPDevice use is predicated on use_veth_interconnection\u003dTrue, which I assume you don\u0027t allow on win32, but still..this approach is incredibly brittle.\n\nIf you add that you\u0027re fixing this without tests, this means you\u0027ll continue to be in vicious circle of fixing these types of issues when they occur. That\u0027s great for job security, but not so great if you want to spend your time doing actual development :)\n\nSo bottom line, consider implementing real objects here, with well defined interfaces, and whose behavior can be reasonably expected.","commit_id":"ad0d38ab025c310bcf8b10893ea0c59056e3f34c"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"fddd4662d54221b306d380f1d8b506f8961b22f9","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                return"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class IPDevice(object):"},{"line_number":50,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":12,"id":"1af94dfe_4d6c12d0","line":49,"in_reply_to":"3afc51ec_368025c0","updated":"2016-03-18 09:50:22.000000000","message":"Yes you are right, we do not accept use_veth_interconnection on Windows. And I fully agree this approach is brittle and hacky and trust me I am no fan of fixing issues like this when they occur.\n\nI am more than willing to change this approach in N, meaning porting the Agent in a proper way, using real inheritance instead of this approach. This was the way we \"ported\" the agent back then but it proves to be a nightmare to maintain.","commit_id":"ad0d38ab025c310bcf8b10893ea0c59056e3f34c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"21651adec227ce7b5c5cc741c4a2d5d7f847e052","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_device_by_ip(self, ip):"},{"line_number":30,"context_line":"        if not ip:"},{"line_number":31,"context_line":"            return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        devices \u003d self.get_devices()"},{"line_number":34,"context_line":"        for device in devices:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_e8a7a8a4","line":31,"updated":"2016-03-18 20:39:40.000000000","message":"this can simply be \u0027return\u0027","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"81be03ab697d56c189e76754e1ac54f15aa3c6c1","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_device_by_ip(self, ip):"},{"line_number":30,"context_line":"        if not ip:"},{"line_number":31,"context_line":"            return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        devices \u003d self.get_devices()"},{"line_number":34,"context_line":"        for device in devices:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_adc2cd50","line":31,"in_reply_to":"1af94dfe_e8a7a8a4","updated":"2016-03-18 22:58:23.000000000","message":"Done","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"21651adec227ce7b5c5cc741c4a2d5d7f847e052","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        devices \u003d self.get_devices()"},{"line_number":34,"context_line":"        for device in devices:"},{"line_number":35,"context_line":"            if device.device_has_ip(ip):"},{"line_number":36,"context_line":"                return device"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_88e6e4e5","line":34,"updated":"2016-03-18 20:39:40.000000000","message":"this could be:\n\n  for device in self.get_devices():","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"81be03ab697d56c189e76754e1ac54f15aa3c6c1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            return None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        devices \u003d self.get_devices()"},{"line_number":34,"context_line":"        for device in devices:"},{"line_number":35,"context_line":"            if device.device_has_ip(ip):"},{"line_number":36,"context_line":"                return device"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_0da4a1b7","line":34,"in_reply_to":"1af94dfe_88e6e4e5","updated":"2016-03-18 22:58:23.000000000","message":"Done","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"21651adec227ce7b5c5cc741c4a2d5d7f847e052","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        ifaces \u003d []"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            ifaces \u003d netifaces.interfaces()"},{"line_number":42,"context_line":"            retval \u003d [IPDevice(iface) for iface in ifaces]"},{"line_number":43,"context_line":"        except (OSError, MemoryError):"},{"line_number":44,"context_line":"            LOG.error(_LE(\"Failed to get network interfaces.\"))"},{"line_number":45,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_c8fbcc77","line":42,"updated":"2016-03-18 20:39:40.000000000","message":"this could be:\n\n  return [IPDevice(iface) for iface in netifaces.interfaces()]","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"81be03ab697d56c189e76754e1ac54f15aa3c6c1","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        ifaces \u003d []"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            ifaces \u003d netifaces.interfaces()"},{"line_number":42,"context_line":"            retval \u003d [IPDevice(iface) for iface in ifaces]"},{"line_number":43,"context_line":"        except (OSError, MemoryError):"},{"line_number":44,"context_line":"            LOG.error(_LE(\"Failed to get network interfaces.\"))"},{"line_number":45,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_ed8df531","line":42,"in_reply_to":"1af94dfe_c8fbcc77","updated":"2016-03-18 22:58:23.000000000","message":"Done","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"21651adec227ce7b5c5cc741c4a2d5d7f847e052","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            LOG.error(_LE(\"Failed to get network interfaces.\"))"},{"line_number":45,"context_line":"            return []"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        return retval"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class IPDevice(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_2831905a","line":47,"updated":"2016-03-18 20:39:40.000000000","message":"drop this","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"81be03ab697d56c189e76754e1ac54f15aa3c6c1","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            LOG.error(_LE(\"Failed to get network interfaces.\"))"},{"line_number":45,"context_line":"            return []"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        return retval"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class IPDevice(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_0d8b0120","line":47,"in_reply_to":"1af94dfe_2831905a","updated":"2016-03-18 22:58:23.000000000","message":"Done","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"21651adec227ce7b5c5cc741c4a2d5d7f847e052","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            addresses \u003d [ip_addr[\u0027addr\u0027] for ip_addr in"},{"line_number":58,"context_line":"                netifaces.ifaddresses(self.device_name).get("},{"line_number":59,"context_line":"                    netifaces.AF_INET, [])]"},{"line_number":60,"context_line":"            if ip in addresses:"},{"line_number":61,"context_line":"                return True"},{"line_number":62,"context_line":"            return False"},{"line_number":63,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_281870d2","line":60,"updated":"2016-03-18 20:39:40.000000000","message":"this could simply be:\n\n  return ip in addresses","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"81be03ab697d56c189e76754e1ac54f15aa3c6c1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            addresses \u003d [ip_addr[\u0027addr\u0027] for ip_addr in"},{"line_number":58,"context_line":"                netifaces.ifaddresses(self.device_name).get("},{"line_number":59,"context_line":"                    netifaces.AF_INET, [])]"},{"line_number":60,"context_line":"            if ip in addresses:"},{"line_number":61,"context_line":"                return True"},{"line_number":62,"context_line":"            return False"},{"line_number":63,"context_line":"        except OSError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1af94dfe_edf33571","line":60,"in_reply_to":"1af94dfe_281870d2","updated":"2016-03-18 22:58:23.000000000","message":"Done","commit_id":"5cda97678575b4de28192c4733b15573ec2a3600"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c89eaa3e6a12acdb5739eeca7a23d38337b63efa","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import collections"},{"line_number":17,"context_line":"import hashlib"},{"line_number":18,"context_line":"import netifaces"},{"line_number":19,"context_line":"import signal"},{"line_number":20,"context_line":"import sys"},{"line_number":21,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a1a9d01_9d4a3f25","line":18,"updated":"2015-09-29 15:45:12.000000000","message":"It\u0027s 3party library, move to the next import section.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"994b3d5fa771995e44e42971b8443388bce40811","unresolved":false,"context_lines":[{"line_number":1874,"context_line":"        return"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_fd3c8ae2","line":1877,"updated":"2015-09-24 05:02:40.000000000","message":"i think this doesn\u0027t work in the case of xen.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6870a70ac602e06111dd83f67b36b2eb5371b002","unresolved":false,"context_lines":[{"line_number":1874,"context_line":"        return"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a1a9d01_1d2c8149","line":1877,"in_reply_to":"ba15a1d1_108cbcd8","updated":"2015-09-24 20:36:29.000000000","message":"adjust the patch to use the IPWrapper approach and then fall back to the netifaces if it fails. It\u0027s ugly, but it will work and we might be able to get this into Liberty.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f77877e45a6a2dc1b52da387c5e2c936ca4d3188","unresolved":false,"context_lines":[{"line_number":1874,"context_line":"        return"},{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_108cbcd8","line":1877,"in_reply_to":"ba15a1d1_fd3c8ae2","updated":"2015-09-24 09:36:44.000000000","message":"I\u0027m not familiar with details of xen. What would an alternative be?r","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c89eaa3e6a12acdb5739eeca7a23d38337b63efa","unresolved":false,"context_lines":[{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"},{"line_number":1881,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a1a9d01_f264ca22","line":1878,"updated":"2015-09-29 15:45:12.000000000","message":"No need to walk thru all interfaces if you have found one with the address. Just bail out of the function.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"6d73be3bdcb1951695980c839d38cd783c8712d3","unresolved":false,"context_lines":[{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"},{"line_number":1881,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_aa7d6d1d","line":1878,"updated":"2015-09-24 01:41:10.000000000","message":"no need for +\u003d here","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f77877e45a6a2dc1b52da387c5e2c936ca4d3188","unresolved":false,"context_lines":[{"line_number":1875,"context_line":""},{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"},{"line_number":1881,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_d0f08493","line":1878,"in_reply_to":"ba15a1d1_aa7d6d1d","updated":"2015-09-24 09:36:44.000000000","message":"I think there is, but I can combine L1877 and L1878 and do something lilke:\n\n[ip[\u0027addr\u0027] for iface in ifs for ip in netifaces.ifaddresses(iface).get(AF_INET,[])]\n\nIt\u0027s more concise.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c89eaa3e6a12acdb5739eeca7a23d38337b63efa","unresolved":false,"context_lines":[{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"},{"line_number":1881,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1882,"context_line":"                      \" IP couldn\u0027t be found on this host\u0027s interfaces.\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a1a9d01_dd70b7a6","line":1879,"updated":"2015-09-29 15:45:12.000000000","message":"I think ifaddresses can raise OSError exception, you should handle it.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"6d73be3bdcb1951695980c839d38cd783c8712d3","unresolved":false,"context_lines":[{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"},{"line_number":1881,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1882,"context_line":"                      \" IP couldn\u0027t be found on this host\u0027s interfaces.\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_6a73d54e","line":1879,"updated":"2015-09-24 01:41:10.000000000","message":"what will happen if get(netifaces.AF_INET, []) returns []?","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"f77877e45a6a2dc1b52da387c5e2c936ca4d3188","unresolved":false,"context_lines":[{"line_number":1876,"context_line":"    addresses \u003d []"},{"line_number":1877,"context_line":"    for iface in netifaces.interfaces():"},{"line_number":1878,"context_line":"        addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1879,"context_line":"                      netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1880,"context_line":"    if local_ip not in addresses:"},{"line_number":1881,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1882,"context_line":"                      \" IP couldn\u0027t be found on this host\u0027s interfaces.\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_30d9c0f3","line":1879,"in_reply_to":"ba15a1d1_6a73d54e","updated":"2015-09-24 09:36:44.000000000","message":"Nothing. I use [] to avoid:\n\nTypeError: \u0027NoneType\u0027 object is not iterable\n\nin case there is no ip set on a particular interface.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"aa9f09c889f22e8a1e46638d5a9577549c8007dc","unresolved":false,"context_lines":[{"line_number":1849,"context_line":"    if not cfg.CONF.AGENT.tunnel_types:"},{"line_number":1850,"context_line":"        return"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_347aac25","line":1852,"updated":"2015-10-06 09:42:54.000000000","message":"It should be _() not _LE()\n\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"faf043369e433cef3272e19c089ee3d0d67a60f6","unresolved":false,"context_lines":[{"line_number":1849,"context_line":"    if not cfg.CONF.AGENT.tunnel_types:"},{"line_number":1850,"context_line":"        return"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a29b11f_d5b15d02","line":1852,"in_reply_to":"7a2fa921_046bbb1f","updated":"2015-10-22 00:48:28.000000000","message":"Cedric,\n\nif you are referring examples in http://docs.openstack.org/developer/oslo.i18n/guidelines.html#choosing-a-marker-function , i believe it\u0027s about the use for exception message, which is not the case here.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"c58dce9084093098aadb3b3910ee8615007ad7b5","unresolved":false,"context_lines":[{"line_number":1849,"context_line":"    if not cfg.CONF.AGENT.tunnel_types:"},{"line_number":1850,"context_line":"        return"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_046bbb1f","line":1852,"in_reply_to":"7a2fa921_0f73d981","updated":"2015-10-06 10:51:13.000000000","message":"it should be[1]:\n\n  msg \u003d _(...)\n  LOG.error(msg)\n\nor:\n\n  LOG.error(_LE(...))\n\n[1] http://docs.openstack.org/developer/oslo.i18n/guidelines.html","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"60b7679eee6c4a3dea0421bb27c6ead6e773700e","unresolved":false,"context_lines":[{"line_number":1849,"context_line":"    if not cfg.CONF.AGENT.tunnel_types:"},{"line_number":1850,"context_line":"        return"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_0f73d981","line":1852,"in_reply_to":"7a2fa921_347aac25","updated":"2015-10-06 10:04:04.000000000","message":"why?  this is used only for LOG.error().\n\nmsg should not be a tuple.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"aa9f09c889f22e8a1e46638d5a9577549c8007dc","unresolved":false,"context_lines":[{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"},{"line_number":1856,"context_line":"        for iface in netifaces.interfaces():"},{"line_number":1857,"context_line":"            addresses +\u003d [ip[\u0027addr\u0027] for ip in"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_b409dc97","line":1854,"updated":"2015-10-06 09:42:54.000000000","message":"i would prefer you hide such OS specific check in neutron.agent.windows/linux.utils","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"0047e3cda56e4d1ef1f26065966059eb5462272d","unresolved":false,"context_lines":[{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"},{"line_number":1856,"context_line":"        for iface in netifaces.interfaces():"},{"line_number":1857,"context_line":"            addresses +\u003d [ip[\u0027addr\u0027] for ip in"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_c41dc3be","line":1854,"in_reply_to":"7a2fa921_4f26b169","updated":"2015-10-06 11:00:46.000000000","message":"That is indeed the intention. For M I would like a windows alternative to ip_lib so we won\u0027t have problems like this anymore, but for now, this is a blocker since ovs_agent doesn\u0027t start on windows without it.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"60b7679eee6c4a3dea0421bb27c6ead6e773700e","unresolved":false,"context_lines":[{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"},{"line_number":1856,"context_line":"        for iface in netifaces.interfaces():"},{"line_number":1857,"context_line":"            addresses +\u003d [ip[\u0027addr\u0027] for ip in"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_4f26b169","line":1854,"in_reply_to":"7a2fa921_b409dc97","updated":"2015-10-06 10:04:04.000000000","message":"this is probably ok as it is intended to be back-ported.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1438d2464792a29ba372d789ae7581c135a8bcea","unresolved":false,"context_lines":[{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    msg \u003d (_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027.\""},{"line_number":1853,"context_line":"              \" IP couldn\u0027t be found on this host\u0027s interfaces.\"), local_ip)"},{"line_number":1854,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1855,"context_line":"        addresses \u003d []"},{"line_number":1856,"context_line":"        for iface in netifaces.interfaces():"},{"line_number":1857,"context_line":"            addresses +\u003d [ip[\u0027addr\u0027] for ip in"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_3dc6cc9a","line":1854,"in_reply_to":"7a2fa921_c41dc3be","updated":"2015-10-07 15:22:10.000000000","message":"It\u0027s still better to have some wrapper that hides these details, similar to neutron/agent/common/polling.py.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1438d2464792a29ba372d789ae7581c135a8bcea","unresolved":false,"context_lines":[{"line_number":1855,"context_line":"        addresses \u003d []"},{"line_number":1856,"context_line":"        for iface in netifaces.interfaces():"},{"line_number":1857,"context_line":"            addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1858,"context_line":"                netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1859,"context_line":"        if local_ip not in addresses:"},{"line_number":1860,"context_line":"            LOG.error(msg)"},{"line_number":1861,"context_line":"            raise SystemExit(1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_dd6238ad","line":1858,"updated":"2015-10-07 15:22:10.000000000","message":"You still don\u0027t handle OSError from ifaddresses. And you still don\u0027t bail out early when the needed interface is found.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1438d2464792a29ba372d789ae7581c135a8bcea","unresolved":false,"context_lines":[{"line_number":1857,"context_line":"            addresses +\u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1858,"context_line":"                netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"},{"line_number":1859,"context_line":"        if local_ip not in addresses:"},{"line_number":1860,"context_line":"            LOG.error(msg)"},{"line_number":1861,"context_line":"            raise SystemExit(1)"},{"line_number":1862,"context_line":"    else:"},{"line_number":1863,"context_line":"        if not ip_lib.IPWrapper().get_device_by_ip(local_ip):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_bd9c1cc1","line":1860,"updated":"2015-10-07 15:22:10.000000000","message":"so you pass a tuple as the first and only argument to .error. I don\u0027t think it\u0027s correct.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1438d2464792a29ba372d789ae7581c135a8bcea","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"            raise SystemExit(1)"},{"line_number":1862,"context_line":"    else:"},{"line_number":1863,"context_line":"        if not ip_lib.IPWrapper().get_device_by_ip(local_ip):"},{"line_number":1864,"context_line":"            LOG.error(msg)"},{"line_number":1865,"context_line":"            raise SystemExit(1)"},{"line_number":1866,"context_line":""},{"line_number":1867,"context_line":"def prepare_xen_compute():"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_fd1b7419","line":1864,"updated":"2015-10-07 15:22:10.000000000","message":"ditto","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"a4cca10faee7b6bd10627debb873b35897f1be94","unresolved":false,"context_lines":[{"line_number":1887,"context_line":"    msg \u003d _(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":1888,"context_line":"            \"IP couldn\u0027t be found on this host\u0027s interfaces.\") % local_ip"},{"line_number":1889,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1890,"context_line":"        import netifaces"},{"line_number":1891,"context_line":""},{"line_number":1892,"context_line":"        addresses \u003d []"},{"line_number":1893,"context_line":"        for iface in netifaces.interfaces():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_1fef79e9","line":1890,"updated":"2015-10-19 16:21:47.000000000","message":"Personal preference.  Seeing the import statement here doesn\u0027t look right.  I think it would be better to have  if / import done at the top of the file.","commit_id":"c5abe0b0aaa72cb906b9db4de2f88041d8db8a33"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"e0d89cc3f5b8bf9f0a44aef3d5a50c043ab07bb0","unresolved":false,"context_lines":[{"line_number":1887,"context_line":"    msg \u003d _(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":1888,"context_line":"            \"IP couldn\u0027t be found on this host\u0027s interfaces.\") % local_ip"},{"line_number":1889,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1890,"context_line":"        import netifaces"},{"line_number":1891,"context_line":""},{"line_number":1892,"context_line":"        addresses \u003d []"},{"line_number":1893,"context_line":"        for iface in netifaces.interfaces():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_c5636fb0","line":1890,"in_reply_to":"3a29b11f_1fef79e9","updated":"2015-10-19 18:05:25.000000000","message":"See comments in patchset 2 on requirements.txt","commit_id":"c5abe0b0aaa72cb906b9db4de2f88041d8db8a33"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"db049db2cf2f6d01e0c58accfe19b9f2db637f9a","unresolved":false,"context_lines":[{"line_number":1887,"context_line":"    msg \u003d _(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":1888,"context_line":"            \"IP couldn\u0027t be found on this host\u0027s interfaces.\") % local_ip"},{"line_number":1889,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1890,"context_line":"        import netifaces"},{"line_number":1891,"context_line":""},{"line_number":1892,"context_line":"        addresses \u003d []"},{"line_number":1893,"context_line":"        for iface in netifaces.interfaces():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_7fb5432f","line":1890,"in_reply_to":"3a29b11f_c5636fb0","updated":"2015-10-19 19:40:53.000000000","message":"Was suggestion adding:\n\n    if os.name \u003d\u003d \u0027nt\u0027:\n        import netifaces \n\nAt the top of the file.  Then the import statement would not be needed here.","commit_id":"c5abe0b0aaa72cb906b9db4de2f88041d8db8a33"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8db1be6f37e54f724193b4da681d343fbc42f177","unresolved":false,"context_lines":[{"line_number":1897,"context_line":"                if local_ip in addresses:"},{"line_number":1898,"context_line":"                    return"},{"line_number":1899,"context_line":"            except OSError:"},{"line_number":1900,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: \") %"},{"line_number":1901,"context_line":"                    iface)"},{"line_number":1902,"context_line":"                SystemExit(1)"},{"line_number":1903,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_079def64","line":1900,"updated":"2015-10-19 17:22:03.000000000","message":"it should be:\n\n LOG.error(_LE(...), iface)","commit_id":"c5abe0b0aaa72cb906b9db4de2f88041d8db8a33"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"e0d89cc3f5b8bf9f0a44aef3d5a50c043ab07bb0","unresolved":false,"context_lines":[{"line_number":1897,"context_line":"                if local_ip in addresses:"},{"line_number":1898,"context_line":"                    return"},{"line_number":1899,"context_line":"            except OSError:"},{"line_number":1900,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: \") %"},{"line_number":1901,"context_line":"                    iface)"},{"line_number":1902,"context_line":"                SystemExit(1)"},{"line_number":1903,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_25b02343","line":1900,"in_reply_to":"3a29b11f_079def64","updated":"2015-10-19 18:05:25.000000000","message":"Done","commit_id":"c5abe0b0aaa72cb906b9db4de2f88041d8db8a33"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8db1be6f37e54f724193b4da681d343fbc42f177","unresolved":false,"context_lines":[{"line_number":1899,"context_line":"            except OSError:"},{"line_number":1900,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: \") %"},{"line_number":1901,"context_line":"                    iface)"},{"line_number":1902,"context_line":"                SystemExit(1)"},{"line_number":1903,"context_line":"        LOG.error(msg)"},{"line_number":1904,"context_line":"        raise SystemExit(1)"},{"line_number":1905,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_07c64f67","line":1902,"updated":"2015-10-19 17:22:03.000000000","message":"It should be:\n\n SystemExit(1)","commit_id":"c5abe0b0aaa72cb906b9db4de2f88041d8db8a33"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"e0d89cc3f5b8bf9f0a44aef3d5a50c043ab07bb0","unresolved":false,"context_lines":[{"line_number":1899,"context_line":"            except OSError:"},{"line_number":1900,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: \") %"},{"line_number":1901,"context_line":"                    iface)"},{"line_number":1902,"context_line":"                SystemExit(1)"},{"line_number":1903,"context_line":"        LOG.error(msg)"},{"line_number":1904,"context_line":"        raise SystemExit(1)"},{"line_number":1905,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_45ad1fe8","line":1902,"in_reply_to":"3a29b11f_07c64f67","updated":"2015-10-19 18:05:25.000000000","message":"Done","commit_id":"c5abe0b0aaa72cb906b9db4de2f88041d8db8a33"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"4bf3c1086220cbbdf4518716e9a6df67a0bdea29","unresolved":false,"context_lines":[{"line_number":1887,"context_line":"    msg \u003d _(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":1888,"context_line":"            \"IP couldn\u0027t be found on this host\u0027s interfaces.\") % local_ip"},{"line_number":1889,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1890,"context_line":"        import netifaces"},{"line_number":1891,"context_line":""},{"line_number":1892,"context_line":"        addresses \u003d []"},{"line_number":1893,"context_line":"        for iface in netifaces.interfaces():"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a29b11f_14789029","line":1890,"updated":"2015-10-20 12:50:02.000000000","message":"IMHO, import statement can be put at the top with IF guard.","commit_id":"9da0f061cf38ec0bb99bb1a0a52c1b207b28ea29"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"4bf3c1086220cbbdf4518716e9a6df67a0bdea29","unresolved":false,"context_lines":[{"line_number":1897,"context_line":"                if local_ip in addresses:"},{"line_number":1898,"context_line":"                    return"},{"line_number":1899,"context_line":"            except OSError:"},{"line_number":1900,"context_line":"                LOG.error(_LE(\"Failed to get ip addresses for interface: \"),"},{"line_number":1901,"context_line":"                    iface)"},{"line_number":1902,"context_line":"                raise SystemExit(1)"},{"line_number":1903,"context_line":"        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a29b11f_d4d45821","line":1900,"updated":"2015-10-20 12:50:02.000000000","message":"ip addresses for interface: %s \"?","commit_id":"9da0f061cf38ec0bb99bb1a0a52c1b207b28ea29"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"fb732ac8b9096c3bf5fa1d3acdea64e476189fad","unresolved":false,"context_lines":[{"line_number":1888,"context_line":"    if not cfg.CONF.AGENT.tunnel_types:"},{"line_number":1889,"context_line":"        return"},{"line_number":1890,"context_line":""},{"line_number":1891,"context_line":"    msg \u003d _(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":1892,"context_line":"            \"IP couldn\u0027t be found on this host\u0027s interfaces.\") % local_ip"},{"line_number":1893,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1894,"context_line":"        addresses \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_15d5951a","line":1891,"range":{"start_line":1891,"start_character":10,"end_line":1891,"end_character":11},"updated":"2015-10-22 00:49:16.000000000","message":"commented in PS2","commit_id":"41884af1db1d1a8508699d53a9c85b936ff03a9f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2ce0926ac79435dd524e2f305a4a6b5a0c02acc9","unresolved":false,"context_lines":[{"line_number":1888,"context_line":"    if not cfg.CONF.AGENT.tunnel_types:"},{"line_number":1889,"context_line":"        return"},{"line_number":1890,"context_line":""},{"line_number":1891,"context_line":"    msg \u003d _(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":1892,"context_line":"            \"IP couldn\u0027t be found on this host\u0027s interfaces.\") % local_ip"},{"line_number":1893,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1894,"context_line":"        addresses \u003d []"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_5741f536","line":1891,"in_reply_to":"3a29b11f_15d5951a","updated":"2015-11-02 11:55:29.000000000","message":"Yes, should be _LE.","commit_id":"41884af1db1d1a8508699d53a9c85b936ff03a9f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2ce0926ac79435dd524e2f305a4a6b5a0c02acc9","unresolved":false,"context_lines":[{"line_number":1892,"context_line":"            \"IP couldn\u0027t be found on this host\u0027s interfaces.\") % local_ip"},{"line_number":1893,"context_line":"    if os.name \u003d\u003d \u0027nt\u0027:"},{"line_number":1894,"context_line":"        addresses \u003d []"},{"line_number":1895,"context_line":"        for iface in netifaces.interfaces():"},{"line_number":1896,"context_line":"            try:"},{"line_number":1897,"context_line":"                addresses \u003d [ip[\u0027addr\u0027] for ip in"},{"line_number":1898,"context_line":"                    netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])]"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_f7bcc107","line":1895,"updated":"2015-11-02 11:55:29.000000000","message":"I see that .interfaces() can also raise OSError or MemoryError. We should handle both gracefully.","commit_id":"41884af1db1d1a8508699d53a9c85b936ff03a9f"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"706d51ad5ea7097fb620a92e268fbde2a7883aa1","unresolved":false,"context_lines":[{"line_number":2065,"context_line":"    if not ip_lib.IPWrapper().get_device_by_ip(local_ip):"},{"line_number":2066,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":2067,"context_line":"                      \" IP couldn\u0027t be found on this host\u0027s interfaces.\"),"},{"line_number":2068,"context_line":"                 local_ip)"},{"line_number":2069,"context_line":"        raise SystemExit(1)"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_3078422a","line":2068,"updated":"2016-03-14 20:06:45.000000000","message":"this probably fails PEP8","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"011539edfa5b56215fcac3d35983d03d461dc26f","unresolved":false,"context_lines":[{"line_number":2065,"context_line":"    if not ip_lib.IPWrapper().get_device_by_ip(local_ip):"},{"line_number":2066,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":2067,"context_line":"                      \" IP couldn\u0027t be found on this host\u0027s interfaces.\"),"},{"line_number":2068,"context_line":"                 local_ip)"},{"line_number":2069,"context_line":"        raise SystemExit(1)"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_a5fecb35","line":2068,"in_reply_to":"3afc51ec_3078422a","updated":"2016-03-15 02:02:33.000000000","message":"this looks cosmetic, I\u0027d say revert it back?","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"8f9ffc55be8e48170228216e4436872612e1b2b3","unresolved":false,"context_lines":[{"line_number":2065,"context_line":"    if not ip_lib.IPWrapper().get_device_by_ip(local_ip):"},{"line_number":2066,"context_line":"        LOG.error(_LE(\"Tunneling can\u0027t be enabled with invalid local_ip \u0027%s\u0027. \""},{"line_number":2067,"context_line":"                      \" IP couldn\u0027t be found on this host\u0027s interfaces.\"),"},{"line_number":2068,"context_line":"                 local_ip)"},{"line_number":2069,"context_line":"        raise SystemExit(1)"},{"line_number":2070,"context_line":""},{"line_number":2071,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3afc51ec_7b073b18","line":2068,"in_reply_to":"3afc51ec_a5fecb35","updated":"2016-03-15 08:26:01.000000000","message":"Unintentional.","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"}],"neutron/tests/unit/agent/windows/test_ip_lib.py":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"89e74c3e97a9454114c28a9c461dcb399754dca5","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests import base\r"},{"line_number":21,"context_line":"\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"class TestIpWrapper(base.BaseTestCase):\r"},{"line_number":24,"context_line":"\r"},{"line_number":25,"context_line":"    def test_get_device_by_ip_no_ip(self):\r"},{"line_number":26,"context_line":"        ret \u003d ip_lib.IPWrapper().get_device_by_ip(None)\r"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_c0df3738","line":23,"updated":"2016-03-18 15:18:47.000000000","message":"these unit tests add limited value, since most of the calls are mocked. We should add a functional test where netifaces won\u0027t be mocked so that we can check that this windows ip_lib behaves as expected. It\u0027s true that the functional tests won\u0027t run on windows on the gate...but it\u0027s better than nothing.","commit_id":"7441d0b86207b02b5a5588215326add2d78a8ad2"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"fd5f82daef5413882760bcca6d5cd2dfadc8ddc0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.tests import base\r"},{"line_number":21,"context_line":"\r"},{"line_number":22,"context_line":"\r"},{"line_number":23,"context_line":"class TestIpWrapper(base.BaseTestCase):\r"},{"line_number":24,"context_line":"\r"},{"line_number":25,"context_line":"    def test_get_device_by_ip_no_ip(self):\r"},{"line_number":26,"context_line":"        ret \u003d ip_lib.IPWrapper().get_device_by_ip(None)\r"}],"source_content_type":"text/x-python","patch_set":15,"id":"1af94dfe_d611bd5e","line":23,"in_reply_to":"1af94dfe_c0df3738","updated":"2016-03-18 15:50:56.000000000","message":"IPWrapper and IPDevice only exist so that we can use common and no put a platform check in the validate_local_ip method for the agent. I don\u0027t understand what functional tests will prove, other than the fact that netifaces works. I am more than willing to do that, but I\u0027m not quite sure how. From what I see here: https://github.com/openstack/neutron/blob/master/neutron/tests/functional/agent/linux/test_ip_lib.py#L67\n\nIPWrapper itself is used to create a tap device on the host. IPWrapper on Windows does not have this capability and even if it did, we are testing on linux. My point is, I\u0027m not quite sure how the testing environment works and how I can find out what specific ip exists or not on that host.","commit_id":"7441d0b86207b02b5a5588215326add2d78a8ad2"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"88fd4658eeb68302d2f0db6d9ed5f804f11e5853","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        mock_interfaces.side_effects \u003d OSError\r"},{"line_number":59,"context_line":"        ret \u003d ip_lib.IPWrapper().get_devices()\r"},{"line_number":60,"context_line":"\r"},{"line_number":61,"context_line":"        self.assertEqual(0, len(ret))\r"},{"line_number":62,"context_line":"\r"},{"line_number":63,"context_line":"\r"},{"line_number":64,"context_line":"class TestIpDevice(base.BaseTestCase):\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"1af94dfe_a9a91826","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":37},"updated":"2016-03-19 17:03:51.000000000","message":"self.assertEqual([], ret)","commit_id":"4affa1c9f470e99bfa913fdc1c234275dbac547c"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"14e97261d0d4e42863ebbbc0aad05004dd4d1957","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        mock_interfaces.side_effects \u003d OSError\r"},{"line_number":59,"context_line":"        ret \u003d ip_lib.IPWrapper().get_devices()\r"},{"line_number":60,"context_line":"\r"},{"line_number":61,"context_line":"        self.assertEqual(0, len(ret))\r"},{"line_number":62,"context_line":"\r"},{"line_number":63,"context_line":"\r"},{"line_number":64,"context_line":"class TestIpDevice(base.BaseTestCase):\r"}],"source_content_type":"text/x-python","patch_set":17,"id":"1af94dfe_8428839b","line":61,"range":{"start_line":61,"start_character":8,"end_line":61,"end_character":37},"in_reply_to":"1af94dfe_a9a91826","updated":"2016-03-19 19:27:53.000000000","message":"Done","commit_id":"4affa1c9f470e99bfa913fdc1c234275dbac547c"}],"neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"c89eaa3e6a12acdb5739eeca7a23d38337b63efa","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import netifaces"},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"import time"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a1a9d01_1d3e2f8c","line":15,"updated":"2015-09-29 15:45:12.000000000","message":"It\u0027s 3party library, move to the next import section.","commit_id":"86b518856de2b54adde7a4866d1804e9be51268a"}],"requirements.txt":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"60b7679eee6c4a3dea0421bb27c6ead6e773700e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Jinja2\u003e\u003d2.6 # BSD License (3 clause)"},{"line_number":17,"context_line":"keystonemiddleware\u003e\u003d2.0.0"},{"line_number":18,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12"},{"line_number":19,"context_line":"netifaces\u003e\u003d0.10.4"},{"line_number":20,"context_line":"python-neutronclient\u003e\u003d2.6.0"},{"line_number":21,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":22,"context_line":"ryu\u003e\u003d3.23.2 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":2,"id":"7a2fa921_efee9deb","line":19,"updated":"2015-10-06 10:04:04.000000000","message":"can this be windows-only?\nlook at the last section in this file.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"66d1a8e86b35837e5e54d1d59e6913664061d402","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Jinja2\u003e\u003d2.6 # BSD License (3 clause)"},{"line_number":17,"context_line":"keystonemiddleware\u003e\u003d2.0.0"},{"line_number":18,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12"},{"line_number":19,"context_line":"netifaces\u003e\u003d0.10.4"},{"line_number":20,"context_line":"python-neutronclient\u003e\u003d2.6.0"},{"line_number":21,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":22,"context_line":"ryu\u003e\u003d3.23.2 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":2,"id":"7a2fa921_66b04844","line":19,"in_reply_to":"7a2fa921_24b6f78a","updated":"2015-10-07 07:35:55.000000000","message":"you can import it in validate_local_ip.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1438d2464792a29ba372d789ae7581c135a8bcea","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Jinja2\u003e\u003d2.6 # BSD License (3 clause)"},{"line_number":17,"context_line":"keystonemiddleware\u003e\u003d2.0.0"},{"line_number":18,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12"},{"line_number":19,"context_line":"netifaces\u003e\u003d0.10.4"},{"line_number":20,"context_line":"python-neutronclient\u003e\u003d2.6.0"},{"line_number":21,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":22,"context_line":"ryu\u003e\u003d3.23.2 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":2,"id":"7a2fa921_823f7bd5","line":19,"in_reply_to":"7a2fa921_66b04844","updated":"2015-10-07 15:22:10.000000000","message":"+ for making it win32 only.","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"0047e3cda56e4d1ef1f26065966059eb5462272d","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Jinja2\u003e\u003d2.6 # BSD License (3 clause)"},{"line_number":17,"context_line":"keystonemiddleware\u003e\u003d2.0.0"},{"line_number":18,"context_line":"netaddr!\u003d0.7.16,\u003e\u003d0.7.12"},{"line_number":19,"context_line":"netifaces\u003e\u003d0.10.4"},{"line_number":20,"context_line":"python-neutronclient\u003e\u003d2.6.0"},{"line_number":21,"context_line":"retrying!\u003d1.3.0,\u003e\u003d1.2.3 # Apache-2.0"},{"line_number":22,"context_line":"ryu\u003e\u003d3.23.2 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":2,"id":"7a2fa921_24b6f78a","line":19,"in_reply_to":"7a2fa921_efee9deb","updated":"2015-10-06 11:00:46.000000000","message":"Sure, but then I\u0027ll have to add a platform check at the import as well","commit_id":"48654da3eb389c2905042f80b1e9bc7e9bd5bfb7"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"52a96ceb3aa30cdde34dc074de46d2c361ca3938","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# Windows-only requirements"},{"line_number":46,"context_line":"pywin32;sys_platform\u003d\u003d\u0027win32\u0027"},{"line_number":47,"context_line":"wmi;sys_platform\u003d\u003d\u0027win32\u0027"},{"line_number":48,"context_line":"netifaces\u003e\u003d0.10.4;sys_platform\u003d\u003d\u0027win32\u0027"}],"source_content_type":"text/plain","patch_set":6,"id":"3a29b11f_c13e8727","line":48,"updated":"2015-10-21 21:39:38.000000000","message":"Looks like this needs to be added to global requirements\n\nhttp://docs.openstack.org/developer/requirements/","commit_id":"41884af1db1d1a8508699d53a9c85b936ff03a9f"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"fb732ac8b9096c3bf5fa1d3acdea64e476189fad","unresolved":false,"context_lines":[{"line_number":45,"context_line":"# Windows-only requirements"},{"line_number":46,"context_line":"pywin32;sys_platform\u003d\u003d\u0027win32\u0027"},{"line_number":47,"context_line":"wmi;sys_platform\u003d\u003d\u0027win32\u0027"},{"line_number":48,"context_line":"netifaces\u003e\u003d0.10.4;sys_platform\u003d\u003d\u0027win32\u0027"}],"source_content_type":"text/plain","patch_set":6,"id":"3a29b11f_b5f861c4","line":48,"in_reply_to":"3a29b11f_c13e8727","updated":"2015-10-22 00:49:16.000000000","message":"netifaces is in global req already.","commit_id":"41884af1db1d1a8508699d53a9c85b936ff03a9f"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"706d51ad5ea7097fb620a92e268fbde2a7883aa1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"oslo.utils\u003e\u003d3.5.0 # Apache-2.0"},{"line_number":43,"context_line":"oslo.versionedobjects\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":44,"context_line":"ovs\u003e\u003d2.4.0;python_version\u003d\u003d\u00272.7\u0027 # Apache-2.0"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"python-novaclient!\u003d2.33.0,\u003e\u003d2.29.0 # Apache-2.0"},{"line_number":47,"context_line":"python-designateclient\u003e\u003d1.5.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":8,"id":"3afc51ec_70b76ad8","side":"PARENT","line":45,"updated":"2016-03-14 20:06:45.000000000","message":"probably don\u0027t need this line deletion. I think we have it for readability.","commit_id":"53c03f5ed32d043cf963c6b67e4afa6d42ef1eaa"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"8f9ffc55be8e48170228216e4436872612e1b2b3","unresolved":false,"context_lines":[{"line_number":42,"context_line":"oslo.utils\u003e\u003d3.5.0 # Apache-2.0"},{"line_number":43,"context_line":"oslo.versionedobjects\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":44,"context_line":"ovs\u003e\u003d2.4.0;python_version\u003d\u003d\u00272.7\u0027 # Apache-2.0"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"python-novaclient!\u003d2.33.0,\u003e\u003d2.29.0 # Apache-2.0"},{"line_number":47,"context_line":"python-designateclient\u003e\u003d1.5.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":8,"id":"3afc51ec_5be07ffa","side":"PARENT","line":45,"in_reply_to":"3afc51ec_70b76ad8","updated":"2016-03-15 08:26:01.000000000","message":"Done","commit_id":"53c03f5ed32d043cf963c6b67e4afa6d42ef1eaa"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"011539edfa5b56215fcac3d35983d03d461dc26f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"python-designateclient\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"# Windows-only requirements"},{"line_number":49,"context_line":"netifaces\u003e\u003d0.10.4;sys_platform\u003d\u003d\u0027win32\u0027"}],"source_content_type":"text/plain","patch_set":8,"id":"3afc51ec_25c0fbdf","line":49,"updated":"2016-03-15 02:02:33.000000000","message":"I can see a requirement for netifaces in global requirements already, are we sure they are not gonna clash?\n\n[1] https://github.com/openstack/requirements/blob/master/global-requirements.txt#L90","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":12604,"name":"Adelina Tuvenie","email":"atuvenie@cloudbasesolutions.com","username":"atuvenie"},"change_message_id":"8f9ffc55be8e48170228216e4436872612e1b2b3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"python-designateclient\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"# Windows-only requirements"},{"line_number":49,"context_line":"netifaces\u003e\u003d0.10.4;sys_platform\u003d\u003d\u0027win32\u0027"}],"source_content_type":"text/plain","patch_set":8,"id":"3afc51ec_1bda774c","line":49,"in_reply_to":"3afc51ec_25c0fbdf","updated":"2016-03-15 08:26:01.000000000","message":"I\u0027m not exactly sure how the global requirements work in this case. I see that in global requirements we have netifaces\u003e\u003d0.10.4, same as here.","commit_id":"f53ad631b80e14b6c7a13e82d9d9316f9ebe13d5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bc0ac515de6940d80ca798cd648661b537703776","unresolved":false,"context_lines":[{"line_number":47,"context_line":"python-designateclient\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"# Windows-only requirements"},{"line_number":50,"context_line":"netifaces\u003e\u003d0.10.4;sys_platform\u003d\u003d\u0027win32\u0027"}],"source_content_type":"text/plain","patch_set":13,"id":"1af94dfe_038bf668","line":50,"updated":"2016-03-18 12:07:08.000000000","message":"this must match the global requirement as defined here:\n\nhttps://github.com/openstack/requirements/blob/master/global-requirements.txt#L90","commit_id":"b55a5d797dd98a225966f9f75f140850539e0f60"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2c9caa8ed4dbb986a4219bb1bbbd2b1b54bf3a11","unresolved":false,"context_lines":[{"line_number":47,"context_line":"python-designateclient\u003e\u003d1.5.0 # Apache-2.0"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"# Windows-only requirements"},{"line_number":50,"context_line":"netifaces\u003e\u003d0.10.4;sys_platform\u003d\u003d\u0027win32\u0027"}],"source_content_type":"text/plain","patch_set":14,"id":"1af94dfe_036776b7","line":50,"updated":"2016-03-18 12:08:03.000000000","message":"see PS13","commit_id":"cb0eb6601f34f67ddd31a938b9d8ba78676ffd45"}]}
