)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"97a87860dc1c885d171c0ca5efc94b804e42837f","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2015-01-16 19:39:46 +0000"},{"line_number":4,"context_line":"Commit:     Carl Baldwin \u003ccarl.baldwin@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-17 18:03:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replace FLOATING_IP_CIDR_SUFFIX constant with utils"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"FLOATING_IP_CIDR_SUFFIX is a global constant used in manipulating ip"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_84956833","line":6,"updated":"2015-01-18 14:18:14.000000000","message":"The validity of this patch makes sense to me. Others might not agree:\n\nPlease see https://review.openstack.org/#/c/143869/","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"a3e31a5e9e147f049fddf7cf0d29b22db4589024","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-01-17 18:03:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replace FLOATING_IP_CIDR_SUFFIX constant with utils"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"FLOATING_IP_CIDR_SUFFIX is a global constant used in manipulating ip"},{"line_number":10,"context_line":"addresses and cidrs as string.  This patch replaces that with"},{"line_number":11,"context_line":"well-tested utilities for doing the conversions more safely and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_e4f2ac99","line":8,"updated":"2015-01-18 14:19:11.000000000","message":"The topic of this patch should be changed to bp/restructure-l3-agent. I find that useful because I can click on the topic name and see all of the patches for the same effort.","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"14817f4cb92659ad8107afb729fb55a883e15283","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-01-17 18:03:11 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Replace FLOATING_IP_CIDR_SUFFIX constant with utils"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"FLOATING_IP_CIDR_SUFFIX is a global constant used in manipulating ip"},{"line_number":10,"context_line":"addresses and cidrs as string.  This patch replaces that with"},{"line_number":11,"context_line":"well-tested utilities for doing the conversions more safely and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a930d6b_7412d963","line":8,"in_reply_to":"3a961159_e4f2ac99","updated":"2015-01-21 05:56:00.000000000","message":"Done.  I thought it was!  I will fix it immediately.  My bad.","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"}],"neutron/common/utils.py":[{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"c4e609fceb871818c1fd9d093d41792a6a4fded5","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":389,"context_line":"    net \u003d netaddr.IPNetwork(cidr)"},{"line_number":390,"context_line":"    if \u0027/\u0027 not in str(cidr):"},{"line_number":391,"context_line":"        return False"},{"line_number":392,"context_line":"    max_prefixlen \u003d 32 if net.version \u003d\u003d 4 else 128"},{"line_number":393,"context_line":"    return net.prefixlen \u003d\u003d max_prefixlen"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_84980f1c","line":390,"updated":"2015-01-17 12:23:53.000000000","message":"Line 390 and 391 can be moved before line 389, so that we don\u0027t calculate net if it\u0027s not needed","commit_id":"524b16ee0bb833b57e0755311a510333b981f9f8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d96c128b48a9bde764285f4c654db93cc2a99646","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":389,"context_line":"    net \u003d netaddr.IPNetwork(cidr)"},{"line_number":390,"context_line":"    if \u0027/\u0027 not in str(cidr):"},{"line_number":391,"context_line":"        return False"},{"line_number":392,"context_line":"    max_prefixlen \u003d 32 if net.version \u003d\u003d 4 else 128"},{"line_number":393,"context_line":"    return net.prefixlen \u003d\u003d max_prefixlen"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_6d98671b","line":390,"in_reply_to":"3a961159_4d79ebfa","updated":"2015-01-17 18:00:48.000000000","message":"Done.  Good catch.","commit_id":"524b16ee0bb833b57e0755311a510333b981f9f8"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1c3c5383cfa859c1502cb9f7b0dfa0be68096c36","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":389,"context_line":"    net \u003d netaddr.IPNetwork(cidr)"},{"line_number":390,"context_line":"    if \u0027/\u0027 not in str(cidr):"},{"line_number":391,"context_line":"        return False"},{"line_number":392,"context_line":"    max_prefixlen \u003d 32 if net.version \u003d\u003d 4 else 128"},{"line_number":393,"context_line":"    return net.prefixlen \u003d\u003d max_prefixlen"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_4d79ebfa","line":390,"in_reply_to":"3a961159_84980f1c","updated":"2015-01-17 17:08:38.000000000","message":"+1","commit_id":"524b16ee0bb833b57e0755311a510333b981f9f8"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1c3c5383cfa859c1502cb9f7b0dfa0be68096c36","unresolved":false,"context_lines":[{"line_number":388,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":389,"context_line":"    net \u003d netaddr.IPNetwork(cidr)"},{"line_number":390,"context_line":"    if \u0027/\u0027 not in str(cidr):"},{"line_number":391,"context_line":"        return False"},{"line_number":392,"context_line":"    max_prefixlen \u003d 32 if net.version \u003d\u003d 4 else 128"},{"line_number":393,"context_line":"    return net.prefixlen \u003d\u003d max_prefixlen"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_4ddd6b13","line":391,"updated":"2015-01-17 17:08:38.000000000","message":"Nit: At first glance this felt a little counter-intuitive to me since an address without a prefix is a single host. But I do understand the intent. Maybe add a docstring?","commit_id":"524b16ee0bb833b57e0755311a510333b981f9f8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d96c128b48a9bde764285f4c654db93cc2a99646","unresolved":false,"context_lines":[{"line_number":388,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":389,"context_line":"    net \u003d netaddr.IPNetwork(cidr)"},{"line_number":390,"context_line":"    if \u0027/\u0027 not in str(cidr):"},{"line_number":391,"context_line":"        return False"},{"line_number":392,"context_line":"    max_prefixlen \u003d 32 if net.version \u003d\u003d 4 else 128"},{"line_number":393,"context_line":"    return net.prefixlen \u003d\u003d max_prefixlen"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_edaa9718","line":391,"in_reply_to":"3a961159_4ddd6b13","updated":"2015-01-17 18:00:48.000000000","message":"I actually struggled with this a bit too.  I finally decided to add this check because the behavior of IPNetwork initializer may be unexpected to some.  It defaults to /32 if no prefix is specified.  I\u0027m not sure that assuming an IP address is a /32 network is always the right thing to do.\n\nI\u0027m still thinking about throwing an exception to indicate that an IP address by itself is not a valid argument to this method.  I think if we restrict what is passed in to network cidrs and not plain ip addresses then we don\u0027t need to worry about the ambiguity.  I\u0027ll post another and you can take a look.","commit_id":"524b16ee0bb833b57e0755311a510333b981f9f8"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"97a87860dc1c885d171c0ca5efc94b804e42837f","unresolved":false,"context_lines":[{"line_number":371,"context_line":"    # NOTE(ihrachys): all existing consumers assume version 2.0"},{"line_number":372,"context_line":"    return \u0027%s/v2.0/\u0027 % auth_uri"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"def ip_to_cidr(ip, prefix\u003dNone):"},{"line_number":376,"context_line":"    \"\"\"Convert an ip with no prefix to cidr notation"},{"line_number":377,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_04d7b8ee","line":374,"updated":"2015-01-18 14:18:14.000000000","message":"Since prefix isn\u0027t used anywhere in this patch, you could consider simplifying to:\n\nreturn str(netaddr.IPNetwork(ip))","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"14817f4cb92659ad8107afb729fb55a883e15283","unresolved":false,"context_lines":[{"line_number":371,"context_line":"    # NOTE(ihrachys): all existing consumers assume version 2.0"},{"line_number":372,"context_line":"    return \u0027%s/v2.0/\u0027 % auth_uri"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"def ip_to_cidr(ip, prefix\u003dNone):"},{"line_number":376,"context_line":"    \"\"\"Convert an ip with no prefix to cidr notation"},{"line_number":377,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_57523f14","line":374,"in_reply_to":"3a961159_04d7b8ee","updated":"2015-01-21 05:56:00.000000000","message":"I\u0027ll consider it.","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"97a87860dc1c885d171c0ca5efc94b804e42837f","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        net \u003d netaddr.IPNetwork(str(net.ip) + \u0027/\u0027 + str(prefix))"},{"line_number":386,"context_line":"    return str(net)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":390,"context_line":"    \"\"\"Determines if the cidr passed in represents a single host network"},{"line_number":391,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_24d2f4fc","line":388,"updated":"2015-01-18 14:18:14.000000000","message":"How about:\n\nis cidr host? (Sorry, this keyboard\u0027s underscore is broken... Amazon better hurry with a new one!)","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":2170,"name":"Dave Lapsley","email":"david.lapsley@metacloud.com","username":"dlapsley"},"change_message_id":"37f09363e94e75802772cd633e14188f0f34559c","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        net \u003d netaddr.IPNetwork(str(net.ip) + \u0027/\u0027 + str(prefix))"},{"line_number":386,"context_line":"    return str(net)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":390,"context_line":"    \"\"\"Determines if the cidr passed in represents a single host network"},{"line_number":391,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_4abf0660","line":388,"in_reply_to":"3a961159_24d2f4fc","updated":"2015-01-19 05:09:07.000000000","message":"+1 for is_cidr_host()","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"14817f4cb92659ad8107afb729fb55a883e15283","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        net \u003d netaddr.IPNetwork(str(net.ip) + \u0027/\u0027 + str(prefix))"},{"line_number":386,"context_line":"    return str(net)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"def cidr_is_single_host(cidr):"},{"line_number":390,"context_line":"    \"\"\"Determines if the cidr passed in represents a single host network"},{"line_number":391,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_f405e914","line":388,"in_reply_to":"3a961159_4abf0660","updated":"2015-01-21 05:56:00.000000000","message":"Done.  Putting \u0027is\u0027 first is better.  I had also considered leaving out \"single\" too.","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":2170,"name":"Dave Lapsley","email":"david.lapsley@metacloud.com","username":"dlapsley"},"change_message_id":"37f09363e94e75802772cd633e14188f0f34559c","unresolved":false,"context_lines":[{"line_number":397,"context_line":"    if \u0027/\u0027 not in str(cidr):"},{"line_number":398,"context_line":"        raise ValueError(\"cidr doesn\u0027t contain a \u0027/\u0027\")"},{"line_number":399,"context_line":"    net \u003d netaddr.IPNetwork(cidr)"},{"line_number":400,"context_line":"    max_prefixlen \u003d 32 if net.version \u003d\u003d 4 else 128"},{"line_number":401,"context_line":"    return net.prefixlen \u003d\u003d max_prefixlen"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_2abc7a6b","line":400,"updated":"2015-01-19 05:09:07.000000000","message":"I would prefer to see 32 and 128 stored as symbolic constants instead of magic numbers. Something like IP_V4_PREFIXLEN, IP_V6_PREFIXLEN (unless there are better names/constants already out there).","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"14817f4cb92659ad8107afb729fb55a883e15283","unresolved":false,"context_lines":[{"line_number":397,"context_line":"    if \u0027/\u0027 not in str(cidr):"},{"line_number":398,"context_line":"        raise ValueError(\"cidr doesn\u0027t contain a \u0027/\u0027\")"},{"line_number":399,"context_line":"    net \u003d netaddr.IPNetwork(cidr)"},{"line_number":400,"context_line":"    max_prefixlen \u003d 32 if net.version \u003d\u003d 4 else 128"},{"line_number":401,"context_line":"    return net.prefixlen \u003d\u003d max_prefixlen"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_f71c0b6d","line":400,"in_reply_to":"3a961159_2abc7a6b","updated":"2015-01-21 05:56:00.000000000","message":"Done.  Very reasonable.\n\nI would have asked that to had I been the reviewer.  I actually looked briefly before to see if netaddr had some such constant with no luck but then got distracted before I followed through.  Thanks.","commit_id":"ad1c7a5fb0a13cdd5f6c94c7119335575521bd96"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"cbefbb06f1cdeabed4103a7076363e6ba3725e66","unresolved":false,"context_lines":[{"line_number":375,"context_line":"def ip_to_cidr(ip, prefix\u003dNone):"},{"line_number":376,"context_line":"    \"\"\"Convert an ip with no prefix to cidr notation"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    :param ip: An ipv4 or iv6 address.  Convertable to netaddr.IPNetwork."},{"line_number":379,"context_line":"    :param prefix: Optional prefix.  If None, the default 32 will be used for"},{"line_number":380,"context_line":"        ipv4 and 128 for ipv6."},{"line_number":381,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a930d6b_92ef3eb0","line":378,"updated":"2015-01-21 16:15:56.000000000","message":"nit alert: s/iv6/ipv6 - I can send out a quick update","commit_id":"3c57519e3c0ac20cba99d54ea3b660765fd0d57c"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"333674d25b96023875155a66d8649f448cfa2dc9","unresolved":false,"context_lines":[{"line_number":375,"context_line":"def ip_to_cidr(ip, prefix\u003dNone):"},{"line_number":376,"context_line":"    \"\"\"Convert an ip with no prefix to cidr notation"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    :param ip: An ipv4 or ipv6 address.  Convertable to netaddr.IPNetwork."},{"line_number":379,"context_line":"    :param prefix: Optional prefix.  If None, the default 32 will be used for"},{"line_number":380,"context_line":"        ipv4 and 128 for ipv6."},{"line_number":381,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_8ca71a4f","line":378,"updated":"2015-01-21 21:49:51.000000000","message":"(nit) Convertable -\u003e Convertible","commit_id":"c207bfc722b657f3a06f67b7ae60ea30caf4907b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"179eda4201a0d239f443fdcf3433d5ef15e36871","unresolved":false,"context_lines":[{"line_number":375,"context_line":"def ip_to_cidr(ip, prefix\u003dNone):"},{"line_number":376,"context_line":"    \"\"\"Convert an ip with no prefix to cidr notation"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    :param ip: An ipv4 or ipv6 address.  Convertable to netaddr.IPNetwork."},{"line_number":379,"context_line":"    :param prefix: Optional prefix.  If None, the default 32 will be used for"},{"line_number":380,"context_line":"        ipv4 and 128 for ipv6."},{"line_number":381,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a930d6b_8231a3ee","line":378,"in_reply_to":"1a930d6b_8ca71a4f","updated":"2015-01-21 22:26:53.000000000","message":"Doh!  I can\u0027t spell!","commit_id":"c207bfc722b657f3a06f67b7ae60ea30caf4907b"}]}
