)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f2b535a5ef774d3c11df216ce4f21ec1170b6987","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Fix existing tests that fail because of the added check for IP version"},{"line_number":18,"context_line":"and subsequently valid IP addresses in _setup_tunnel_port."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I9ec137ef8c688b678a0c61f07e9a01382acbeb13"},{"line_number":21,"context_line":"Closes-Bug: #1525895"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a122d0e_c5f09c94","line":19,"updated":"2016-05-01 11:23:15.000000000","message":"IMHO DocImpact is necessary also","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"f8e7ba39af3817531d50dd387489c299fe5c771e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Fix existing tests that fail because of the added check for IP version"},{"line_number":18,"context_line":"and subsequently valid IP addresses in _setup_tunnel_port."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I9ec137ef8c688b678a0c61f07e9a01382acbeb13"},{"line_number":21,"context_line":"Closes-Bug: #1525895"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a122d0e_0e80f148","line":19,"in_reply_to":"1a122d0e_c5f09c94","updated":"2016-05-01 22:27:31.000000000","message":"+1","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0538e898b74251e28eb16f5d89d52d2d447cbec8","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Fix existing tests that fail because of the added check for IP version"},{"line_number":18,"context_line":"and subsequently valid IP addresses in _setup_tunnel_port."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I9ec137ef8c688b678a0c61f07e9a01382acbeb13"},{"line_number":21,"context_line":"Closes-Bug: #1525895"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"1a122d0e_93f7fdd3","line":19,"in_reply_to":"1a122d0e_c5f09c94","updated":"2016-05-02 15:59:34.000000000","message":"Will add it.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fa70e691015683c468da342985d968bf630d596b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Fix existing tests that fail because of the added check for IP version"},{"line_number":18,"context_line":"and subsequently valid IP addresses in _setup_tunnel_port."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"DocImpact"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9ec137ef8c688b678a0c61f07e9a01382acbeb13"},{"line_number":23,"context_line":"Closes-Bug: #1525895"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1a122d0e_fbfd4709","line":20,"updated":"2016-05-03 14:43:45.000000000","message":"I\u0027m going to add a release note and remove this tag","commit_id":"fb074a3e209ff88d3af124bcd7a563047fcb4ab8"}],"neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"eace563d7f34477eb3e524892a1fe086a0a52db1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"               help\u003d_(\"Peer patch port in tunnel bridge for integration \""},{"line_number":46,"context_line":"                      \"bridge.\")),"},{"line_number":47,"context_line":"    cfg.IPOpt(\u0027local_ip\u0027,"},{"line_number":48,"context_line":"              help\u003d_(\"Local IP address of tunnel endpoint.\")),"},{"line_number":49,"context_line":"    cfg.ListOpt(\u0027bridge_mappings\u0027,"},{"line_number":50,"context_line":"                default\u003dDEFAULT_BRIDGE_MAPPINGS,"},{"line_number":51,"context_line":"                help\u003d_(\"Comma-separated list of \u003cphysical_network\u003e:\u003cbridge\u003e \""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_05c5ba8c","line":48,"updated":"2016-01-08 22:02:41.000000000","message":"nit: think this can fix on one line now","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"3e63ddb58b316c5bb3feb2aa22f1876efe1cee66","unresolved":false,"context_lines":[{"line_number":45,"context_line":"               help\u003d_(\"Peer patch port in tunnel bridge for integration \""},{"line_number":46,"context_line":"                      \"bridge.\")),"},{"line_number":47,"context_line":"    cfg.IPOpt(\u0027local_ip\u0027,"},{"line_number":48,"context_line":"              help\u003d_(\"Local IP address of tunnel endpoint.\")),"},{"line_number":49,"context_line":"    cfg.ListOpt(\u0027bridge_mappings\u0027,"},{"line_number":50,"context_line":"                default\u003dDEFAULT_BRIDGE_MAPPINGS,"},{"line_number":51,"context_line":"                help\u003d_(\"Comma-separated list of \u003cphysical_network\u003e:\u003cbridge\u003e \""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_8caf077d","line":48,"in_reply_to":"fa69d971_05c5ba8c","updated":"2016-01-11 22:33:10.000000000","message":"Thanks, will fix in next patchset.","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"83548a29ff0665be9eb1711fbf507085dcb3a550","unresolved":false,"context_lines":[{"line_number":1626,"context_line":"        try:"},{"line_number":1627,"context_line":"            try:"},{"line_number":1628,"context_line":"                return \u0027%08x\u0027 % netaddr.IPAddress(ip_address, version\u003d4)"},{"line_number":1629,"context_line":"            except netaddr.core.AddrFormatError:"},{"line_number":1630,"context_line":"                try:"},{"line_number":1631,"context_line":"                    addr \u003d netaddr.IPAddress(ip_address, version\u003d6)"},{"line_number":1632,"context_line":"                    crc \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_4362683f","line":1629,"updated":"2015-12-14 15:18:27.000000000","message":"I\u0027d rather actually use netaddr to determine the family, instead of relying on the exception:\n\nnet \u003d netaddr.IPAddress(ip_address)\nif net.version \u003d\u003d 4:\n    return \u0027%08x\u0027 % net.value\nelse:\n    # ipv6","commit_id":"db46b1c8992cb5bb07c9c43df64137b3fdd9eea4"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"1082834fcdc2d760ffd9bbf79ec81aa21ee14c18","unresolved":false,"context_lines":[{"line_number":1626,"context_line":"        try:"},{"line_number":1627,"context_line":"            try:"},{"line_number":1628,"context_line":"                return \u0027%08x\u0027 % netaddr.IPAddress(ip_address, version\u003d4)"},{"line_number":1629,"context_line":"            except netaddr.core.AddrFormatError:"},{"line_number":1630,"context_line":"                try:"},{"line_number":1631,"context_line":"                    addr \u003d netaddr.IPAddress(ip_address, version\u003d6)"},{"line_number":1632,"context_line":"                    crc \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_81160547","line":1629,"in_reply_to":"7a740942_4362683f","updated":"2015-12-14 17:02:18.000000000","message":"My original thought was that initalizing netaddr with explicit version\u003d4 or version\u003d6 would ensure a valid interpretation of the string or an Exception.\n\nBut letting netaddr autodetect and throw exception if it fails will of course serve the same purpose, and will give cleaner code.\n\nI will go with your approach, thank you.","commit_id":"db46b1c8992cb5bb07c9c43df64137b3fdd9eea4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"83548a29ff0665be9eb1711fbf507085dcb3a550","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"                    crc \u003d 0"},{"line_number":1633,"context_line":"                    for x in addr.words:"},{"line_number":1634,"context_line":"                        crc \u003d binascii.crc32(bytes(x), crc)"},{"line_number":1635,"context_line":"                    return \u0027%08x\u0027 % (crc \u0026 0xffffffff)"},{"line_number":1636,"context_line":"                except Exception, e:"},{"line_number":1637,"context_line":"                    raise e"},{"line_number":1638,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_ae169346","line":1635,"updated":"2015-12-14 15:18:27.000000000","message":"Is using a crc32 over the textual representation enough?  See _get_snat_idx() in dvr_local_router.py\n\n    return \u0027%08x\u0027 % binascii.crc32(ip_address) \u0026 0xffffffff\n\nThis is only being used to make the tunnel name.","commit_id":"db46b1c8992cb5bb07c9c43df64137b3fdd9eea4"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"a1c14b1b9abcd64559740e6de81d267b04096694","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"                    crc \u003d 0"},{"line_number":1633,"context_line":"                    for x in addr.words:"},{"line_number":1634,"context_line":"                        crc \u003d binascii.crc32(bytes(x), crc)"},{"line_number":1635,"context_line":"                    return \u0027%08x\u0027 % (crc \u0026 0xffffffff)"},{"line_number":1636,"context_line":"                except Exception, e:"},{"line_number":1637,"context_line":"                    raise e"},{"line_number":1638,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a7e1126_64a9a323","line":1635,"updated":"2015-12-22 07:12:47.000000000","message":"Let\u0027s put a comment here to capture this discussion.","commit_id":"db46b1c8992cb5bb07c9c43df64137b3fdd9eea4"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"31ec37fb05d0ada1b56e00ce1e06a8d480074a1b","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"                    crc \u003d 0"},{"line_number":1633,"context_line":"                    for x in addr.words:"},{"line_number":1634,"context_line":"                        crc \u003d binascii.crc32(bytes(x), crc)"},{"line_number":1635,"context_line":"                    return \u0027%08x\u0027 % (crc \u0026 0xffffffff)"},{"line_number":1636,"context_line":"                except Exception, e:"},{"line_number":1637,"context_line":"                    raise e"},{"line_number":1638,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a7b0d38_8efcb23f","line":1635,"in_reply_to":"3a7e1126_64a9a323","updated":"2015-12-23 11:43:37.000000000","message":"Done","commit_id":"db46b1c8992cb5bb07c9c43df64137b3fdd9eea4"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"7bee6a6ddd6d7c944f2ee7fa69d3b5a7e4cf3f40","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"                    crc \u003d 0"},{"line_number":1633,"context_line":"                    for x in addr.words:"},{"line_number":1634,"context_line":"                        crc \u003d binascii.crc32(bytes(x), crc)"},{"line_number":1635,"context_line":"                    return \u0027%08x\u0027 % (crc \u0026 0xffffffff)"},{"line_number":1636,"context_line":"                except Exception, e:"},{"line_number":1637,"context_line":"                    raise e"},{"line_number":1638,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a710552_0441950b","line":1635,"in_reply_to":"7a740942_3a797a93","updated":"2015-12-15 02:46:01.000000000","message":"Just wanted to point out why this is so important to get unique. It is used to make the port and interface name. These values must be unique per table per host.\n\nNow, consider a system running with Neutron DVR where virtually every host has a tunnel to every other host. Here the probability for collission is substantial, and the effect of a collission is adverse as it will replace configuration used by a different tunnel subsequently leading to operational network failure.","commit_id":"db46b1c8992cb5bb07c9c43df64137b3fdd9eea4"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"1082834fcdc2d760ffd9bbf79ec81aa21ee14c18","unresolved":false,"context_lines":[{"line_number":1632,"context_line":"                    crc \u003d 0"},{"line_number":1633,"context_line":"                    for x in addr.words:"},{"line_number":1634,"context_line":"                        crc \u003d binascii.crc32(bytes(x), crc)"},{"line_number":1635,"context_line":"                    return \u0027%08x\u0027 % (crc \u0026 0xffffffff)"},{"line_number":1636,"context_line":"                except Exception, e:"},{"line_number":1637,"context_line":"                    raise e"},{"line_number":1638,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_3a797a93","line":1635,"in_reply_to":"7a740942_ae169346","updated":"2015-12-14 17:02:18.000000000","message":"Yes, the crc32 is insufficient and will probably provoke collissions in a sizeable installation. It was sufficient to have a PoC.\n\nThank you for the pointer, I will have a look at it and see if it can suffice.\n\nI will also explore other alternatives. Maybe a XOR-folded FNV1 could do the trick?","commit_id":"db46b1c8992cb5bb07c9c43df64137b3fdd9eea4"},{"author":{"_account_id":11255,"name":"Dustin Lundquist","username":"dustin.lundquist","inactive":true},"change_message_id":"50a6db245679f14e0f6a0a3e74778bc26bc4f46b","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import collections"},{"line_number":17,"context_line":"import signal"},{"line_number":18,"context_line":"import struct"},{"line_number":19,"context_line":"import sys"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_826807f7","line":18,"updated":"2016-01-12 15:52:21.000000000","message":"is this used?","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"eace563d7f34477eb3e524892a1fe086a0a52db1","unresolved":false,"context_lines":[{"line_number":1675,"context_line":"                #                 have other unique IDs we can make this from"},{"line_number":1676,"context_line":"                #                 Agent ID, Router ID or something similar?"},{"line_number":1677,"context_line":"                #                 Or do we need to push for Linux support for"},{"line_number":1678,"context_line":"                #                 longer interface names?"},{"line_number":1679,"context_line":"                #                 Make the hash algorithm configurable and"},{"line_number":1680,"context_line":"                #                 involve the operator?"},{"line_number":1681,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_83619faa","line":1678,"updated":"2016-01-08 22:02:41.000000000","message":"That could take years, neither of us will still be working on Neutron then...","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2dc30952978b14cc13ac9e8f2d4718359d2dd614","unresolved":false,"context_lines":[{"line_number":1675,"context_line":"                #                 have other unique IDs we can make this from"},{"line_number":1676,"context_line":"                #                 Agent ID, Router ID or something similar?"},{"line_number":1677,"context_line":"                #                 Or do we need to push for Linux support for"},{"line_number":1678,"context_line":"                #                 longer interface names?"},{"line_number":1679,"context_line":"                #                 Make the hash algorithm configurable and"},{"line_number":1680,"context_line":"                #                 involve the operator?"},{"line_number":1681,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_ddfe0b05","line":1678,"in_reply_to":"da6ed579_ac9d2b5b","updated":"2016-01-11 23:47:42.000000000","message":"\u003e Every change takes years. Change cannot happen if you don\u0027t even start.\n\nI understand, but it\u0027s been tried before.  There\u0027s a chicken/egg problem as you can\u0027t increase IFNAMSIZ without breaking existing apps as it\u0027s hard-coded in the ifreq structure.  And you can\u0027t break existing apps...\n\nMaybe it\u0027s worth it to ask on the ovs-dev mailing list about having unique tunnel names?","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"3e63ddb58b316c5bb3feb2aa22f1876efe1cee66","unresolved":false,"context_lines":[{"line_number":1675,"context_line":"                #                 have other unique IDs we can make this from"},{"line_number":1676,"context_line":"                #                 Agent ID, Router ID or something similar?"},{"line_number":1677,"context_line":"                #                 Or do we need to push for Linux support for"},{"line_number":1678,"context_line":"                #                 longer interface names?"},{"line_number":1679,"context_line":"                #                 Make the hash algorithm configurable and"},{"line_number":1680,"context_line":"                #                 involve the operator?"},{"line_number":1681,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_ac9d2b5b","line":1678,"in_reply_to":"fa69d971_83619faa","updated":"2016-01-11 22:33:10.000000000","message":"Every change takes years. Change cannot happen if you don\u0027t even start.","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"eace563d7f34477eb3e524892a1fe086a0a52db1","unresolved":false,"context_lines":[{"line_number":1677,"context_line":"                #                 Or do we need to push for Linux support for"},{"line_number":1678,"context_line":"                #                 longer interface names?"},{"line_number":1679,"context_line":"                #                 Make the hash algorithm configurable and"},{"line_number":1680,"context_line":"                #                 involve the operator?"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"                # Create 32-bit FNV-1 hash"},{"line_number":1683,"context_line":"                buf \u003d addr.packed"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_c6180578","line":1680,"updated":"2016-01-08 22:02:41.000000000","message":"I would rather crc32 hash the entire address string, since relying on certain bits being unique could be problematic.  For example, if I choose 2001:db8:1::/64 as a prefix then we just eliminated two bits of uniqueness from the hash since they\u0027ll be zero.\n\nI know that\u0027s what you did in PS1 and it seems like my comment was maybe negative, although I didn\u0027t intend it that way.\n\nWouldn\u0027t we have this collision today with IPv4 too?","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"3e63ddb58b316c5bb3feb2aa22f1876efe1cee66","unresolved":false,"context_lines":[{"line_number":1677,"context_line":"                #                 Or do we need to push for Linux support for"},{"line_number":1678,"context_line":"                #                 longer interface names?"},{"line_number":1679,"context_line":"                #                 Make the hash algorithm configurable and"},{"line_number":1680,"context_line":"                #                 involve the operator?"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"                # Create 32-bit FNV-1 hash"},{"line_number":1683,"context_line":"                buf \u003d addr.packed"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_2cee1bed","line":1680,"in_reply_to":"fa69d971_c6180578","updated":"2016-01-11 22:33:10.000000000","message":"I believe there are too many collissions to hash the entire address. I\u0027m running some tests and statistics to substantiate the assertion.\n\nThere is a reason for that networking gear still tend to have a 32-bit router-id configured even in a IPv6-only environment. May be OpenStack Neutron needs one if we find no other sollution for this.\n\nThere is no collissions for IPv4. The entire 32-bit IPv4 address fits nicely into the 8 byte hex/ascii representation used in the interface names.","commit_id":"eb57a7eadd9c3f4a582cfcb8822f66ae9a4fb1e3"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"ac8d9f3851228335baf2a005bbd48f79fa66f0b3","unresolved":false,"context_lines":[{"line_number":1709,"context_line":"                for n in (4, 6, 8, 14):"},{"line_number":1710,"context_line":"                    fnv_hash \u003d fnv_hash * FNV1_PRIME_32"},{"line_number":1711,"context_line":"                    fnv_hash \u003d fnv_hash ^ struct.unpack(\u0027!H1\u0027, buf[n:n + 2])[0]"},{"line_number":1712,"context_line":"                return \u0027%08x\u0027 % (fnv_hash \u0026 0xffffffff)"},{"line_number":1713,"context_line":"        except Exception:"},{"line_number":1714,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1715,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"da0c15f0_71e77cb0","line":1712,"updated":"2016-03-28 10:15:22.000000000","message":"I would rather just use the first 15 characters (or whatever the limit is) of a sha1 over the whole IP address encoded in base32. That gets us 75 bits of output space to work with (assuming 15 chars), which should be way more than we need to worry about for collisions.\n\nimport base64\nimport hashlib\nreturn base64.b32encode(hashlib.sha1(str(addr)).digest())[0:15]","commit_id":"5bf8f67f8d0fb0b576a23f875761772b59da8bbd"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7cbd92c7780663e1e47880ae179fb762572bceb9","unresolved":false,"context_lines":[{"line_number":1709,"context_line":"                for n in (4, 6, 8, 14):"},{"line_number":1710,"context_line":"                    fnv_hash \u003d fnv_hash * FNV1_PRIME_32"},{"line_number":1711,"context_line":"                    fnv_hash \u003d fnv_hash ^ struct.unpack(\u0027!H1\u0027, buf[n:n + 2])[0]"},{"line_number":1712,"context_line":"                return \u0027%08x\u0027 % (fnv_hash \u0026 0xffffffff)"},{"line_number":1713,"context_line":"        except Exception:"},{"line_number":1714,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1715,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a061dce_cb01ac3b","line":1712,"in_reply_to":"da0c15f0_71e77cb0","updated":"2016-04-08 21:12:24.000000000","message":"This can only be 8 chars, since the tunnel-type goes at the front, eg. vxlan-* or geneve-*\n\nBut I\u0027ll make the change.","commit_id":"5bf8f67f8d0fb0b576a23f875761772b59da8bbd"},{"author":{"_account_id":11255,"name":"Dustin Lundquist","username":"dustin.lundquist","inactive":true},"change_message_id":"35074a9d815050eae82f5e4e9c40255efc8a3e5b","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"        return failed_devices"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":"    @classmethod"},{"line_number":1675,"context_line":"    def get_ip_in_hex(cls, ip_address):"},{"line_number":1676,"context_line":"        try:"},{"line_number":1677,"context_line":"            # This string is used to build port and interface names in OVS."},{"line_number":1678,"context_line":"            # Port and interface names can be max 16 characters long,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_4149fd8d","line":1675,"updated":"2016-04-08 22:15:10.000000000","message":"@Kevin, Agreed on the upgrade case, do we want to fix the name so it isn\u0027t incorrect?","commit_id":"7e3bfff6f111ac66556510365cdfe296b6568ea8"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e959fec5b9ba986507a455dea3080df6b3caf6b7","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"        return failed_devices"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":"    @classmethod"},{"line_number":1675,"context_line":"    def get_ip_in_hex(cls, ip_address):"},{"line_number":1676,"context_line":"        try:"},{"line_number":1677,"context_line":"            # This string is used to build port and interface names in OVS."},{"line_number":1678,"context_line":"            # Port and interface names can be max 16 characters long,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a1b2928_10d00353","line":1675,"in_reply_to":"9a061dce_4149fd8d","updated":"2016-04-11 14:06:23.000000000","message":"I don\u0027t understand the \"so it isn\u0027t correct\" here","commit_id":"7e3bfff6f111ac66556510365cdfe296b6568ea8"},{"author":{"_account_id":11255,"name":"Dustin Lundquist","username":"dustin.lundquist","inactive":true},"change_message_id":"eb9bb3911fca135f8687e270f45e3d725cab78d0","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                bhash \u003d base64.b32encode(hashlib.sha1(str(addr)).digest())[0:8]"},{"line_number":1688,"context_line":"                return \u0027%08x\u0027 % bhash"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a061dce_0681db8f","line":1688,"updated":"2016-04-08 21:36:34.000000000","message":"Did you mean `return bhash`? (rather than hex encoding the first four characters of the hash)","commit_id":"7e3bfff6f111ac66556510365cdfe296b6568ea8"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e959fec5b9ba986507a455dea3080df6b3caf6b7","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                bhash \u003d base64.b32encode(hashlib.sha1(str(addr)).digest())[0:8]"},{"line_number":1688,"context_line":"                return \u0027%08x\u0027 % bhash"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a1b2928_d5779d00","line":1688,"in_reply_to":"9a061dce_0681db8f","updated":"2016-04-11 14:06:23.000000000","message":"Yes, I don\u0027t even know why I copy/pasted that line now...","commit_id":"7e3bfff6f111ac66556510365cdfe296b6568ea8"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f7461583f5399f55a18e57ae1a54f37cdecb34a2","unresolved":false,"context_lines":[{"line_number":1684,"context_line":"                return \u0027%08x\u0027 % addr"},{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                return base64.b32encode(hashlib.sha1(str(addr)).digest())[0:8]"},{"line_number":1688,"context_line":"        except Exception:"},{"line_number":1689,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1690,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a18252c_75ef1fe9","line":1687,"updated":"2016-04-14 15:02:55.000000000","message":"In py3.4 this needs an encode/decode since it needs to be in bytes, will fix.","commit_id":"201e1bbaea7c04ffb1cdc17dd86c59e629e4b2fb"},{"author":{"_account_id":11255,"name":"Dustin Lundquist","username":"dustin.lundquist","inactive":true},"change_message_id":"aab92d5363af6b5e02ac702d828358c2f3dc9226","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                              \"local_ip\u003d%(lip)s remote_ip\u003d%(rip)s\"),"},{"line_number":1411,"context_line":"                          {\u0027lip\u0027: self.local_ip, \u0027rip\u0027: remote_ip})"},{"line_number":1412,"context_line":"                return 0"},{"line_number":1413,"context_line":"        except Exception:"},{"line_number":1414,"context_line":"            LOG.error(_LE(\"Invalid local or remote IP, cannot create tunnel: \""},{"line_number":1415,"context_line":"                          \"local_ip\u003d%(lip)s remote_ip\u003d%(rip)s\"),"},{"line_number":1416,"context_line":"                      {\u0027lip\u0027: self.local_ip, \u0027rip\u0027: remote_ip})"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a18252c_545db345","line":1413,"updated":"2016-04-14 21:05:04.000000000","message":"except ValueError instead of all exceptions?","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":11255,"name":"Dustin Lundquist","username":"dustin.lundquist","inactive":true},"change_message_id":"53939ea987a453844223641849d1fcd4c339e768","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                              \"local_ip\u003d%(lip)s remote_ip\u003d%(rip)s\"),"},{"line_number":1411,"context_line":"                          {\u0027lip\u0027: self.local_ip, \u0027rip\u0027: remote_ip})"},{"line_number":1412,"context_line":"                return 0"},{"line_number":1413,"context_line":"        except Exception:"},{"line_number":1414,"context_line":"            LOG.error(_LE(\"Invalid local or remote IP, cannot create tunnel: \""},{"line_number":1415,"context_line":"                          \"local_ip\u003d%(lip)s remote_ip\u003d%(rip)s\"),"},{"line_number":1416,"context_line":"                      {\u0027lip\u0027: self.local_ip, \u0027rip\u0027: remote_ip})"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a18252c_42f168cc","line":1413,"in_reply_to":"5a18252c_0776626f","updated":"2016-04-15 02:38:32.000000000","message":"Makes sense, AddrFormatError is not a descendant of ValueError. So leave it as is.","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"647d6d833d5407cac50d2d898a0583e1daeb4ea4","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                              \"local_ip\u003d%(lip)s remote_ip\u003d%(rip)s\"),"},{"line_number":1411,"context_line":"                          {\u0027lip\u0027: self.local_ip, \u0027rip\u0027: remote_ip})"},{"line_number":1412,"context_line":"                return 0"},{"line_number":1413,"context_line":"        except Exception:"},{"line_number":1414,"context_line":"            LOG.error(_LE(\"Invalid local or remote IP, cannot create tunnel: \""},{"line_number":1415,"context_line":"                          \"local_ip\u003d%(lip)s remote_ip\u003d%(rip)s\"),"},{"line_number":1416,"context_line":"                      {\u0027lip\u0027: self.local_ip, \u0027rip\u0027: remote_ip})"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a18252c_0776626f","line":1413,"in_reply_to":"5a18252c_545db345","updated":"2016-04-15 01:50:36.000000000","message":"Yes, it would be good to make this check not so broad, but it could throw more than one error for invalid addresses:\n\n\u003e\u003e\u003e netaddr.IPAddress(\u0027foobar\u0027)\nnetaddr.core.AddrFormatError: failed to detect a valid IP address from \u0027foobar\u0027\n\n\u003e\u003e\u003e netaddr.IPAddress(\u00271.2.3.4/99\u0027)\nValueError: IPAddress() does not support netmasks or subnet prefixes! See documentation for details.\n\nSo I think leaving it is best ?","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"c6d8bb7f829931861814f4064c4506f6480696ce","unresolved":false,"context_lines":[{"line_number":1678,"context_line":"            # Port and interface names can be max 16 characters long,"},{"line_number":1679,"context_line":"            # including NULL, and must be unique per table per host.  We"},{"line_number":1680,"context_line":"            # must return only 8 chars since it will be appended to the"},{"line_number":1681,"context_line":"            # tunnel_type to create a name, for example, \u0027geneve-12345678\u0027."},{"line_number":1682,"context_line":"            addr \u003d netaddr.IPAddress(ip_address)"},{"line_number":1683,"context_line":"            if addr.version \u003d\u003d 4:"},{"line_number":1684,"context_line":"                return \u0027%08x\u0027 % addr"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a1531f4_d7805e49","line":1681,"updated":"2016-04-15 08:42:13.000000000","message":"FYI, 32bit hash has 1% chance of collision with 10000 ports.\n\nUsing shorter nicknames for network_type would be a easy way to get a few more bits of hash.","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3f91d6de1d79b7cde85bb50de12bb172fefc10df","unresolved":false,"context_lines":[{"line_number":1678,"context_line":"            # Port and interface names can be max 16 characters long,"},{"line_number":1679,"context_line":"            # including NULL, and must be unique per table per host.  We"},{"line_number":1680,"context_line":"            # must return only 8 chars since it will be appended to the"},{"line_number":1681,"context_line":"            # tunnel_type to create a name, for example, \u0027geneve-12345678\u0027."},{"line_number":1682,"context_line":"            addr \u003d netaddr.IPAddress(ip_address)"},{"line_number":1683,"context_line":"            if addr.version \u003d\u003d 4:"},{"line_number":1684,"context_line":"                return \u0027%08x\u0027 % addr"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_e49da8bc","line":1681,"in_reply_to":"3a1531f4_d7805e49","updated":"2016-04-22 15:52:19.000000000","message":"I just don\u0027t think that will be backwards-compatible, since we don\u0027t want to change anything in the IPv4 case.","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"c6d8bb7f829931861814f4064c4506f6480696ce","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a1531f4_d45b3c2d","line":1688,"updated":"2016-04-15 08:42:13.000000000","message":"If  we stick to 32 bits hash, using zlib.adler32 would be simpler and faster.","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":11255,"name":"Dustin Lundquist","username":"dustin.lundquist","inactive":true},"change_message_id":"a74201bf6e2d95e98a1e230818601b5c3f3d2250","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_73eac5ad","line":1688,"in_reply_to":"1a122d0e_245a002b","updated":"2016-04-25 17:20:39.000000000","message":"Are we okay with upper case interface names? Existing interface names are all lower case, maybe downcase for consistency?","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"08c0b2f0d92b2c5b09dc0aaa9762f14b29c45793","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_97d944f6","line":1688,"in_reply_to":"1a122d0e_245a002b","updated":"2016-04-26 06:16:30.000000000","message":"Bummer.  I botched math.  You already had 40bits hash.","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2b985b5fcf2fb86be23e24cf77b2fda4270d04bc","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_03533e18","line":1688,"in_reply_to":"1a122d0e_73eac5ad","updated":"2016-04-25 22:02:08.000000000","message":"I\u0027ll add a .lower() here, thanks","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3f91d6de1d79b7cde85bb50de12bb172fefc10df","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a122d0e_245a002b","line":1688,"in_reply_to":"3a1531f4_d45b3c2d","updated":"2016-04-22 15:52:19.000000000","message":"The problem is zlib.adler23() returns an integer, so we lose a lot in the hashing:\n\n\u003e\u003e\u003e zlib.adler32(\u00272001:db8::1\u0027)\n257163937\n\n\u003e\u003e\u003e sha1 \u003d hashlib.sha1(\u00272001:db8::1\u0027)\n\u003e\u003e\u003e base64.b32encode(sha1.digest())[0:8]\n\u0027D3WBIBJ5\u0027\n\nThe second has a lower chance of collisions.","commit_id":"2392b8cfbcadbf6ed1768adfa68f1f18b8237301"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"56d71d555e2588b5f7f687f7fc026dac10977510","unresolved":false,"context_lines":[{"line_number":1680,"context_line":"            # must return only 8 chars since it will be appended to the"},{"line_number":1681,"context_line":"            # tunnel_type to create a name, for example, \u0027geneve-12345678\u0027."},{"line_number":1682,"context_line":"            addr \u003d netaddr.IPAddress(ip_address)"},{"line_number":1683,"context_line":"            if addr.version \u003d\u003d 4:"},{"line_number":1684,"context_line":"                return \u0027%08x\u0027 % addr"},{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_462264a4","line":1683,"range":{"start_line":1683,"start_character":31,"end_line":1683,"end_character":32},"updated":"2016-04-25 23:42:44.000000000","message":"Can we use neutron_lib.constants.IP_VERSION_4 here?","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"52f33ea77bbff8c822155567b8cac5c51045e027","unresolved":false,"context_lines":[{"line_number":1680,"context_line":"            # must return only 8 chars since it will be appended to the"},{"line_number":1681,"context_line":"            # tunnel_type to create a name, for example, \u0027geneve-12345678\u0027."},{"line_number":1682,"context_line":"            addr \u003d netaddr.IPAddress(ip_address)"},{"line_number":1683,"context_line":"            if addr.version \u003d\u003d 4:"},{"line_number":1684,"context_line":"                return \u0027%08x\u0027 % addr"},{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_8dcf477e","line":1683,"range":{"start_line":1683,"start_character":31,"end_line":1683,"end_character":32},"in_reply_to":"1a122d0e_462264a4","updated":"2016-04-27 16:44:45.000000000","message":"Sure, I\u0027ll update","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"56d71d555e2588b5f7f687f7fc026dac10977510","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode().lower()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_86dbdc7b","line":1688,"range":{"start_line":1688,"start_character":55,"end_line":1688,"end_character":58},"updated":"2016-04-25 23:42:44.000000000","message":"Can we make a new constant that\u0027s equal to the max length of all the tunnel_types (including the dash), i.e.:\n\ntunnel_types \u003d [\u0027flat\u0027, \u0027vlan\u0027, \u0027geneve\u0027, ...]\nTUNNEL_NAME_PREFIX_MAX_LEN \u003d max(map(len, tunnel_types))\n\nthen use it like:\n\nHASH_LEN \u003d n_const.DEVICE_NAME_MAX_LEN - TUNNEL_NAME_PREFIX_MAX_LEN\nreturn base64.b32encode(sha1.digest())[0:HASH_LEN].decode().lower()\n\nThen there\u0027s really no need for the comment above.","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"e0469417a9f8a8953b09dc84a0cf80a7cb294fd7","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode().lower()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_6552bf68","line":1688,"range":{"start_line":1688,"start_character":55,"end_line":1688,"end_character":58},"in_reply_to":"1a122d0e_45c7c397","updated":"2016-04-27 20:34:51.000000000","message":"Ok, add me as a reviewer on the follow-up, and I\u0027ll review that patch as well. It definitely seems like there should be some kind of check in place to reduce possible collisions.","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"52f33ea77bbff8c822155567b8cac5c51045e027","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode().lower()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_adecc3bb","line":1688,"range":{"start_line":1688,"start_character":55,"end_line":1688,"end_character":58},"in_reply_to":"1a122d0e_86dbdc7b","updated":"2016-04-27 16:44:45.000000000","message":"I\u0027ll see what I can do, at worst we should make sure that we don\u0027t add a tunnel type with a name larger then geneve, just since having anything larger would increase our chances of collision.","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0743c7454da3bb3db521222695adde5b36b5d26a","unresolved":false,"context_lines":[{"line_number":1685,"context_line":"            else:"},{"line_number":1686,"context_line":"                # Create 32-bit Base32 encoded hash"},{"line_number":1687,"context_line":"                sha1 \u003d hashlib.sha1(ip_address.encode())"},{"line_number":1688,"context_line":"                return base64.b32encode(sha1.digest())[0:8].decode().lower()"},{"line_number":1689,"context_line":"        except Exception:"},{"line_number":1690,"context_line":"            LOG.warning(_LW(\"Invalid remote IP: %s\"), ip_address)"},{"line_number":1691,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_45c7c397","line":1688,"range":{"start_line":1688,"start_character":55,"end_line":1688,"end_character":58},"in_reply_to":"1a122d0e_adecc3bb","updated":"2016-04-27 20:15:13.000000000","message":"Actually, looking at this further, I\u0027d rather do it in a follow-up.  The IPv4 code on L1684 already hard-coded the 8, so we should be doing it there as well, and I want to leave that alone here to reduce scope (and possible breakage).","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"911276933c1c3fd00f6095a47f8566943067fadf","unresolved":false,"context_lines":[{"line_number":1677,"context_line":"    @classmethod"},{"line_number":1678,"context_line":"    def get_ip_in_hex(cls, ip_address):"},{"line_number":1679,"context_line":"        try:"},{"line_number":1680,"context_line":"            # This string is used to build port and interface names in OVS."},{"line_number":1681,"context_line":"            # Port and interface names can be max 16 characters long,"},{"line_number":1682,"context_line":"            # including NULL, and must be unique per table per host.  We"},{"line_number":1683,"context_line":"            # must return only 8 chars since it will be appended to the"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_2bccf233","line":1680,"updated":"2016-04-28 22:21:32.000000000","message":"I\u0027d say it makes more sense to cut/hash the long ipv6 address up on the caller, and not here.\n\nOtherwise the name of this method is missleading, returns a ipv4 in hex, and a hash for ipv6, weird.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"525d52a5d33461129c01d5f3135affa342acc45f","unresolved":false,"context_lines":[{"line_number":1677,"context_line":"    @classmethod"},{"line_number":1678,"context_line":"    def get_ip_in_hex(cls, ip_address):"},{"line_number":1679,"context_line":"        try:"},{"line_number":1680,"context_line":"            # This string is used to build port and interface names in OVS."},{"line_number":1681,"context_line":"            # Port and interface names can be max 16 characters long,"},{"line_number":1682,"context_line":"            # including NULL, and must be unique per table per host.  We"},{"line_number":1683,"context_line":"            # must return only 8 chars since it will be appended to the"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_45a3ec00","line":1680,"in_reply_to":"1a122d0e_2bccf233","updated":"2016-05-01 10:02:47.000000000","message":"I agree that name of this method is missleading, but why not change this method to return hash for all IP versions? Then there will be no such \"if\" in method and both ip versions would be treated in same way","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0538e898b74251e28eb16f5d89d52d2d447cbec8","unresolved":false,"context_lines":[{"line_number":1677,"context_line":"    @classmethod"},{"line_number":1678,"context_line":"    def get_ip_in_hex(cls, ip_address):"},{"line_number":1679,"context_line":"        try:"},{"line_number":1680,"context_line":"            # This string is used to build port and interface names in OVS."},{"line_number":1681,"context_line":"            # Port and interface names can be max 16 characters long,"},{"line_number":1682,"context_line":"            # including NULL, and must be unique per table per host.  We"},{"line_number":1683,"context_line":"            # must return only 8 chars since it will be appended to the"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_783afe35","line":1680,"in_reply_to":"1a122d0e_45a3ec00","updated":"2016-05-02 15:59:34.000000000","message":"Hopefully get_tunnel_hash() is a generic enough name.\n\nWe can\u0027t change how the IPv4 \"hash\" is calculated however, since doing that is not backwards-compatible, and will cause issues on an upgrade because the tunnel endpoint could already exist in the \"%08x\" format, and then we\u0027d create another device in the new format.  This was discussed in previous patch sets.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"829fa534b7043c6c0cbae6f1d1e50e8465612254","unresolved":false,"context_lines":[{"line_number":1677,"context_line":"    @classmethod"},{"line_number":1678,"context_line":"    def get_ip_in_hex(cls, ip_address):"},{"line_number":1679,"context_line":"        try:"},{"line_number":1680,"context_line":"            # This string is used to build port and interface names in OVS."},{"line_number":1681,"context_line":"            # Port and interface names can be max 16 characters long,"},{"line_number":1682,"context_line":"            # including NULL, and must be unique per table per host.  We"},{"line_number":1683,"context_line":"            # must return only 8 chars since it will be appended to the"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_912370a7","line":1680,"in_reply_to":"1a122d0e_783afe35","updated":"2016-05-02 19:48:44.000000000","message":"Ok, Your arguments makes sense. I thought that there can be problem with compatibility but I wanted to try at least :)","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fa70e691015683c468da342985d968bf630d596b","unresolved":false,"context_lines":[{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    @classmethod"},{"line_number":1725,"context_line":"    def get_tunnel_name(cls, network_type, local_ip, remote_ip):"},{"line_number":1726,"context_line":"        remote_tunnel_hash \u003d cls.get_tunnel_hash(remote_ip)"},{"line_number":1727,"context_line":"        if not remote_tunnel_hash:"},{"line_number":1728,"context_line":"            return None"},{"line_number":1729,"context_line":"        return \u0027%s-%s\u0027 % (network_type, remote_tunnel_hash)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a122d0e_7bdc9774","line":1726,"updated":"2016-05-03 14:43:45.000000000","message":"Rawlin - after looking at this again (and the test for it), I think it would be best to add a \"hash length\" argument to get_tunnel_hash() based on the maximum space available after we subtract (tunnel_type + \"-\"), or \"gre-\".  Otherwise once we hard-code it to 8 we\u0027re stuck with it as an upgrade that increases the length from what it is.\n\nSo basically, the shorter the tunnel_type string, the longer hash value we append to it, up to the maximum allowed by the kernel.","commit_id":"fb074a3e209ff88d3af124bcd7a563047fcb4ab8"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"7c4f53db7a5dcf20339ccd247fbdd4bf61c79ecb","unresolved":false,"context_lines":[{"line_number":1723,"context_line":""},{"line_number":1724,"context_line":"    @classmethod"},{"line_number":1725,"context_line":"    def get_tunnel_name(cls, network_type, local_ip, remote_ip):"},{"line_number":1726,"context_line":"        remote_tunnel_hash \u003d cls.get_tunnel_hash(remote_ip)"},{"line_number":1727,"context_line":"        if not remote_tunnel_hash:"},{"line_number":1728,"context_line":"            return None"},{"line_number":1729,"context_line":"        return \u0027%s-%s\u0027 % (network_type, remote_tunnel_hash)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a122d0e_700dce34","line":1726,"in_reply_to":"1a122d0e_7bdc9774","updated":"2016-05-03 17:13:38.000000000","message":"Great idea, I like that approach better.","commit_id":"fb074a3e209ff88d3af124bcd7a563047fcb4ab8"}],"neutron/tests/common/agents/ovs_agent.py":[{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"452a6a903650b37524a68b05e6c374453df54d3f","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def get_tunnel_name_full(cls, network_type, local_ip, remote_ip):"},{"line_number":27,"context_line":"    network_type \u003d network_type[:3]"},{"line_number":28,"context_line":"    remote_tunnel_hash \u003d cls.get_tunnel_hash(remote_ip)"},{"line_number":29,"context_line":"    if not remote_tunnel_hash:"},{"line_number":30,"context_line":"        return None"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a122d0e_f54b9084","line":28,"range":{"start_line":28,"start_character":25,"end_line":28,"end_character":55},"updated":"2016-05-03 17:13:24.000000000","message":"I think you missed adding a hashlen parameter here","commit_id":"3a4a7e95d0d712ffcef3830aafabb2b5b5479607"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9e13bd39c35c229ccaf2a0f481861150f354becb","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def get_tunnel_name_full(cls, network_type, local_ip, remote_ip):"},{"line_number":27,"context_line":"    network_type \u003d network_type[:3]"},{"line_number":28,"context_line":"    remote_tunnel_hash \u003d cls.get_tunnel_hash(remote_ip)"},{"line_number":29,"context_line":"    if not remote_tunnel_hash:"},{"line_number":30,"context_line":"        return None"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"1a122d0e_50aff27c","line":28,"range":{"start_line":28,"start_character":25,"end_line":28,"end_character":55},"in_reply_to":"1a122d0e_f54b9084","updated":"2016-05-03 17:25:57.000000000","message":"Will fix, thanks.","commit_id":"3a4a7e95d0d712ffcef3830aafabb2b5b5479607"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"defa7b1d2f3e0aeb76ac3c6e5de10c14510b2c2d","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    remote_tunnel_hash \u003d cls.get_tunnel_hash(remote_ip, hashlen)"},{"line_number":32,"context_line":"    if not remote_tunnel_hash:"},{"line_number":33,"context_line":"        return None"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    remote_tunnel_hash \u003d encodeutils.to_utf8(remote_tunnel_hash)"},{"line_number":36,"context_line":"    remote_ip_hash \u003d hashlib.sha1(remote_tunnel_hash).hexdigest()[:hashlen]"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_c0fca641","line":33,"updated":"2016-05-04 15:54:03.000000000","message":"you do not need to specify the None. By default None is returned","commit_id":"773394a1887bec6ab4c2ff0308f0e830e9a9089f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4950c303bfc6d8e576fdb5db181b28feb66c4382","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    remote_tunnel_hash \u003d cls.get_tunnel_hash(remote_ip, hashlen)"},{"line_number":32,"context_line":"    if not remote_tunnel_hash:"},{"line_number":33,"context_line":"        return None"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    remote_tunnel_hash \u003d encodeutils.to_utf8(remote_tunnel_hash)"},{"line_number":36,"context_line":"    remote_ip_hash \u003d hashlib.sha1(remote_tunnel_hash).hexdigest()[:hashlen]"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_06e2362f","line":33,"in_reply_to":"1a122d0e_c0fca641","updated":"2016-05-04 16:16:51.000000000","message":"If I respin I\u0027ll fix it but it was this way in the original","commit_id":"773394a1887bec6ab4c2ff0308f0e830e9a9089f"}],"neutron/tests/functional/agent/l2/base.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"525d52a5d33461129c01d5f3135affa342acc45f","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            tunnel_types \u003d [p_const.TYPE_VXLAN]"},{"line_number":106,"context_line":"        else:"},{"line_number":107,"context_line":"            tunnel_types \u003d None"},{"line_number":108,"context_line":"        local_ip \u003d local_ip or \u0027192.168.10.1\u0027"},{"line_number":109,"context_line":"        bridge_mappings \u003d [\u0027physnet:%s\u0027 % self.br_phys]"},{"line_number":110,"context_line":"        self.config.set_override(\u0027tunnel_types\u0027, tunnel_types, \"AGENT\")"},{"line_number":111,"context_line":"        self.config.set_override(\u0027polling_interval\u0027, 1, \"AGENT\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_25a870db","line":108,"updated":"2016-05-01 10:02:47.000000000","message":"is it necessary to do it like that? Can\u0027t be \u0027192.168.10.1\u0027 just default value of this parameter?","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0538e898b74251e28eb16f5d89d52d2d447cbec8","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            tunnel_types \u003d [p_const.TYPE_VXLAN]"},{"line_number":106,"context_line":"        else:"},{"line_number":107,"context_line":"            tunnel_types \u003d None"},{"line_number":108,"context_line":"        local_ip \u003d local_ip or \u0027192.168.10.1\u0027"},{"line_number":109,"context_line":"        bridge_mappings \u003d [\u0027physnet:%s\u0027 % self.br_phys]"},{"line_number":110,"context_line":"        self.config.set_override(\u0027tunnel_types\u0027, tunnel_types, \"AGENT\")"},{"line_number":111,"context_line":"        self.config.set_override(\u0027polling_interval\u0027, 1, \"AGENT\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_f384715e","line":108,"in_reply_to":"1a122d0e_25a870db","updated":"2016-05-02 15:59:34.000000000","message":"This is just how the original author did it, but I can change it.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"}],"neutron/tests/functional/agent/test_l2_ovs_agent.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"f8e7ba39af3817531d50dd387489c299fe5c771e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        self.wait_until_ports_state(self.ports, up\u003dTrue)"},{"line_number":213,"context_line":"        self.assert_vlan_tags(self.ports, self.agent)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def test_assert_bridges_ports_vxlan(self):"},{"line_number":216,"context_line":"        agent \u003d self.create_agent()"},{"line_number":217,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_int))"},{"line_number":218,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_tun))"},{"line_number":219,"context_line":"        self.assert_bridge_ports()"},{"line_number":220,"context_line":"        self.assert_patch_ports(agent)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def test_assert_bridges_ports_vxlan_ipv6(self):"},{"line_number":223,"context_line":"        agent \u003d self.create_agent(local_ip\u003d\u00272001:db8:100::1\u0027)"},{"line_number":224,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_int))"},{"line_number":225,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_tun))"},{"line_number":226,"context_line":"        self.assert_bridge_ports()"},{"line_number":227,"context_line":"        self.assert_patch_ports(agent)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_assert_bridges_ports_no_tunnel(self):"},{"line_number":230,"context_line":"        self.create_agent(create_tunnels\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_ce8ef978","line":227,"range":{"start_line":215,"start_character":0,"end_line":227,"end_character":38},"updated":"2016-05-01 22:27:31.000000000","message":"I think the duplication can be eliminated here by using a helper method.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0538e898b74251e28eb16f5d89d52d2d447cbec8","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        self.wait_until_ports_state(self.ports, up\u003dTrue)"},{"line_number":213,"context_line":"        self.assert_vlan_tags(self.ports, self.agent)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def test_assert_bridges_ports_vxlan(self):"},{"line_number":216,"context_line":"        agent \u003d self.create_agent()"},{"line_number":217,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_int))"},{"line_number":218,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_tun))"},{"line_number":219,"context_line":"        self.assert_bridge_ports()"},{"line_number":220,"context_line":"        self.assert_patch_ports(agent)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def test_assert_bridges_ports_vxlan_ipv6(self):"},{"line_number":223,"context_line":"        agent \u003d self.create_agent(local_ip\u003d\u00272001:db8:100::1\u0027)"},{"line_number":224,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_int))"},{"line_number":225,"context_line":"        self.assertTrue(self.ovs.bridge_exists(self.br_tun))"},{"line_number":226,"context_line":"        self.assert_bridge_ports()"},{"line_number":227,"context_line":"        self.assert_patch_ports(agent)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_assert_bridges_ports_no_tunnel(self):"},{"line_number":230,"context_line":"        self.create_agent(create_tunnels\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_f360f1a6","line":227,"range":{"start_line":215,"start_character":0,"end_line":227,"end_character":38},"in_reply_to":"1a122d0e_ce8ef978","updated":"2016-05-02 15:59:34.000000000","message":"I\u0027ll fix it.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"}],"neutron/tests/functional/agent/test_ovs_lib.py":[{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"56d71d555e2588b5f7f687f7fc026dac10977510","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        port_name \u003d tests_base.get_rand_device_name(net_helpers.PORT_PREFIX)"},{"line_number":170,"context_line":"        self.br.add_tunnel_port(port_name, attrs[\u0027remote_ip\u0027],"},{"line_number":171,"context_line":"                                attrs[\u0027local_ip\u0027])"},{"line_number":172,"context_line":"        self.assertEqual(self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027type\u0027),"},{"line_number":173,"context_line":"                         \u0027gre\u0027)"},{"line_number":174,"context_line":"        options \u003d self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027options\u0027)"},{"line_number":175,"context_line":"        for attr, val in attrs.items():"},{"line_number":176,"context_line":"            self.assertEqual(val, options[attr])"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_c66674ba","line":173,"range":{"start_line":172,"start_character":25,"end_line":173,"end_character":30},"updated":"2016-04-25 23:42:44.000000000","message":"nit: assertEqual\u0027s signature is (expected, observed).","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"52f33ea77bbff8c822155567b8cac5c51045e027","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        port_name \u003d tests_base.get_rand_device_name(net_helpers.PORT_PREFIX)"},{"line_number":170,"context_line":"        self.br.add_tunnel_port(port_name, attrs[\u0027remote_ip\u0027],"},{"line_number":171,"context_line":"                                attrs[\u0027local_ip\u0027])"},{"line_number":172,"context_line":"        self.assertEqual(self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027type\u0027),"},{"line_number":173,"context_line":"                         \u0027gre\u0027)"},{"line_number":174,"context_line":"        options \u003d self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027options\u0027)"},{"line_number":175,"context_line":"        for attr, val in attrs.items():"},{"line_number":176,"context_line":"            self.assertEqual(val, options[attr])"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_edbfdbcd","line":173,"range":{"start_line":172,"start_character":25,"end_line":173,"end_character":30},"in_reply_to":"1a122d0e_c66674ba","updated":"2016-04-27 16:44:45.000000000","message":"And I thought we had fixed all these issues so that my cut/paste from L158 would be good :)","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"e0469417a9f8a8953b09dc84a0cf80a7cb294fd7","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        port_name \u003d tests_base.get_rand_device_name(net_helpers.PORT_PREFIX)"},{"line_number":170,"context_line":"        self.br.add_tunnel_port(port_name, attrs[\u0027remote_ip\u0027],"},{"line_number":171,"context_line":"                                attrs[\u0027local_ip\u0027])"},{"line_number":172,"context_line":"        self.assertEqual(self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027type\u0027),"},{"line_number":173,"context_line":"                         \u0027gre\u0027)"},{"line_number":174,"context_line":"        options \u003d self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027options\u0027)"},{"line_number":175,"context_line":"        for attr, val in attrs.items():"},{"line_number":176,"context_line":"            self.assertEqual(val, options[attr])"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a122d0e_c555931e","line":173,"range":{"start_line":172,"start_character":25,"end_line":173,"end_character":30},"in_reply_to":"1a122d0e_edbfdbcd","updated":"2016-04-27 20:34:51.000000000","message":"Yeah, I\u0027m not sure it was ever fixed for all of neutron - https://blueprints.launchpad.net/neutron/+spec/assertequal-standard-usage shows that it was frozen. In the associated bug it was mentioned as too much effort/not worth it.","commit_id":"d1cac654e348877a788ec6d30d1b02bd895c9c49"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"f8e7ba39af3817531d50dd387489c299fe5c771e","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        for attr, val in attrs.items():"},{"line_number":162,"context_line":"            self.assertEqual(val, options[attr])"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def test_add_tunnel_port_ipv6(self):"},{"line_number":165,"context_line":"        attrs \u003d {"},{"line_number":166,"context_line":"            \u0027remote_ip\u0027: \u00272001:db8:200::1\u0027,"},{"line_number":167,"context_line":"            \u0027local_ip\u0027: \u00272001:db8:100::1\u0027,"},{"line_number":168,"context_line":"        }"},{"line_number":169,"context_line":"        port_name \u003d tests_base.get_rand_device_name(net_helpers.PORT_PREFIX)"},{"line_number":170,"context_line":"        self.br.add_tunnel_port(port_name, attrs[\u0027remote_ip\u0027],"},{"line_number":171,"context_line":"                                attrs[\u0027local_ip\u0027])"},{"line_number":172,"context_line":"        self.assertEqual(\u0027gre\u0027,"},{"line_number":173,"context_line":"                         self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027type\u0027))"},{"line_number":174,"context_line":"        options \u003d self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027options\u0027)"},{"line_number":175,"context_line":"        for attr, val in attrs.items():"},{"line_number":176,"context_line":"            self.assertEqual(val, options[attr])"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def test_add_patch_port(self):"},{"line_number":179,"context_line":"        local \u003d tests_base.get_rand_device_name(net_helpers.PORT_PREFIX)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_ae8bbd67","line":176,"range":{"start_line":164,"start_character":0,"end_line":176,"end_character":48},"updated":"2016-05-01 22:27:31.000000000","message":"The duplication can be eliminated here.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0538e898b74251e28eb16f5d89d52d2d447cbec8","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        for attr, val in attrs.items():"},{"line_number":162,"context_line":"            self.assertEqual(val, options[attr])"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def test_add_tunnel_port_ipv6(self):"},{"line_number":165,"context_line":"        attrs \u003d {"},{"line_number":166,"context_line":"            \u0027remote_ip\u0027: \u00272001:db8:200::1\u0027,"},{"line_number":167,"context_line":"            \u0027local_ip\u0027: \u00272001:db8:100::1\u0027,"},{"line_number":168,"context_line":"        }"},{"line_number":169,"context_line":"        port_name \u003d tests_base.get_rand_device_name(net_helpers.PORT_PREFIX)"},{"line_number":170,"context_line":"        self.br.add_tunnel_port(port_name, attrs[\u0027remote_ip\u0027],"},{"line_number":171,"context_line":"                                attrs[\u0027local_ip\u0027])"},{"line_number":172,"context_line":"        self.assertEqual(\u0027gre\u0027,"},{"line_number":173,"context_line":"                         self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027type\u0027))"},{"line_number":174,"context_line":"        options \u003d self.ovs.db_get_val(\u0027Interface\u0027, port_name, \u0027options\u0027)"},{"line_number":175,"context_line":"        for attr, val in attrs.items():"},{"line_number":176,"context_line":"            self.assertEqual(val, options[attr])"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def test_add_patch_port(self):"},{"line_number":179,"context_line":"        local \u003d tests_base.get_rand_device_name(net_helpers.PORT_PREFIX)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a122d0e_93709d75","line":176,"range":{"start_line":164,"start_character":0,"end_line":176,"end_character":48},"in_reply_to":"1a122d0e_ae8bbd67","updated":"2016-05-02 15:59:34.000000000","message":"I\u0027ll fix it.","commit_id":"faa81068fd598bea759ca0aa957d4abf8d4a95d4"}]}
