)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     zhhuabj \u003czhhuabj@cn.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-10-18 17:26:58 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow using non-zero-compression ipv6 address"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now neutron supports zero-compression ipv6 address like"},{"line_number":10,"context_line":"\u00272001:db8::10:10:10:0/120\u0027, but don\u0027t support"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATH%2F%2FSJk%3D","line":7,"updated":"2013-10-18 13:11:12.000000000","message":"compressed","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Allow using non-zero-compression ipv6 address"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now neutron supports zero-compression ipv6 address like"},{"line_number":10,"context_line":"\u00272001:db8::10:10:10:0/120\u0027, but don\u0027t support"},{"line_number":11,"context_line":"non-zero-compression ipv6 address like"},{"line_number":12,"context_line":"\u00272001:db8:0:0:10:10:10:0/120\u0027 that will cause the exception"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATH%2F%2FSJc%3D","line":9,"updated":"2013-10-18 13:11:12.000000000","message":"compressed","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now neutron supports zero-compression ipv6 address like"},{"line_number":10,"context_line":"\u00272001:db8::10:10:10:0/120\u0027, but don\u0027t support"},{"line_number":11,"context_line":"non-zero-compression ipv6 address like"},{"line_number":12,"context_line":"\u00272001:db8:0:0:10:10:10:0/120\u0027 that will cause the exception"},{"line_number":13,"context_line":"\"\u00272001:db8:0:0:10:10:10:0/120\u0027 isn\u0027t a recognized IP subnet cidr,"},{"line_number":14,"context_line":"\u00272001:db8::10:10:10:0/120\u0027 is recommended\"."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATH%2F%2FSJU%3D","line":11,"updated":"2013-10-18 13:11:12.000000000","message":"compressed","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"}],"neutron/api/v2/attributes.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"a8fb57baf101f98e953d2e7c893f91dfc93ad502","unresolved":false,"context_lines":[{"line_number":268,"context_line":"    try:"},{"line_number":269,"context_line":"        net \u003d netaddr.IPNetwork(_validate_no_whitespace(data))"},{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        if net.version \u003d\u003d 6 and \u0027/\u0027 in data:"},{"line_number":272,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":273,"context_line":"            addr \u003d netaddr.IPNetwork(addr)"},{"line_number":274,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FVog%3D","line":271,"updated":"2013-10-17 15:27:27.000000000","message":"consider placing a comment describing why is this needed.","commit_id":"bc24f2f930a54a0ca0a9af1b50e34b6d2caf8ab2"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"05d5685d7ad275b1c301fe0375e485c7bbb17adb","unresolved":false,"context_lines":[{"line_number":268,"context_line":"    try:"},{"line_number":269,"context_line":"        net \u003d netaddr.IPNetwork(_validate_no_whitespace(data))"},{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        if net.version \u003d\u003d 6 and \u0027/\u0027 in data:"},{"line_number":272,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":273,"context_line":"            addr \u003d netaddr.IPNetwork(addr)"},{"line_number":274,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FS54%3D","line":271,"in_reply_to":"AAAATH%2F%2FVog%3D","updated":"2013-10-18 07:59:31.000000000","message":"Done","commit_id":"bc24f2f930a54a0ca0a9af1b50e34b6d2caf8ab2"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"a8fb57baf101f98e953d2e7c893f91dfc93ad502","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":273,"context_line":"            addr \u003d netaddr.IPNetwork(addr)"},{"line_number":274,"context_line":"            addr \u003d str(addr.network)"},{"line_number":275,"context_line":"            data \u003d \"%s/%s\" % (addr, prefixlen)"},{"line_number":276,"context_line":"        if (cidr !\u003d data):"},{"line_number":277,"context_line":"            msg \u003d _(\"\u0027%(data)s\u0027 isn\u0027t a recognized IP subnet cidr,\""},{"line_number":278,"context_line":"                    \" \u0027%(cidr)s\u0027 is recommended\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FVjo%3D","line":275,"updated":"2013-10-17 15:27:27.000000000","message":"consider\n data \u003d \"%s/%s\" % (net.network, prefixlen)\nand hence no need for #273-274","commit_id":"bc24f2f930a54a0ca0a9af1b50e34b6d2caf8ab2"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"05d5685d7ad275b1c301fe0375e485c7bbb17adb","unresolved":false,"context_lines":[{"line_number":272,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":273,"context_line":"            addr \u003d netaddr.IPNetwork(addr)"},{"line_number":274,"context_line":"            addr \u003d str(addr.network)"},{"line_number":275,"context_line":"            data \u003d \"%s/%s\" % (addr, prefixlen)"},{"line_number":276,"context_line":"        if (cidr !\u003d data):"},{"line_number":277,"context_line":"            msg \u003d _(\"\u0027%(data)s\u0027 isn\u0027t a recognized IP subnet cidr,\""},{"line_number":278,"context_line":"                    \" \u0027%(cidr)s\u0027 is recommended\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATH%2F%2FS5s%3D","line":275,"in_reply_to":"AAAATH%2F%2FVjo%3D","updated":"2013-10-18 07:59:31.000000000","message":"hi oleg, very thanks for your review, for why need for #273-274, please refer the comment describing in patch set 2 that address your above comment, and I also add a new test case to address your this comment in patch set 2, thanks.","commit_id":"bc24f2f930a54a0ca0a9af1b50e34b6d2caf8ab2"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":268,"context_line":"    try:"},{"line_number":269,"context_line":"        net \u003d netaddr.IPNetwork(_validate_no_whitespace(data))"},{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        # NOTE(zhhuabj): Supporting non-zero-compression ipv6 address."},{"line_number":272,"context_line":"        #                For example, like \u00272001:db8:0:0:10:10:10:0/120\u0027"},{"line_number":273,"context_line":"        #                will be compressed into something like"},{"line_number":274,"context_line":"        #                \u00272001:db8::10:10:10:0/120\u0027 after rendering by"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSJE%3D","line":271,"updated":"2013-10-18 13:11:12.000000000","message":"compressed","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        net \u003d netaddr.IPNetwork(_validate_no_whitespace(data))"},{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        # NOTE(zhhuabj): Supporting non-zero-compression ipv6 address."},{"line_number":272,"context_line":"        #                For example, like \u00272001:db8:0:0:10:10:10:0/120\u0027"},{"line_number":273,"context_line":"        #                will be compressed into something like"},{"line_number":274,"context_line":"        #                \u00272001:db8::10:10:10:0/120\u0027 after rendering by"},{"line_number":275,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSI4%3D","line":272,"updated":"2013-10-18 13:11:12.000000000","message":"Remove \u0027like\u0027","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        # NOTE(zhhuabj): Supporting non-zero-compression ipv6 address."},{"line_number":272,"context_line":"        #                For example, like \u00272001:db8:0:0:10:10:10:0/120\u0027"},{"line_number":273,"context_line":"        #                will be compressed into something like"},{"line_number":274,"context_line":"        #                \u00272001:db8::10:10:10:0/120\u0027 after rendering by"},{"line_number":275,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":276,"context_line":"        #                zero-compression format first, and then to compare."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSIs%3D","line":273,"updated":"2013-10-18 13:11:12.000000000","message":"Remove \u0027like\u0027","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e5df384e471e891af0f555631774481bf1acc3bb","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        # NOTE(zhhuabj): Supporting non-zero-compression ipv6 address."},{"line_number":272,"context_line":"        #                For example, like \u00272001:db8:0:0:10:10:10:0/120\u0027"},{"line_number":273,"context_line":"        #                will be compressed into something like"},{"line_number":274,"context_line":"        #                \u00272001:db8::10:10:10:0/120\u0027 after rendering by"},{"line_number":275,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":276,"context_line":"        #                zero-compression format first, and then to compare."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSHE%3D","line":273,"in_reply_to":"AAAATH%2F%2FSIs%3D","updated":"2013-10-18 13:13:44.000000000","message":"Actually, remove \u0027something like\u0027","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        #                will be compressed into something like"},{"line_number":274,"context_line":"        #                \u00272001:db8::10:10:10:0/120\u0027 after rendering by"},{"line_number":275,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":276,"context_line":"        #                zero-compression format first, and then to compare."},{"line_number":277,"context_line":"        zero_compression_data \u003d data"},{"line_number":278,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":279,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSIY%3D","line":276,"updated":"2013-10-18 13:11:12.000000000","message":"\u0027zero-compressed\u0027, and remove \u0027to\u0027","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                \u00272001:db8::10:10:10:0/120\u0027 after rendering by"},{"line_number":275,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":276,"context_line":"        #                zero-compression format first, and then to compare."},{"line_number":277,"context_line":"        zero_compression_data \u003d data"},{"line_number":278,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":279,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":280,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSIQ%3D","line":277,"updated":"2013-10-18 13:11:12.000000000","message":"compressed","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"399cea72919ce959f9b0e357f4cce93139a93188","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":275,"context_line":"        #                zero-compressed format first, and then compare."},{"line_number":276,"context_line":"        zero_compressed_data \u003d data"},{"line_number":277,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":278,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":279,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":280,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FOpo%3D","line":277,"updated":"2013-10-20 19:00:21.000000000","message":"This condition is too strict.\nnetaddr updates a position of \"::\" if a specified network address contains multiple consecutive 0 in the address. For example, \u00272001:0db8:0:0:1::1\u0027 and \u00272001:0db8::1:0:0:1\u0027 are both valid and a same address, but str(netaddr.IPNetwork(addr)) returns the latter. (my example is not a network address, but the same thing happens for a network address.)\n\nI would like to suggest:\n\n  if net.version \u003d\u003d 6 and \u0027/\u0027 in data:","commit_id":"5f91614edecbf0add8af30d65c7b10104b2ff1b8"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"425565309812d09f40d39f9ec336959bf127397b","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":275,"context_line":"        #                zero-compressed format first, and then compare."},{"line_number":276,"context_line":"        zero_compressed_data \u003d data"},{"line_number":277,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":278,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":279,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":280,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FM9E%3D","line":277,"in_reply_to":"AAAATH%2F%2FNSs%3D","updated":"2013-10-21 14:28:33.000000000","message":"Akihiro, done, in the PS6, I use \"if net.version \u003d\u003d 6 and \u0027/\u0027 in data:\" you suggested, and use \"if not addr.endswith(\u0027::0\u0027):\" to avoid handling ipv6 address with final octets like fe80::0/120\n\n if net.version \u003d\u003d 6 and \u0027/\u0027 in data:\n\taddr, prefixlen \u003d data.split(\u0027/\u0027, 1)\n\t# Avoid handling ipv6 address with final octets like fe80::0/120\n\tif not addr.endswith(\u0027::0\u0027):\n\nmany thanks.","commit_id":"5f91614edecbf0add8af30d65c7b10104b2ff1b8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"adea6148086e4601f042d6b8a3ee2059285a42de","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":275,"context_line":"        #                zero-compressed format first, and then compare."},{"line_number":276,"context_line":"        zero_compressed_data \u003d data"},{"line_number":277,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":278,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":279,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":280,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FNSs%3D","line":277,"in_reply_to":"AAAATH%2F%2FOPg%3D","updated":"2013-10-21 12:59:32.000000000","message":"IPv6 notation is really hard to handle. You are right about my examples above. However, it does not work for \u00272001::0:1:0:0:1100/120\u0027. I understand it is very tricky and a corner case, but it is still a valid IPv6 address. I am not confident I have covered all corner cases.\n\nThe goal of this patch is to normalize IPv6 network address and then check if \u0027data\u0027 is a network address.\n\nIMO, it seems better simply to remove \"::\" not in data because a position of \"::\" may be moved or merged with adjacent zero(s) even if \"data\" has \"::\".\n\n\"::0\" is a bit tricky and it is difficult for other developers to understand quickly in the future.","commit_id":"5f91614edecbf0add8af30d65c7b10104b2ff1b8"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"308353fb81749b341527abe7fa96012b7f5dff31","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":275,"context_line":"        #                zero-compressed format first, and then compare."},{"line_number":276,"context_line":"        zero_compressed_data \u003d data"},{"line_number":277,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":278,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":279,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":280,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FORY%3D","line":277,"in_reply_to":"AAAATH%2F%2FOR4%3D","updated":"2013-10-21 04:38:03.000000000","message":"hi Akihiro, the logic \"if net.version \u003d\u003d 6 and \"::0\" not in data and \u0027/\u0027 in data:\" will work well for IPv6 \u00272001:0:0:0:1::1100/120\u0027 and \u00272001::1:0:0:1100/120\u0027 you mentioned above. I run successfully in my env.","commit_id":"5f91614edecbf0add8af30d65c7b10104b2ff1b8"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"fec40b68000a035abd7c4ac7017b3726709935eb","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":275,"context_line":"        #                zero-compressed format first, and then compare."},{"line_number":276,"context_line":"        zero_compressed_data \u003d data"},{"line_number":277,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":278,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":279,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":280,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FOPg%3D","line":277,"in_reply_to":"AAAATH%2F%2FORY%3D","updated":"2013-10-21 05:13:28.000000000","message":"\u003e\u003e\u003e import netaddr\n\n\u003e\u003e\u003e data \u003d \u00272001:0:0:0:1::1100/120\u0027\n\n\u003e\u003e\u003e net \u003d netaddr.IPNetwork(data)\n\n\u003e\u003e\u003e cidr \u003d str(net.cidr)\n\n\u003e\u003e\u003e print cidr\n\n2001::1:0:0:1100/120\n\n\u003e\u003e\u003e print net.version \u003d\u003d 6 and \"::0\" not in data and \u0027/\u0027 in data\n\nTrue\n\n\u003e\u003e\u003e addr, prefixlen \u003d data.split(\u0027/\u0027, 1)\n\n\u003e\u003e\u003e addr \u003d netaddr.IPNetwork(addr, version\u003d6)\n\n\u003e\u003e\u003e addr \u003d str(addr.network)\n\n\u003e\u003e\u003e zero_compressed_data \u003d \"%s/%s\" % (addr, prefixlen)\n\n\u003e\u003e\u003e print zero_compressed_data\n\n2001::1:0:0:1100/120\n\n\u003e\u003e\u003e print cidr !\u003d zero_compressed_data\n\nFalse","commit_id":"5f91614edecbf0add8af30d65c7b10104b2ff1b8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0c699e0d23445f0c134fb1092ac3fdcaf388a96e","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":275,"context_line":"        #                zero-compressed format first, and then compare."},{"line_number":276,"context_line":"        zero_compressed_data \u003d data"},{"line_number":277,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":278,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":279,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":280,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FOR4%3D","line":277,"in_reply_to":"AAAATH%2F%2FOS8%3D","updated":"2013-10-21 04:28:51.000000000","message":"I don\u0027t think  \"::0\" not in data (in the new PS) works for IPv6 \u00272001:0:0:0:1::1100/120\u0027. That is the reason of my last comment.\n\n  In [10]: x \u003d  \u00272001::1:0:0:1100/120\u0027\n\n  In [11]: y \u003d  \u00272001:0:0:0:1::1100/120\u0027\n\n  In [12]: netaddr.IPNetwork(x)\n  Out[12]: IPNetwork(\u00272001::1:0:0:1100/120\u0027)\n\n  In [13]: netaddr.IPNetwork(y)\n  Out[13]: IPNetwork(\u00272001::1:0:0:1100/120\u0027)","commit_id":"5f91614edecbf0add8af30d65c7b10104b2ff1b8"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"d5c969bd514f3ea3cf0e8f28c6706f5a9c42504b","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"},{"line_number":275,"context_line":"        #                zero-compressed format first, and then compare."},{"line_number":276,"context_line":"        zero_compressed_data \u003d data"},{"line_number":277,"context_line":"        if net.version \u003d\u003d 6 and \"::\" not in data and \u0027/\u0027 in data:"},{"line_number":278,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":279,"context_line":"            addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":280,"context_line":"            addr \u003d str(addr.network)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FOS8%3D","line":277,"in_reply_to":"AAAATH%2F%2FOpo%3D","updated":"2013-10-21 04:08:14.000000000","message":"hi Akihiro, the purpose I added the logic \"and \"::\" not in data\" is order to avoid to handle ipv6 address with final octets like \"fe80::0/24\" (see the line 531-536 in neutron/tests/unit/test_extension_firewall.py), so I change the logic \"and \"::\" not in data\" to \"and \"::0\" not in data\".\nand I also add two test cases to test ipv6 address with multiple consecutive zero you mentioned.\n\nIt looks very interesting to verify ipv6 cidr due to zero-compression feature of ipv6 address. thanks for your review.","commit_id":"5f91614edecbf0add8af30d65c7b10104b2ff1b8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"10404a83d428d7bd9aa14faf7a8309e611ee34e0","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        if net.version \u003d\u003d 6 and \u0027/\u0027 in data:"},{"line_number":283,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":284,"context_line":"            # Avoid handling ipv6 address with final octets like fe80::0/120"},{"line_number":285,"context_line":"            if not addr.endswith(\u0027::0\u0027):"},{"line_number":286,"context_line":"                addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":287,"context_line":"                addr \u003d str(addr.network)"},{"line_number":288,"context_line":"                zero_compressed_data \u003d \"%s/%s\" % (addr, prefixlen)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FMXM%3D","line":285,"updated":"2013-10-21 16:26:24.000000000","message":"Could you explain why this \"if\" is required?\nWithout this logic, IPv6 network like \"fe80::0/120\" is also accepted and it sounds reasonable to me. What is the problem?","commit_id":"89618176ab6992c50282e444928ed1e3e7ae9f16"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"2801bbf9ef3af8ae7ebc6c7574fee26fc960c8fd","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        if net.version \u003d\u003d 6 and \u0027/\u0027 in data:"},{"line_number":283,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":284,"context_line":"            # Avoid handling ipv6 address with final octets like fe80::0/120"},{"line_number":285,"context_line":"            if not addr.endswith(\u0027::0\u0027):"},{"line_number":286,"context_line":"                addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":287,"context_line":"                addr \u003d str(addr.network)"},{"line_number":288,"context_line":"                zero_compressed_data \u003d \"%s/%s\" % (addr, prefixlen)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FLHE%3D","line":285,"in_reply_to":"AAAATH%2F%2FMXM%3D","updated":"2013-10-22 00:01:22.000000000","message":"That is because one test case with final octets in the test_extension_firewall.py let me mistake \"fe80::0/120\" is a invalid ipv6 address. I have fixed them, thanks for your reminding.","commit_id":"89618176ab6992c50282e444928ed1e3e7ae9f16"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"10404a83d428d7bd9aa14faf7a8309e611ee34e0","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":284,"context_line":"            # Avoid handling ipv6 address with final octets like fe80::0/120"},{"line_number":285,"context_line":"            if not addr.endswith(\u0027::0\u0027):"},{"line_number":286,"context_line":"                addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":287,"context_line":"                addr \u003d str(addr.network)"},{"line_number":288,"context_line":"                zero_compressed_data \u003d \"%s/%s\" % (addr, prefixlen)"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FMb0%3D","line":286,"updated":"2013-10-21 16:26:24.000000000","message":"netaddr.IPAddress is better.","commit_id":"89618176ab6992c50282e444928ed1e3e7ae9f16"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"2801bbf9ef3af8ae7ebc6c7574fee26fc960c8fd","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":284,"context_line":"            # Avoid handling ipv6 address with final octets like fe80::0/120"},{"line_number":285,"context_line":"            if not addr.endswith(\u0027::0\u0027):"},{"line_number":286,"context_line":"                addr \u003d netaddr.IPNetwork(addr, version\u003d6)"},{"line_number":287,"context_line":"                addr \u003d str(addr.network)"},{"line_number":288,"context_line":"                zero_compressed_data \u003d \"%s/%s\" % (addr, prefixlen)"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FLG0%3D","line":286,"in_reply_to":"AAAATH%2F%2FMb0%3D","updated":"2013-10-22 00:01:22.000000000","message":"Done","commit_id":"89618176ab6992c50282e444928ed1e3e7ae9f16"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"aca40c38710629c4a09790e2edd42ee249be6bab","unresolved":false,"context_lines":[{"line_number":268,"context_line":"    try:"},{"line_number":269,"context_line":"        net \u003d netaddr.IPNetwork(_validate_no_whitespace(data))"},{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        # NOTE(zhhuabj): Supporting uncompressed ipv6 address. For example,"},{"line_number":272,"context_line":"        #                \u00272001:db8:0:0:10:10:10:0/120\u0027 will be compressed"},{"line_number":273,"context_line":"        #                into \u00272001:db8::10:10:10:0/120\u0027 after rendering by"},{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FInI%3D","line":271,"updated":"2013-10-22 17:27:04.000000000","message":"this comment is 3 times longer that the actual code...does it really need to be that verbose?","commit_id":"8663ec27d2667266fba42cb9d06cda5d56738018"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"f642f175dbe25e9e3166c52b5f5805a2d9300228","unresolved":false,"context_lines":[{"line_number":268,"context_line":"    try:"},{"line_number":269,"context_line":"        net \u003d netaddr.IPNetwork(_validate_no_whitespace(data))"},{"line_number":270,"context_line":"        cidr \u003d str(net.cidr)"},{"line_number":271,"context_line":"        # NOTE(zhhuabj): Supporting uncompressed ipv6 address. For example,"},{"line_number":272,"context_line":"        #                \u00272001:db8:0:0:10:10:10:0/120\u0027 will be compressed"},{"line_number":273,"context_line":"        #                into \u00272001:db8::10:10:10:0/120\u0027 after rendering by"},{"line_number":274,"context_line":"        #                netaddr.IPNetwork. So need to convert them into"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FHN4%3D","line":271,"in_reply_to":"AAAATH%2F%2FInI%3D","updated":"2013-10-23 01:31:09.000000000","message":"Done","commit_id":"8663ec27d2667266fba42cb9d06cda5d56738018"},{"author":{"_account_id":9044,"name":"Will","email":"wangjian.ika@bytedance.com","username":"Will"},"change_message_id":"0145f5fb4c0eb98308d0e26bd2d58d57e01e9408","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        #                128\u0027 are both valid and a same address, but"},{"line_number":280,"context_line":"        #                str(netaddr.IPNetwork(addr)) returns the latter."},{"line_number":281,"context_line":"        zero_compressed_data \u003d data"},{"line_number":282,"context_line":"        if net.version \u003d\u003d 6 and \u0027/\u0027 in data:"},{"line_number":283,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":284,"context_line":"            addr \u003d str(netaddr.IPAddress(addr, version\u003d6))"},{"line_number":285,"context_line":"            zero_compressed_data \u003d \"%s/%s\" % (addr, prefixlen)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FJ4M%3D","line":282,"updated":"2013-10-22 12:12:03.000000000","message":"I find netaddr support abbreviated CIDR format, like 10/8 -\u003e 10.0.0.0/8, so I think we\u0027d better support this too. Refer to http://pythonhosted.org/netaddr/api.html","commit_id":"8663ec27d2667266fba42cb9d06cda5d56738018"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"cce36d4b6e517ec2909ad5a073a95ebb2de67401","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        #                128\u0027 are both valid and a same address, but"},{"line_number":280,"context_line":"        #                str(netaddr.IPNetwork(addr)) returns the latter."},{"line_number":281,"context_line":"        zero_compressed_data \u003d data"},{"line_number":282,"context_line":"        if net.version \u003d\u003d 6 and \u0027/\u0027 in data:"},{"line_number":283,"context_line":"            addr, prefixlen \u003d data.split(\u0027/\u0027, 1)"},{"line_number":284,"context_line":"            addr \u003d str(netaddr.IPAddress(addr, version\u003d6))"},{"line_number":285,"context_line":"            zero_compressed_data \u003d \"%s/%s\" % (addr, prefixlen)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FJYs%3D","line":282,"in_reply_to":"AAAATH%2F%2FJ4M%3D","updated":"2013-10-22 14:29:17.000000000","message":"Abbreviated ipv6 cidr like 2001:db8::10:10:10:0/120 is common, but abbreviated ipv4 cidr like 10/8 is not common.\nOnly speaking for ip address, rather than cidr, 2001:db8::10:10:10:0 is a valid and common ip address, I don\u0027t think 10 is a valid ip address as well.\nSo I tend not to support abbreviated ipv4 cidr. Of course, if there exists this special requirement in the future, I think we can file another bug to fix it.\n\nthanks for your review.","commit_id":"8663ec27d2667266fba42cb9d06cda5d56738018"}],"neutron/tests/unit/test_attributes.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                                          None)"},{"line_number":398,"context_line":"        self.assertIsNone(msg)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # Valid - Non-zero-compression ipv6 address"},{"line_number":401,"context_line":"        cidr \u003d \"fe80:0:0:0:0:0:0:0/24\""},{"line_number":402,"context_line":"        msg \u003d attributes._validate_subnet(cidr,"},{"line_number":403,"context_line":"                                          None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSH0%3D","line":400,"updated":"2013-10-18 13:11:12.000000000","message":"Valid - uncompressed ipv6 address","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2628dacf20f35f9b59252ed1df4a1eab8c351041","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                                          None)"},{"line_number":404,"context_line":"        self.assertIsNone(msg)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        # Invalid - Non-zero-compression ipv6 address"},{"line_number":407,"context_line":"        cidr \u003d \"fe80:0:0:0:0:0:0:2/24\""},{"line_number":408,"context_line":"        msg \u003d attributes._validate_subnet(cidr,"},{"line_number":409,"context_line":"                                          None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATH%2F%2FSHk%3D","line":406,"updated":"2013-10-18 13:11:12.000000000","message":"Invalid - uncompressed ipv6 address","commit_id":"d4792ad07085b0bc964f0f3eb01001921aea30db"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"10404a83d428d7bd9aa14faf7a8309e611ee34e0","unresolved":false,"context_lines":[{"line_number":430,"context_line":"                                          None)"},{"line_number":431,"context_line":"        self.assertIsNone(msg)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Invalid - IPv6 with final octets"},{"line_number":434,"context_line":"        cidr \u003d \"fe80::0/128\""},{"line_number":435,"context_line":"        msg \u003d attributes._validate_subnet(cidr,"},{"line_number":436,"context_line":"                                          None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FMXI%3D","line":433,"updated":"2013-10-21 16:26:24.000000000","message":"Why this should be invalid?","commit_id":"89618176ab6992c50282e444928ed1e3e7ae9f16"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"2801bbf9ef3af8ae7ebc6c7574fee26fc960c8fd","unresolved":false,"context_lines":[{"line_number":430,"context_line":"                                          None)"},{"line_number":431,"context_line":"        self.assertIsNone(msg)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Invalid - IPv6 with final octets"},{"line_number":434,"context_line":"        cidr \u003d \"fe80::0/128\""},{"line_number":435,"context_line":"        msg \u003d attributes._validate_subnet(cidr,"},{"line_number":436,"context_line":"                                          None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FLGw%3D","line":433,"in_reply_to":"AAAATH%2F%2FMXI%3D","updated":"2013-10-22 00:01:22.000000000","message":"Done","commit_id":"89618176ab6992c50282e444928ed1e3e7ae9f16"}]}
