)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add address scope to ports in RPC response to L3 agent"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The L3 agent needs to know the address scope of each port of each"},{"line_number":10,"context_line":"router it sets up in order to enforce isolation between scopes."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I6a7b3708fadefff1919d70ab1b8bc345b3fbe81c"},{"line_number":13,"context_line":"Partially-Implements: blueprint address-scopes"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"ba8a016a_7097b390","line":10,"updated":"2015-11-17 18:45:08.000000000","message":"Consider mentioning that this commit also adds devref for the feature.\nOr move the devref to another patch.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add address scope to ports in RPC response to L3 agent"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The L3 agent needs to know the address scope of each port of each"},{"line_number":10,"context_line":"router it sets up in order to enforce isolation between scopes."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I6a7b3708fadefff1919d70ab1b8bc345b3fbe81c"},{"line_number":13,"context_line":"Partially-Implements: blueprint address-scopes"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"ba8a016a_64c16480","line":10,"in_reply_to":"ba8a016a_7097b390","updated":"2015-11-23 20:30:48.000000000","message":"Done","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"}],"doc/source/devref/address_scopes.rst":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"836ba3c2d506affb36078179dfe0ffcc964e48c3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Subnet Pools and Address Scopes"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"This page discusses subnet pools and address pools"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"Subnet Pools"},{"line_number":7,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_181d0b0f","line":4,"updated":"2015-06-16 16:34:54.000000000","message":"I think this page needs to be added to the index.  I forgot about that.","commit_id":"6959203b28e6ce243ad9042e11d8fcecccb22580"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"485e705b5027bb260adeeb0148b2feaa499aa8fd","unresolved":false,"context_lines":[{"line_number":120,"context_line":"like the remote mac address or something."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Since AddressScope isn\u0027t yet a first class object, the subnet pool id will be"},{"line_number":123,"context_line":"sent as the scope id when communicating with the L3 agent.  Another patch will"},{"line_number":124,"context_line":"change this.  The id is sent on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":126,"context_line":"not appear, it is assumed to be null for both families."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1af86dd1_a1bacedf","line":123,"updated":"2015-06-12 17:41:54.000000000","message":"Maybe add a reference to the code for this.","commit_id":"6959203b28e6ce243ad9042e11d8fcecccb22580"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Subnet Pools and Address Scopes"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"This page discusses subnet pools and address pools"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"Subnet Pools"},{"line_number":7,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_036ba91f","line":4,"updated":"2015-08-27 12:02:09.000000000","message":"s/address pools/address scopes/ ?","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Subnet Pools and Address Scopes"},{"line_number":2,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"This page discusses subnet pools and address pools"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"Subnet Pools"},{"line_number":7,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_d7ed29f0","line":4,"in_reply_to":"da20952f_036ba91f","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":11,"context_line":".. [#] http://www.youtube.com/watch?v\u003dQqP8yBUUXBM\u0026t\u003d6m12s"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Subnet pools were added in Kilo.  They are relatively simple.  They were the"},{"line_number":14,"context_line":"first objects added to Neutron core model [#]_ [#]_ for a long time.  A"},{"line_number":15,"context_line":"SubnetPool has any number of SubnetPoolPrefix objects associated to it.  These"},{"line_number":16,"context_line":"prefixes are in cidr format.  Each cidr is a piece of the address space that is"},{"line_number":17,"context_line":"available for allocation."}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_a34e7dbf","line":14,"updated":"2015-08-27 12:02:09.000000000","message":"s/to/to the/","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":11,"context_line":".. [#] http://www.youtube.com/watch?v\u003dQqP8yBUUXBM\u0026t\u003d6m12s"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Subnet pools were added in Kilo.  They are relatively simple.  They were the"},{"line_number":14,"context_line":"first objects added to Neutron core model [#]_ [#]_ for a long time.  A"},{"line_number":15,"context_line":"SubnetPool has any number of SubnetPoolPrefix objects associated to it.  These"},{"line_number":16,"context_line":"prefixes are in cidr format.  Each cidr is a piece of the address space that is"},{"line_number":17,"context_line":"available for allocation."}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_17e4010b","line":14,"in_reply_to":"da20952f_a34e7dbf","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"The Subnet model object has been augmented with a subnetpool_id attribute.  By"},{"line_number":25,"context_line":"default, it is null for backward compatibility.  It can be the UUID of a subnet"},{"line_number":26,"context_line":"pool.  This means the address for the subnet was allocated from the pool with"},{"line_number":27,"context_line":"that id."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"When creating a subnet, the subnetpool_id can be optionally specified.  If it"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_43bbe172","line":26,"updated":"2015-08-27 12:02:09.000000000","message":"s/address/address range/","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"The Subnet model object has been augmented with a subnetpool_id attribute.  By"},{"line_number":25,"context_line":"default, it is null for backward compatibility.  It can be the UUID of a subnet"},{"line_number":26,"context_line":"pool.  This means the address for the subnet was allocated from the pool with"},{"line_number":27,"context_line":"that id."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"When creating a subnet, the subnetpool_id can be optionally specified.  If it"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_3727bd65","line":26,"in_reply_to":"da20952f_43bbe172","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":34,"context_line":"subnet pool.  Think of it this way, the allocation logic always needs to know"},{"line_number":35,"context_line":"the size of the subnet.  It can pull it from a specific cidr, prefixlen, or"},{"line_number":36,"context_line":"default.  A specific cidr is optional and the allocation will try to honor it"},{"line_number":37,"context_line":"if provided."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Subnet pools do not allow overlap of subnets.  Any given portion can only be"},{"line_number":40,"context_line":"allocated to one subnet."}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_0323a9be","line":37,"updated":"2015-08-27 12:02:09.000000000","message":"If the requested CIDR is not available, does the subnet creation fail, or does it get some different CIDR with the requested (or default) prefix length?","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":34,"context_line":"subnet pool.  Think of it this way, the allocation logic always needs to know"},{"line_number":35,"context_line":"the size of the subnet.  It can pull it from a specific cidr, prefixlen, or"},{"line_number":36,"context_line":"default.  A specific cidr is optional and the allocation will try to honor it"},{"line_number":37,"context_line":"if provided."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Subnet pools do not allow overlap of subnets.  Any given portion can only be"},{"line_number":40,"context_line":"allocated to one subnet."}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_f7faa5bc","line":37,"in_reply_to":"da20952f_0323a9be","updated":"2015-10-07 19:25:56.000000000","message":"Fails.  Done.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":52,"context_line":"/26s would be 192."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"For IPv6, the smallest viable subnet in Neutron is /64.  There is no reason to"},{"line_number":55,"context_line":"allocate a subnet that is any larger or smaller than that.  It looked funny to"},{"line_number":56,"context_line":"set a quota of 4611686018427387904 to allow one /64 subnet.  To avoid this, it"},{"line_number":57,"context_line":"was decided to count IPv6 quota in terms of /64s.  So, a quota of 3 allows"},{"line_number":58,"context_line":"three /64 subnets.  If we need to allocate something smaller in the future, we"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_633864d4","line":55,"updated":"2015-08-27 12:02:09.000000000","message":"\u0027smaller than\u0027 makes sense here, given the preceding sentence.  But \u0027larger than\u0027 as well - did you really mean to say that?","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":52,"context_line":"/26s would be 192."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"For IPv6, the smallest viable subnet in Neutron is /64.  There is no reason to"},{"line_number":55,"context_line":"allocate a subnet that is any larger or smaller than that.  It looked funny to"},{"line_number":56,"context_line":"set a quota of 4611686018427387904 to allow one /64 subnet.  To avoid this, it"},{"line_number":57,"context_line":"was decided to count IPv6 quota in terms of /64s.  So, a quota of 3 allows"},{"line_number":58,"context_line":"three /64 subnets.  If we need to allocate something smaller in the future, we"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_77d1b556","line":55,"in_reply_to":"da20952f_633864d4","updated":"2015-10-07 19:25:56.000000000","message":"Yes.  My point is that there is no reason to use anything but a /64 on a Neutron network.  But, my Mitaka work is aiming to model a subnet that isn\u0027t tied to an L2, so maybe we\u0027ll need to be able to sub-divide a /64 sooner than later.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":62,"context_line":"~~~~~~~~~~"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"I wanted to add a quick description about how allocation is done to minimize"},{"line_number":65,"context_line":"fragmentation of the pool.  The relevant code is here [#]_.  First, the"},{"line_number":66,"context_line":"available prefixes are computed using a set difference:  pool - allocations."},{"line_number":67,"context_line":"The result is compacted [#]_ and then sorted by size.  The subnet is then"},{"line_number":68,"context_line":"allocated from the smallest available prefix that is large enough to accomodate"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_035648d2","line":65,"updated":"2015-08-27 12:02:09.000000000","message":"Suggest: \"Allocation is done in a way that aims to minimize fragmentation of the pool.  The relevant code ...\"","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":62,"context_line":"~~~~~~~~~~"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"I wanted to add a quick description about how allocation is done to minimize"},{"line_number":65,"context_line":"fragmentation of the pool.  The relevant code is here [#]_.  First, the"},{"line_number":66,"context_line":"available prefixes are computed using a set difference:  pool - allocations."},{"line_number":67,"context_line":"The result is compacted [#]_ and then sorted by size.  The subnet is then"},{"line_number":68,"context_line":"allocated from the smallest available prefix that is large enough to accomodate"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_37a6dd10","line":65,"in_reply_to":"da20952f_035648d2","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":65,"context_line":"fragmentation of the pool.  The relevant code is here [#]_.  First, the"},{"line_number":66,"context_line":"available prefixes are computed using a set difference:  pool - allocations."},{"line_number":67,"context_line":"The result is compacted [#]_ and then sorted by size.  The subnet is then"},{"line_number":68,"context_line":"allocated from the smallest available prefix that is large enough to accomodate"},{"line_number":69,"context_line":"the request."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":".. [#] neutron/ipam/subnet_alloc.py (_allocate_any_subnet)"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_e36314b0","line":68,"updated":"2015-08-27 12:02:09.000000000","message":"s/accomodate/accommodate/","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":65,"context_line":"fragmentation of the pool.  The relevant code is here [#]_.  First, the"},{"line_number":66,"context_line":"available prefixes are computed using a set difference:  pool - allocations."},{"line_number":67,"context_line":"The result is compacted [#]_ and then sorted by size.  The subnet is then"},{"line_number":68,"context_line":"allocated from the smallest available prefix that is large enough to accomodate"},{"line_number":69,"context_line":"the request."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":".. [#] neutron/ipam/subnet_alloc.py (_allocate_any_subnet)"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_b763cddb","line":68,"in_reply_to":"da20952f_e36314b0","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":75,"context_line":"--------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Address scopes serve two purposes.  The first is to give subnets\u0027 addresses an"},{"line_number":78,"context_line":"explicit origin that is fully controlled by a single party.  Before subnet"},{"line_number":79,"context_line":"pools or address scopes, it was impossible to tell if a network address was"},{"line_number":80,"context_line":"routable in a certain context because the address was given explicitly on"},{"line_number":81,"context_line":"subnet create and wasn\u0027t validated against any other addresses.  An address"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_23c6ec67","line":78,"updated":"2015-08-27 12:02:09.000000000","message":"I don\u0027t know what \u0027origin\u0027 means here.  It sounds like you could have just said \u0027scope\u0027, but were trying to avoid something that sounds like a circular definition. :-)  But I\u0027m afraid \u0027origin\u0027 doesn\u0027t really fill that need, at least for me.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":75,"context_line":"--------------"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Address scopes serve two purposes.  The first is to give subnets\u0027 addresses an"},{"line_number":78,"context_line":"explicit origin that is fully controlled by a single party.  Before subnet"},{"line_number":79,"context_line":"pools or address scopes, it was impossible to tell if a network address was"},{"line_number":80,"context_line":"routable in a certain context because the address was given explicitly on"},{"line_number":81,"context_line":"subnet create and wasn\u0027t validated against any other addresses.  An address"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_577279ae","line":78,"in_reply_to":"da20952f_23c6ec67","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":83,"context_line":"hands of an authority.  It makes use of the already existing SubnetPool concept"},{"line_number":84,"context_line":"for allocation."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"The second purpose is to prevent address overlap.  The bottom line is that if"},{"line_number":87,"context_line":"you choose to use address scopes (or subnet pools alone for that matter), you"},{"line_number":88,"context_line":"give up the ability to overlap subnets within the scope.  It will never be"},{"line_number":89,"context_line":"possible to allocate the same address space to two subnets within the scope."}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_06bf36fc","line":86,"updated":"2015-08-27 12:02:09.000000000","message":"I thought, and would say: \"The second purpose is to provide more flexible control of when address overlap is or is not allowed, and specifically to decouple this from tenancy, because an address scope is also \u0027the thing within which address overlap is not allowed\u0027.\n\nPrior to the Liberty release, there was implicitly a single \u0027shared\u0027 address scope, used by all networks marked as shared, and a private address scope for each tenant, used by that tenant\u0027s non-shared networks.  It was not possible for two or more tenants to share an address scope, unless that scope was shared with everyone; or for a single tenant to use multiple private address scopes, for different subsets of their own networks.  With the introduction of explicit address scopes, both of these things become possible.\"\n\nWhat do you think?","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":83,"context_line":"hands of an authority.  It makes use of the already existing SubnetPool concept"},{"line_number":84,"context_line":"for allocation."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"The second purpose is to prevent address overlap.  The bottom line is that if"},{"line_number":87,"context_line":"you choose to use address scopes (or subnet pools alone for that matter), you"},{"line_number":88,"context_line":"give up the ability to overlap subnets within the scope.  It will never be"},{"line_number":89,"context_line":"possible to allocate the same address space to two subnets within the scope."}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_05604a00","line":86,"in_reply_to":"da20952f_06bf36fc","updated":"2015-10-07 19:25:56.000000000","message":"Very well stated.  Done.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Routers should honor address scopes.  The reference implementation does."},{"line_number":98,"context_line":"Within an address scope, addresses should route freely (barring any FW rules or"},{"line_number":99,"context_line":"other external restrictions).  Between scopes, routing will be limited.  Future"},{"line_number":100,"context_line":"patches will expand on this."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":".. TODO (Carl) Implement NAT for floating ips crossing scopes"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_e6948238","line":99,"updated":"2015-08-27 12:02:09.000000000","message":"I think \u0027will be limited\u0027 is an understatement.  Fundamentally, according to my understanding, some kind of NAT is needed.\n\nHow about s/will be limited/requires some kind of address translation between the scopes/ ?","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Routers should honor address scopes.  The reference implementation does."},{"line_number":98,"context_line":"Within an address scope, addresses should route freely (barring any FW rules or"},{"line_number":99,"context_line":"other external restrictions).  Between scopes, routing will be limited.  Future"},{"line_number":100,"context_line":"patches will expand on this."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":".. TODO (Carl) Implement NAT for floating ips crossing scopes"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_257466cd","line":99,"in_reply_to":"da20952f_e6948238","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":109,"context_line":"for each port on each router in order to route correctly within a scope and to"},{"line_number":110,"context_line":"know where the scope boundaries are."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Each subnet on a network is required to be from the same subnet pool."},{"line_number":113,"context_line":"Therefore, the address scope will also be the same.  If this were not the case,"},{"line_number":114,"context_line":"it would be more difficult to match ingress traffic on a port with the"},{"line_number":115,"context_line":"appropriate scope.  L3 addresses couldn\u0027t be used for this in general because"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_863b46eb","line":112,"updated":"2015-08-27 12:02:09.000000000","message":"I think I may see a contradiction here.\n\nA network can have both v4 and v6 subnets, so the previous sentence appears to imply that a single pool object must cater to both v4 and v6.\n\nBut you also wrote above that a single address scope object is for only one address family.  And, I would guess that a pool object now has an address scope property.\n\nPerhaps the resolution is that a pool object has two address scope properties, one for v4 and one for v6.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":109,"context_line":"for each port on each router in order to route correctly within a scope and to"},{"line_number":110,"context_line":"know where the scope boundaries are."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Each subnet on a network is required to be from the same subnet pool."},{"line_number":113,"context_line":"Therefore, the address scope will also be the same.  If this were not the case,"},{"line_number":114,"context_line":"it would be more difficult to match ingress traffic on a port with the"},{"line_number":115,"context_line":"appropriate scope.  L3 addresses couldn\u0027t be used for this in general because"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_a5671624","line":112,"in_reply_to":"da20952f_863b46eb","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":119,"context_line":"ports/networks.  In the future, we may be able to distinguish by something else"},{"line_number":120,"context_line":"like the remote mac address or something."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Since AddressScope isn\u0027t yet a first class object, the subnet pool id will be"},{"line_number":123,"context_line":"sent as the scope id when communicating with the L3 agent.  Another patch will"},{"line_number":124,"context_line":"change this.  The id is sent on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_49fa1fbf","line":122,"updated":"2015-08-27 12:02:09.000000000","message":"Is that still the case - that AddressScope isn\u0027t yet a first class object?","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":119,"context_line":"ports/networks.  In the future, we may be able to distinguish by something else"},{"line_number":120,"context_line":"like the remote mac address or something."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Since AddressScope isn\u0027t yet a first class object, the subnet pool id will be"},{"line_number":123,"context_line":"sent as the scope id when communicating with the L3 agent.  Another patch will"},{"line_number":124,"context_line":"change this.  The id is sent on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_c57812f5","line":122,"in_reply_to":"da20952f_49fa1fbf","updated":"2015-10-07 19:25:56.000000000","message":"Nope, just out of date.  I\u0027ll fix it up.  I finally have some time to get this stuff merged in to Mitaka.  Let\u0027s get it in to shape!","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":123,"context_line":"sent as the scope id when communicating with the L3 agent.  Another patch will"},{"line_number":124,"context_line":"change this.  The id is sent on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":126,"context_line":"not appear, it is assumed to be null for both families."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"},{"line_number":129,"context_line":"    \"address_scopes\": {"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_89b4b7f2","line":126,"updated":"2015-08-27 12:02:09.000000000","message":"Does \u0027null\u0027 mean some kind of default, e.g. (in principle) Internet-routable?","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":123,"context_line":"sent as the scope id when communicating with the L3 agent.  Another patch will"},{"line_number":124,"context_line":"change this.  The id is sent on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":126,"context_line":"not appear, it is assumed to be null for both families."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"},{"line_number":129,"context_line":"    \"address_scopes\": {"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_85969aee","line":126,"in_reply_to":"da20952f_89b4b7f2","updated":"2015-10-07 19:25:56.000000000","message":"Yes, a default but no, not internet routable.  One of the major problems with addressing in Neutron before address scopes is that we have no idea what they are or where they can route.  Address scopes is helping us get a handle on that.  So, if you want addresses to considered definitely internet routable then you create an address scope and subnet pools and you allocate the subnets from them.  I\u0027ll try to clear up this paragraph.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"cad5a305216d4d618a7ef470ab8d0b9db21b1d06","unresolved":false,"context_lines":[{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":126,"context_line":"not appear, it is assumed to be null for both families."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"},{"line_number":129,"context_line":"    \"address_scopes\": {"},{"line_number":130,"context_line":"        \"4\": \"d010a0ea-660e-4df4-86ca-ae2ed96da5c1\","},{"line_number":131,"context_line":"        \"6\": null"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_496e9f30","line":128,"updated":"2015-08-27 12:04:47.000000000","message":"To fix the Jenkins doc failure, I suspect you need a blank line here.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":126,"context_line":"not appear, it is assumed to be null for both families."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"},{"line_number":129,"context_line":"    \"address_scopes\": {"},{"line_number":130,"context_line":"        \"4\": \"d010a0ea-660e-4df4-86ca-ae2ed96da5c1\","},{"line_number":131,"context_line":"        \"6\": null"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_a51636a5","line":128,"in_reply_to":"da20952f_496e9f30","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3b9089809f61f8220af99e767b8c97c80e84d000","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    \"address_scopes\": {"},{"line_number":130,"context_line":"        \"4\": \"d010a0ea-660e-4df4-86ca-ae2ed96da5c1\","},{"line_number":131,"context_line":"        \"6\": null"},{"line_number":132,"context_line":"    },"}],"source_content_type":"text/x-rst","patch_set":4,"id":"da20952f_299d6b65","line":132,"updated":"2015-08-27 12:02:09.000000000","message":"I\u0027d love to see an extra section here that summarizes all the places that pool ID and/or scope ID properties have been added to existing Neutron objects.","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"28d61545a9ef370bebab1d99c8c7af1d866d9626","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    \"address_scopes\": {"},{"line_number":130,"context_line":"        \"4\": \"d010a0ea-660e-4df4-86ca-ae2ed96da5c1\","},{"line_number":131,"context_line":"        \"6\": null"},{"line_number":132,"context_line":"    },"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7a2fa921_8513fab7","line":132,"in_reply_to":"da20952f_299d6b65","updated":"2015-10-07 19:25:56.000000000","message":"Done","commit_id":"a308e0896c74269591e2bed082c1a2c38991c598"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"11e29fadfee7b103d3d9188c087fffd4a143a19b","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"Routers should honor address scopes.  The reference implementation does."},{"line_number":103,"context_line":"Within an address scope, addresses should route freely (barring any FW rules or"},{"line_number":104,"context_line":"other external restrictions).  Between scopes, routing will be preventing"},{"line_number":105,"context_line":"unless address translation is used.  Future patches will expand on this."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":".. TODO (Carl) Implement NAT for floating ips crossing scopes"}],"source_content_type":"text/x-rst","patch_set":14,"id":"7a2fa921_4e6dbbca","line":104,"updated":"2015-10-09 03:40:42.000000000","message":"*prevented","commit_id":"871ebf4e05bb096c290f353fbd1856d34d67bba6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"9764188bb86d24ccf9b2f0c356496857db3664ca","unresolved":false,"context_lines":[{"line_number":11,"context_line":".. [#] http://www.youtube.com/watch?v\u003dQqP8yBUUXBM\u0026t\u003d6m12s"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Subnet pools were added in Kilo.  They are relatively simple.  They were the"},{"line_number":14,"context_line":"first objects added to the Neutron core model [#]_ [#]_ for a long time.  A"},{"line_number":15,"context_line":"SubnetPool has any number of SubnetPoolPrefix objects associated to it.  These"},{"line_number":16,"context_line":"prefixes are in cidr format.  Each cidr is a piece of the address space that is"},{"line_number":17,"context_line":"available for allocation."}],"source_content_type":"text/x-rst","patch_set":18,"id":"3a29b11f_b371e4e2","line":14,"updated":"2015-10-26 15:38:29.000000000","message":"nit: s/for/in/","commit_id":"c95eb9a166bc9c90c48c1f5b8786057291eabb35"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0d391883259d8943efb03073756adcbe750fbab5","unresolved":false,"context_lines":[{"line_number":11,"context_line":".. [#] http://www.youtube.com/watch?v\u003dQqP8yBUUXBM\u0026t\u003d6m12s"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Subnet pools were added in Kilo.  They are relatively simple.  They were the"},{"line_number":14,"context_line":"first objects added to the Neutron core model [#]_ [#]_ for a long time.  A"},{"line_number":15,"context_line":"SubnetPool has any number of SubnetPoolPrefix objects associated to it.  These"},{"line_number":16,"context_line":"prefixes are in cidr format.  Each cidr is a piece of the address space that is"},{"line_number":17,"context_line":"available for allocation."}],"source_content_type":"text/x-rst","patch_set":18,"id":"da85f559_0bde1a3f","line":14,"in_reply_to":"3a29b11f_b371e4e2","updated":"2015-11-10 17:04:04.000000000","message":"moot","commit_id":"c95eb9a166bc9c90c48c1f5b8786057291eabb35"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"9764188bb86d24ccf9b2f0c356496857db3664ca","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Subnet Pools support IPv6 just as well as IPv4."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"The Subnet model object has been augmented with a subnetpool_id attribute.  By"},{"line_number":25,"context_line":"default, it is null for backward compatibility.  It can be the UUID of a subnet"},{"line_number":26,"context_line":"pool.  This means the address range for the subnet was allocated from the pool"},{"line_number":27,"context_line":"with that id."}],"source_content_type":"text/x-rst","patch_set":18,"id":"3a29b11f_f3351cf7","line":24,"updated":"2015-10-26 15:38:29.000000000","message":"Two nit: combine first two sentences to read:\n\nThe Subnet model object has been augmented with the subnetpool_id attribute, whose default value is null for backward compatibility.\n\nCombine last two sentences to read:\n\nThe subnetpool_id attribute stores the UUID of the subnet pool that acted as the source for the address range of a particular subnet.","commit_id":"c95eb9a166bc9c90c48c1f5b8786057291eabb35"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0d391883259d8943efb03073756adcbe750fbab5","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Subnet Pools support IPv6 just as well as IPv4."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"The Subnet model object has been augmented with a subnetpool_id attribute.  By"},{"line_number":25,"context_line":"default, it is null for backward compatibility.  It can be the UUID of a subnet"},{"line_number":26,"context_line":"pool.  This means the address range for the subnet was allocated from the pool"},{"line_number":27,"context_line":"with that id."}],"source_content_type":"text/x-rst","patch_set":18,"id":"da85f559_6bba46c2","line":24,"in_reply_to":"3a29b11f_f3351cf7","updated":"2015-11-10 17:04:04.000000000","message":"Done","commit_id":"c95eb9a166bc9c90c48c1f5b8786057291eabb35"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"9764188bb86d24ccf9b2f0c356496857db3664ca","unresolved":false,"context_lines":[{"line_number":81,"context_line":"space in the hands of an authority:  the address scope owner.  It makes use of"},{"line_number":82,"context_line":"the already existing SubnetPool concept for allocation."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"It provides more flexible control of when address overlap is or is not allowed,"},{"line_number":85,"context_line":"and specifically to decouple this from tenancy, because an address scope is"},{"line_number":86,"context_line":"also \u0027the thing within which address overlap is not allowed\u0027."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"3a29b11f_be252baf","line":84,"updated":"2015-10-26 15:38:29.000000000","message":"Nit: I think this para reads better:\n\nAddress scopes are defined as \"the thing within which address overlap is not allowed\" and thus provide more flexible control as well as decoupling of address overlap from tenancy.","commit_id":"c95eb9a166bc9c90c48c1f5b8786057291eabb35"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0d391883259d8943efb03073756adcbe750fbab5","unresolved":false,"context_lines":[{"line_number":81,"context_line":"space in the hands of an authority:  the address scope owner.  It makes use of"},{"line_number":82,"context_line":"the already existing SubnetPool concept for allocation."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"It provides more flexible control of when address overlap is or is not allowed,"},{"line_number":85,"context_line":"and specifically to decouple this from tenancy, because an address scope is"},{"line_number":86,"context_line":"also \u0027the thing within which address overlap is not allowed\u0027."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"da85f559_8b21aafd","line":84,"in_reply_to":"3a29b11f_be252baf","updated":"2015-11-10 17:04:04.000000000","message":"Done","commit_id":"c95eb9a166bc9c90c48c1f5b8786057291eabb35"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Learn about subnet pools by watching the summit talk given in Vancouver [#]_."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":".. [#] http://www.youtube.com/watch?v\u003dQqP8yBUUXBM\u0026t\u003d6m12s"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Subnet pools were added in Kilo.  They are relatively simple.  A SubnetPool has"},{"line_number":14,"context_line":"any number of SubnetPoolPrefix objects associated to it.  These prefixes are in"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_30e84b10","line":11,"updated":"2015-11-17 18:45:08.000000000","message":"I would rather learn about them by reading the devref ;)","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Learn about subnet pools by watching the summit talk given in Vancouver [#]_."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":".. [#] http://www.youtube.com/watch?v\u003dQqP8yBUUXBM\u0026t\u003d6m12s"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Subnet pools were added in Kilo.  They are relatively simple.  A SubnetPool has"},{"line_number":14,"context_line":"any number of SubnetPoolPrefix objects associated to it.  These prefixes are in"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_444b002c","line":11,"in_reply_to":"ba8a016a_30e84b10","updated":"2015-11-23 20:30:48.000000000","message":"I guess if the devref covers it well enough, no need to go watch this.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from the pool assuming the pool includes it and hasn\u0027t already allocated any"},{"line_number":28,"context_line":"part of it.  If cidr is left out, then the prefixlen attribute can be"},{"line_number":29,"context_line":"specified.  If it is not, the default prefix length will be taken from the"},{"line_number":30,"context_line":"subnet pool.  Think of it this way, the allocation logic always needs to know"},{"line_number":31,"context_line":"the size of the subnet desired.  It can pull it from a specific cidr,"},{"line_number":32,"context_line":"prefixlen, or default.  A specific cidr is optional and the allocation will try"},{"line_number":33,"context_line":"to honor it if provided.  The request will fail if it can\u0027t honor it."}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_b00f5be0","line":30,"updated":"2015-11-17 18:45:08.000000000","message":"\"Think of it this way\" if probably a bit colloquial, but it\u0027s good as it makes the devref less boring.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"specified.  If it is not, the default prefix length will be taken from the"},{"line_number":30,"context_line":"subnet pool.  Think of it this way, the allocation logic always needs to know"},{"line_number":31,"context_line":"the size of the subnet desired.  It can pull it from a specific cidr,"},{"line_number":32,"context_line":"prefixlen, or default.  A specific cidr is optional and the allocation will try"},{"line_number":33,"context_line":"to honor it if provided.  The request will fail if it can\u0027t honor it."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Subnet pools do not allow overlap of subnets."}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_50162ff2","line":32,"updated":"2015-11-17 18:45:08.000000000","message":"\"It can pull it from a specific cidr, prefixlen, or default\"\n\nAlternative, possibly simpler to read:\n\n\"It can be explicitly specified (prefixlen), inferred from the CIDR, or set from a default\"","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":45,"context_line":"addresses.  So, if you\u0027re allowed exactly one /24, your quota should be set to"},{"line_number":46,"context_line":"256.  Three /26s would be 192.  This mechanism encourages more efficient use of"},{"line_number":47,"context_line":"the IPv4 space which will be increasingly important when working with globally"},{"line_number":48,"context_line":"routable addresses."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"For IPv6, the smallest viable subnet in Neutron is a /64.  There is no reason"},{"line_number":51,"context_line":"to allocate a subnet of any other size for use on a Neutron network.  It would"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_f0bac3e0","line":48,"updated":"2015-11-17 18:45:08.000000000","message":"I am not sure it will, but I take your statement for true!","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":53,"context_line":"subnet.  To avoid this, we count IPv6 quota in terms of /64s.  So, a quota of 3"},{"line_number":54,"context_line":"allows three /64 subnets.  When we need to allocate something smaller in the"},{"line_number":55,"context_line":"future, we will need to ensure that the code can handle non-integer quota"},{"line_number":56,"context_line":"consumption."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Allocation"},{"line_number":59,"context_line":"~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_f0b643db","line":56,"updated":"2015-11-17 18:45:08.000000000","message":"just as note, the \"need for allocation something smaller\" contradicts the fact that \"the smallest viable subnet in Neutron is a /64\"\n\nNow experienced Neutron developers know that it\u0027s perfectly possible that in the future we\u0027ll find out we need something smaller than a /64, but:\n\n1) this confuses relatively new developers\n\n2) sets an expectation that we will have decimal quotas, whereas we might decide to do something different","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":77,"context_line":"space in the hands of an authority:  the address scope owner.  It makes use of"},{"line_number":78,"context_line":"the already existing SubnetPool concept for allocation."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Address scopes are \"the thing within which address overlap is not allowed\" and"},{"line_number":81,"context_line":"thus provide more flexible control as well as decoupling of address overlap"},{"line_number":82,"context_line":"from tenancy."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_30dccb11","line":80,"updated":"2015-11-17 18:45:08.000000000","message":"I need to be pedant here.... subnet pools are too.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Address scopes are \"the thing within which address overlap is not allowed\" and"},{"line_number":81,"context_line":"thus provide more flexible control as well as decoupling of address overlap"},{"line_number":82,"context_line":"from tenancy."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Prior to the Liberty release, there was implicitly a single \u0027shared\u0027 address"},{"line_number":85,"context_line":"scope used by all networks marked as shared.  Then, there were private address"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_d001bf6b","line":82,"updated":"2015-11-17 18:45:08.000000000","message":"yeah, that the value added, if you want","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":81,"context_line":"thus provide more flexible control as well as decoupling of address overlap"},{"line_number":82,"context_line":"from tenancy."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Prior to the Liberty release, there was implicitly a single \u0027shared\u0027 address"},{"line_number":85,"context_line":"scope used by all networks marked as shared.  Then, there were private address"},{"line_number":86,"context_line":"scopes for each tenant used by that tenant\u0027s non-shared networks.  It was not"},{"line_number":87,"context_line":"possible for two or more tenants to share an address scope, unless that scope"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_102f47f7","line":84,"updated":"2015-11-17 18:45:08.000000000","message":"s/Liberty/Mitaka/ ?","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"thus provide more flexible control as well as decoupling of address overlap"},{"line_number":82,"context_line":"from tenancy."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Prior to the Liberty release, there was implicitly a single \u0027shared\u0027 address"},{"line_number":85,"context_line":"scope used by all networks marked as shared.  Then, there were private address"},{"line_number":86,"context_line":"scopes for each tenant used by that tenant\u0027s non-shared networks.  It was not"},{"line_number":87,"context_line":"possible for two or more tenants to share an address scope, unless that scope"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_64e4040d","line":84,"in_reply_to":"ba8a016a_102f47f7","updated":"2015-11-23 20:30:48.000000000","message":"Done","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7a0f666669128d9a3ef2e37dee3e5e89cc87a3ba","unresolved":false,"context_lines":[{"line_number":118,"context_line":"we use ports/networks.  In the future, we may be able to distinguish by"},{"line_number":119,"context_line":"something else like the remote mac address or something."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"The address scope id is sent on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":122,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_a8df6fd4","line":121,"updated":"2015-11-19 20:51:06.000000000","message":"nit: s/sent/set","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":118,"context_line":"we use ports/networks.  In the future, we may be able to distinguish by"},{"line_number":119,"context_line":"something else like the remote mac address or something."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"The address scope id is sent on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":122,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_046c189b","line":121,"in_reply_to":"ba8a016a_a8df6fd4","updated":"2015-11-23 20:30:48.000000000","message":"Done","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"},{"line_number":125,"context_line":"addresses that don\u0027t have an explicit one.  All subnets that existed in Neutron"},{"line_number":126,"context_line":"before address scopes existed fall here."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_d0b9bf7a","line":125,"updated":"2015-11-17 18:45:08.000000000","message":"I think there is a slight backward compatibility implication in this logic for multitenant cloud as users might start seeing their subnet-create request fail and don\u0027t know why. I reserve to look at the actual code before commenting on it.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"6957440cd9575220344fd3df42e988a52df1f616","unresolved":false,"context_lines":[{"line_number":122,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"},{"line_number":125,"context_line":"addresses that don\u0027t have an explicit one.  All subnets that existed in Neutron"},{"line_number":126,"context_line":"before address scopes existed fall here."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a8ffd7b_70b913e9","line":125,"in_reply_to":"ba8a016a_840ec8e3","updated":"2015-11-25 10:12:41.000000000","message":"It\u0027s just about users that might keep using their clients written in a pre-address scope era, and wanting to keep using them once address scopes are introduced. I think you have a solution for them too anyway.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"},{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"},{"line_number":125,"context_line":"addresses that don\u0027t have an explicit one.  All subnets that existed in Neutron"},{"line_number":126,"context_line":"before address scopes existed fall here."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_840ec8e3","line":125,"in_reply_to":"ba8a016a_d0b9bf7a","updated":"2015-11-23 20:30:48.000000000","message":"I\u0027m not sure why they will start seeing their create requests fail.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"d8b53a5eae51118896a0a5dd7bef9ac2aa8d1ebf","unresolved":false,"context_lines":[{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"},{"line_number":125,"context_line":"addresses that don\u0027t have an explicit one.  All subnets that existed in Neutron"},{"line_number":126,"context_line":"before address scopes existed fall here."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"da85f559_65e0b729","line":126,"updated":"2015-11-12 17:33:13.000000000","message":"This seems to contradict what you\u0027ve said above about pre-Liberty shared and tenant networks implicitly having different address scopes.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"},{"line_number":125,"context_line":"addresses that don\u0027t have an explicit one.  All subnets that existed in Neutron"},{"line_number":126,"context_line":"before address scopes existed fall here."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_c42b7032","line":126,"in_reply_to":"ba8a016a_30592b5b","updated":"2015-11-23 20:30:48.000000000","message":"I think I can work on the wording above.  Actually, some of it doesn\u0027t sound right to me anymore.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":123,"context_line":"not appear, it is assumed to be null for both families.  A value of null means"},{"line_number":124,"context_line":"that the addresses are in the \"implicit\" address scope which holds all"},{"line_number":125,"context_line":"addresses that don\u0027t have an explicit one.  All subnets that existed in Neutron"},{"line_number":126,"context_line":"before address scopes existed fall here."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Here is an example of how the json will look in the context of a router port::"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_30592b5b","line":126,"in_reply_to":"da85f559_65e0b729","updated":"2015-11-17 18:45:08.000000000","message":"I think Carl is simply trying to find a way in which the previous model could be described as a particular case of the one being introduced here. the point is that before pools and scopes it was pretty much \"free for all\" when it came to address allocation.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    \"address_scopes\": {"},{"line_number":131,"context_line":"        \"4\": \"d010a0ea-660e-4df4-86ca-ae2ed96da5c1\","},{"line_number":132,"context_line":"        \"6\": null"},{"line_number":133,"context_line":"    },"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"Model"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_b03bdbea","line":132,"updated":"2015-11-17 18:45:08.000000000","message":"does \u0027null\u0027 express both the case where there is no address and then case where there is an address but it has no scope?","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    \"address_scopes\": {"},{"line_number":131,"context_line":"        \"4\": \"d010a0ea-660e-4df4-86ca-ae2ed96da5c1\","},{"line_number":132,"context_line":"        \"6\": null"},{"line_number":133,"context_line":"    },"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"Model"}],"source_content_type":"text/x-rst","patch_set":21,"id":"ba8a016a_e46234ad","line":132,"in_reply_to":"ba8a016a_b03bdbea","updated":"2015-11-23 20:30:48.000000000","message":"Both but if there is no address, does it matter much?","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"6957440cd9575220344fd3df42e988a52df1f616","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    \"address_scopes\": {"},{"line_number":131,"context_line":"        \"4\": \"d010a0ea-660e-4df4-86ca-ae2ed96da5c1\","},{"line_number":132,"context_line":"        \"6\": null"},{"line_number":133,"context_line":"    },"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"Model"}],"source_content_type":"text/x-rst","patch_set":21,"id":"9a8ffd7b_d01a3f17","line":132,"in_reply_to":"ba8a016a_e46234ad","updated":"2015-11-25 10:12:41.000000000","message":"well, it\u0027s just that API consumers don\u0027t like ambiguity. On the other hand there are plenty of ways to get that information so it does not really matter.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":9551,"name":"Martin Hickey","email":"martin.hickey@ie.ibm.com","username":"mhickey"},"change_message_id":"8cb8284b49e00873ef0a53b27f7d2bbce224e578","unresolved":false,"context_lines":[{"line_number":23,"context_line":"subnet."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"When creating a subnet, the subnetpool_id can be optionally specified.  If it"},{"line_number":26,"context_line":"is, the cidr field is not required.  If cidr is specified, it will be allocated"},{"line_number":27,"context_line":"from the pool assuming the pool includes it and hasn\u0027t already allocated any"},{"line_number":28,"context_line":"part of it.  If cidr is left out, then the prefixlen attribute can be"},{"line_number":29,"context_line":"specified.  If it is not, the default prefix length will be taken from the"}],"source_content_type":"text/x-rst","patch_set":24,"id":"9a8ffd7b_648ed4d1","line":26,"updated":"2015-11-26 20:30:49.000000000","message":"Nit: Should cidr-\u003eCIDR?","commit_id":"ced44bd4484e00edd9a8128e97569d30145d29d3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"291519d3571bec84f1abc332a6ee3e60ceb9d6db","unresolved":false,"context_lines":[{"line_number":23,"context_line":"subnet."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"When creating a subnet, the subnetpool_id can be optionally specified.  If it"},{"line_number":26,"context_line":"is, the cidr field is not required.  If cidr is specified, it will be allocated"},{"line_number":27,"context_line":"from the pool assuming the pool includes it and hasn\u0027t already allocated any"},{"line_number":28,"context_line":"part of it.  If cidr is left out, then the prefixlen attribute can be"},{"line_number":29,"context_line":"specified.  If it is not, the default prefix length will be taken from the"}],"source_content_type":"text/x-rst","patch_set":24,"id":"9a8ffd7b_966f45c3","line":26,"in_reply_to":"9a8ffd7b_4ad24436","updated":"2015-12-03 12:02:43.000000000","message":"I think we use capitals and lowercase interchangeably... and this is probably ok.\n\nThis is devref, and its audience are developers.\nNow, a developer is kind to expect what CIDR is, regardless of casing ;)","commit_id":"ced44bd4484e00edd9a8128e97569d30145d29d3"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"916815438f088ed8dedf760c712573fd48011ca1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"subnet."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"When creating a subnet, the subnetpool_id can be optionally specified.  If it"},{"line_number":26,"context_line":"is, the cidr field is not required.  If cidr is specified, it will be allocated"},{"line_number":27,"context_line":"from the pool assuming the pool includes it and hasn\u0027t already allocated any"},{"line_number":28,"context_line":"part of it.  If cidr is left out, then the prefixlen attribute can be"},{"line_number":29,"context_line":"specified.  If it is not, the default prefix length will be taken from the"}],"source_content_type":"text/x-rst","patch_set":24,"id":"9a8ffd7b_4ad24436","line":26,"in_reply_to":"9a8ffd7b_648ed4d1","updated":"2015-11-30 19:40:58.000000000","message":"If I roll another patch set, I\u0027ll change this.","commit_id":"ced44bd4484e00edd9a8128e97569d30145d29d3"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"bf8e2d65cf017a24fd7392118f9e83c905e63cfb","unresolved":false,"context_lines":[{"line_number":23,"context_line":"subnet."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"When creating a subnet, the subnetpool_id can be optionally specified.  If it"},{"line_number":26,"context_line":"is, the cidr field is not required.  If cidr is specified, it will be allocated"},{"line_number":27,"context_line":"from the pool assuming the pool includes it and hasn\u0027t already allocated any"},{"line_number":28,"context_line":"part of it.  If cidr is left out, then the prefixlen attribute can be"},{"line_number":29,"context_line":"specified.  If it is not, the default prefix length will be taken from the"}],"source_content_type":"text/x-rst","patch_set":24,"id":"7a740942_5c20dff7","line":26,"in_reply_to":"9a8ffd7b_966f45c3","updated":"2015-12-03 19:07:57.000000000","message":"In the up-coming patch set, I tried to be consistent with this using CIDR except in the places where it I\u0027m mentioning a specific field in the API (which is lower case).  In those cases, I put single quotes around \u0027cidr\u0027.","commit_id":"ced44bd4484e00edd9a8128e97569d30145d29d3"},{"author":{"_account_id":9551,"name":"Martin Hickey","email":"martin.hickey@ie.ibm.com","username":"mhickey"},"change_message_id":"8cb8284b49e00873ef0a53b27f7d2bbce224e578","unresolved":false,"context_lines":[{"line_number":119,"context_line":"scopes need to be anchored to some sort of non-L3 thing (e.g. an L2 interface)"},{"line_number":120,"context_line":"in the topology in order to determine the scope of ingress traffic.  For now,"},{"line_number":121,"context_line":"we use ports/networks.  In the future, we may be able to distinguish by"},{"line_number":122,"context_line":"something else like the remote mac address or something."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"The address scope id is set on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"}],"source_content_type":"text/x-rst","patch_set":24,"id":"9a8ffd7b_c4b30099","line":122,"updated":"2015-11-26 20:30:49.000000000","message":"Nit: Should mac-\u003eMAC?","commit_id":"ced44bd4484e00edd9a8128e97569d30145d29d3"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8b6a435a7931624b91d0d609ffc4ecde60db7408","unresolved":false,"context_lines":[{"line_number":119,"context_line":"scopes need to be anchored to some sort of non-L3 thing (e.g. an L2 interface)"},{"line_number":120,"context_line":"in the topology in order to determine the scope of ingress traffic.  For now,"},{"line_number":121,"context_line":"we use ports/networks.  In the future, we may be able to distinguish by"},{"line_number":122,"context_line":"something else like the remote mac address or something."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"The address scope id is set on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"}],"source_content_type":"text/x-rst","patch_set":24,"id":"7a740942_1c4a5784","line":122,"in_reply_to":"9a8ffd7b_2ae100ff","updated":"2015-12-03 19:12:22.000000000","message":"Done","commit_id":"ced44bd4484e00edd9a8128e97569d30145d29d3"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"916815438f088ed8dedf760c712573fd48011ca1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"scopes need to be anchored to some sort of non-L3 thing (e.g. an L2 interface)"},{"line_number":120,"context_line":"in the topology in order to determine the scope of ingress traffic.  For now,"},{"line_number":121,"context_line":"we use ports/networks.  In the future, we may be able to distinguish by"},{"line_number":122,"context_line":"something else like the remote mac address or something."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"The address scope id is set on each port in a dict under the \u0027address_scopes\u0027"},{"line_number":125,"context_line":"attribute.  The scope is distinct per address family.  If the attribute does"}],"source_content_type":"text/x-rst","patch_set":24,"id":"9a8ffd7b_2ae100ff","line":122,"in_reply_to":"9a8ffd7b_c4b30099","updated":"2015-11-30 19:40:58.000000000","message":"Ditto.","commit_id":"ced44bd4484e00edd9a8128e97569d30145d29d3"}],"neutron/db/l3_db.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"c1c7b440288d86bc8d9cee3b9a1e9685b7276927","unresolved":false,"context_lines":[{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"        interfaces \u003d [self._core_plugin._make_port_dict(rp.port, None)"},{"line_number":1144,"context_line":"                      for rp in qry]"},{"line_number":1145,"context_line":"        return interfaces"},{"line_number":1146,"context_line":""},{"line_number":1147,"context_line":"    def _populate_subnets_for_ports(self, context, ports):"},{"line_number":1148,"context_line":"        \"\"\"Populate ports with subnets."}],"source_content_type":"text/x-python","patch_set":1,"id":"1af86dd1_ac72e2ab","line":1145,"updated":"2015-06-12 02:02:16.000000000","message":"Gah I don\u0027t even see an existing unit test for this function.\n\nIf it were me I would add a unit test that uses the core_plugin to create a network and subnet, and calls core_plugin.create_port and core_plugin._make_port_dict. Then pass that port_dict to this method and assert the results for different data. IPv4 subnet, IPv6 subnet, a network with both. I\u0027d have to dive deeper in to the code to understand if you\u0027d also need to run that test with subnets that belong to a subnet pool VS subnets that stand on their own.\n\nSay no to mocks...","commit_id":"1cacc79838998ab4a81ccf4d78d9b9e48fc223fd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"4ab4fe231e3359887897b47bc38c7201c2efba68","unresolved":false,"context_lines":[{"line_number":1178,"context_line":""},{"line_number":1179,"context_line":"            port[\u0027subnets\u0027] \u003d []"},{"line_number":1180,"context_line":"            port[\u0027extra_subnets\u0027] \u003d []"},{"line_number":1181,"context_line":"            port[\u0027address_scopes\u0027] \u003d scopes \u003d {}"},{"line_number":1182,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"},{"line_number":1183,"context_line":"                # TODO(Carl) true address scopes will come later.  Using just"},{"line_number":1184,"context_line":"                # the subnetpool id for now."}],"source_content_type":"text/x-python","patch_set":1,"id":"1af86dd1_969b96c9","line":1181,"updated":"2015-06-12 17:14:03.000000000","message":"I think I should probably initialize the dict to {4: null, 6: null}","commit_id":"1cacc79838998ab4a81ccf4d78d9b9e48fc223fd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"744fe40298a077be4f49a5e4af6a6dc4e5ef106b","unresolved":false,"context_lines":[{"line_number":1178,"context_line":""},{"line_number":1179,"context_line":"            port[\u0027subnets\u0027] \u003d []"},{"line_number":1180,"context_line":"            port[\u0027extra_subnets\u0027] \u003d []"},{"line_number":1181,"context_line":"            port[\u0027address_scopes\u0027] \u003d scopes \u003d {}"},{"line_number":1182,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"},{"line_number":1183,"context_line":"                # TODO(Carl) true address scopes will come later.  Using just"},{"line_number":1184,"context_line":"                # the subnetpool id for now."}],"source_content_type":"text/x-python","patch_set":1,"id":"1af86dd1_16dc46e3","line":1181,"in_reply_to":"1af86dd1_969b96c9","updated":"2015-06-12 17:28:38.000000000","message":"I mixed my python dict with the json format in RPC.  This will be:\n\n  scopes \u003d {4: None, 6: None}","commit_id":"1cacc79838998ab4a81ccf4d78d9b9e48fc223fd"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"c1c7b440288d86bc8d9cee3b9a1e9685b7276927","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"                if cidr.version in scopes and scopes[cidr.version] !\u003d scope:"},{"line_number":1189,"context_line":"                    # I don\u0027t expect this to happen because we have code now"},{"line_number":1190,"context_line":"                    # backported to Kilo to prevent it.  But, there was a small"},{"line_number":1191,"context_line":"                    # window where it could\u0027ve happened."},{"line_number":1192,"context_line":"                    msg \u003d _LW(\"Network %(net)s has IPv%(version)d subnets \""},{"line_number":1193,"context_line":"                              \"from more than one address scope.\")"},{"line_number":1194,"context_line":"                    LOG.warn(msg, {\u0027net\u0027: port[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af86dd1_ec2a1a7e","line":1191,"updated":"2015-06-12 02:02:16.000000000","message":"If this does happen then the port will be in an arbitrary scope. Is logging a warning enough here? The behavior will be random and very hard to troubleshoot no? Is there anything more explicit you can do to handle this corner case?","commit_id":"1cacc79838998ab4a81ccf4d78d9b9e48fc223fd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"744fe40298a077be4f49a5e4af6a6dc4e5ef106b","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"                if cidr.version in scopes and scopes[cidr.version] !\u003d scope:"},{"line_number":1189,"context_line":"                    # I don\u0027t expect this to happen because we have code now"},{"line_number":1190,"context_line":"                    # backported to Kilo to prevent it.  But, there was a small"},{"line_number":1191,"context_line":"                    # window where it could\u0027ve happened."},{"line_number":1192,"context_line":"                    msg \u003d _LW(\"Network %(net)s has IPv%(version)d subnets \""},{"line_number":1193,"context_line":"                              \"from more than one address scope.\")"},{"line_number":1194,"context_line":"                    LOG.warn(msg, {\u0027net\u0027: port[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af86dd1_f623ea03","line":1191,"in_reply_to":"1af86dd1_ec2a1a7e","updated":"2015-06-12 17:28:38.000000000","message":"I grappled over this for a while.  I\u0027m not sure what to do.  I\u0027ve considered:\n\n- LOG.Error or a more descriptive error message\n- Reverting to the null address scope in addition to LOG.\n- Exception and failing the router update altogether (wouldn\u0027t be an improvement in overall experience)\n\nAny of these is somewhat unexpected and will leave someone wondering.  Do you have any suggestions?  I really don\u0027t expect this to happen but Murphy\u0027s law says it will (what can happen will).  I\u0027m not sure I agree with Murphy in this case.","commit_id":"1cacc79838998ab4a81ccf4d78d9b9e48fc223fd"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"62b20e65e987f52bba5b2e404958a359ada88907","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"                if cidr.version in scopes and scopes[cidr.version] !\u003d scope:"},{"line_number":1189,"context_line":"                    # I don\u0027t expect this to happen because we have code now"},{"line_number":1190,"context_line":"                    # backported to Kilo to prevent it.  But, there was a small"},{"line_number":1191,"context_line":"                    # window where it could\u0027ve happened."},{"line_number":1192,"context_line":"                    msg \u003d _LW(\"Network %(net)s has IPv%(version)d subnets \""},{"line_number":1193,"context_line":"                              \"from more than one address scope.\")"},{"line_number":1194,"context_line":"                    LOG.warn(msg, {\u0027net\u0027: port[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_3852b614","line":1191,"in_reply_to":"1af86dd1_f623ea03","updated":"2015-06-13 15:38:19.000000000","message":"I think you should write a server start-up script or a DB migration that will detect this issue and spit out all of the required information that the admin needs in order to fix it. Then in that same patch you can remove all references like this in the code.","commit_id":"1cacc79838998ab4a81ccf4d78d9b9e48fc223fd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"492631dc628b6be12e38b59d0fefdce894c7ece3","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"                if cidr.version in scopes and scopes[cidr.version] !\u003d scope:"},{"line_number":1189,"context_line":"                    # I don\u0027t expect this to happen because we have code now"},{"line_number":1190,"context_line":"                    # backported to Kilo to prevent it.  But, there was a small"},{"line_number":1191,"context_line":"                    # window where it could\u0027ve happened."},{"line_number":1192,"context_line":"                    msg \u003d _LW(\"Network %(net)s has IPv%(version)d subnets \""},{"line_number":1193,"context_line":"                              \"from more than one address scope.\")"},{"line_number":1194,"context_line":"                    LOG.warn(msg, {\u0027net\u0027: port[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_470a0728","line":1191,"in_reply_to":"fa32b979_3852b614","updated":"2015-06-26 15:23:24.000000000","message":"Sounds reasonable.","commit_id":"1cacc79838998ab4a81ccf4d78d9b9e48fc223fd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d876638765a0022907519d2e7a02e9bc1ee4d2b4","unresolved":false,"context_lines":[{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"        interfaces \u003d [self._core_plugin._make_port_dict(rp.port, None)"},{"line_number":1144,"context_line":"                      for rp in qry]"},{"line_number":1145,"context_line":"        return interfaces"},{"line_number":1146,"context_line":""},{"line_number":1147,"context_line":"    def _populate_subnets_for_ports(self, context, ports):"},{"line_number":1148,"context_line":"        \"\"\"Populate ports with subnets."}],"source_content_type":"text/x-python","patch_set":2,"id":"1af86dd1_e13446df","line":1145,"updated":"2015-06-12 17:34:23.000000000","message":"Still need to address Assaf\u0027s comment from PS1","commit_id":"6959203b28e6ce243ad9042e11d8fcecccb22580"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"134bdc80624398102c16734829717cbe4fc603f3","unresolved":false,"context_lines":[{"line_number":1185,"context_line":"                scope \u003d subnet[\u0027subnetpool_id\u0027]"},{"line_number":1186,"context_line":""},{"line_number":1187,"context_line":"                cidr \u003d netaddr.IPNetwork(subnet[\u0027cidr\u0027])"},{"line_number":1188,"context_line":"                if cidr.version in scopes and scopes[cidr.version] !\u003d scope:"},{"line_number":1189,"context_line":"                    # I don\u0027t expect this to happen because we have code now"},{"line_number":1190,"context_line":"                    # backported to Kilo to prevent it.  But, there was a small"},{"line_number":1191,"context_line":"                    # window where it could\u0027ve happened."}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_2cb2e64c","line":1188,"updated":"2015-06-17 13:06:37.000000000","message":"you can use directly scopes.get(cidr.version) or scopes.get(cidr.version, object()) if scope can be None","commit_id":"6959203b28e6ce243ad9042e11d8fcecccb22580"},{"author":{"_account_id":14258,"name":"Ryan Tidwell","email":"rktidwell85@gmail.com","username":"tidwellr"},"change_message_id":"45e453cb0213d546f56e28c8b32906607c9e6824","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"                if cidr.version in scopes and scopes[cidr.version] !\u003d scope:"},{"line_number":1189,"context_line":"                    # I don\u0027t expect this to happen because we have code now"},{"line_number":1190,"context_line":"                    # backported to Kilo to prevent it.  But, there was a small"},{"line_number":1191,"context_line":"                    # window where it could\u0027ve happened."},{"line_number":1192,"context_line":"                    msg \u003d _LW(\"Network %(net)s has IPv%(version)d subnets \""},{"line_number":1193,"context_line":"                              \"from more than one address scope.\")"},{"line_number":1194,"context_line":"                    LOG.warn(msg, {\u0027net\u0027: port[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_7ed01554","line":1191,"updated":"2015-06-15 05:22:05.000000000","message":"Is this check still required when we have real address scopes?  I think to support dual-stack networks we need to allow subnets from different address scopes.","commit_id":"6959203b28e6ce243ad9042e11d8fcecccb22580"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b63ccb02ef00b213e54a0302c47dcbb4412e30","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"                if cidr.version in scopes and scopes[cidr.version] !\u003d scope:"},{"line_number":1189,"context_line":"                    # I don\u0027t expect this to happen because we have code now"},{"line_number":1190,"context_line":"                    # backported to Kilo to prevent it.  But, there was a small"},{"line_number":1191,"context_line":"                    # window where it could\u0027ve happened."},{"line_number":1192,"context_line":"                    msg \u003d _LW(\"Network %(net)s has IPv%(version)d subnets \""},{"line_number":1193,"context_line":"                              \"from more than one address scope.\")"},{"line_number":1194,"context_line":"                    LOG.warn(msg, {\u0027net\u0027: port[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_18cbcb73","line":1191,"in_reply_to":"fa32b979_7ed01554","updated":"2015-06-16 16:35:54.000000000","message":"Ryan, the address family is built in to L1188 (cidr.version).","commit_id":"6959203b28e6ce243ad9042e11d8fcecccb22580"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"066a5a46197a18109a4ee5888857b3f78d0df3e6","unresolved":false,"context_lines":[{"line_number":1192,"context_line":"        These ports already have fixed_ips populated."},{"line_number":1193,"context_line":"        \"\"\""},{"line_number":1194,"context_line":"        def each_port_having_fixed_ips():"},{"line_number":1195,"context_line":"            for port in ports or []:"},{"line_number":1196,"context_line":"                fixed_ips \u003d port.get(\u0027fixed_ips\u0027, [])"},{"line_number":1197,"context_line":"                if not fixed_ips:"},{"line_number":1198,"context_line":"                    # Skip ports without IPs, which can occur if a subnet"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_1a6f4893","line":1195,"updated":"2015-10-07 19:56:32.000000000","message":"A gratuitous change?","commit_id":"6d92770fb54f7356be316b44d8d29ec0e102822a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b9bb2a77b6490596eab7cefab2c82a419f7b0d22","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"},{"line_number":1251,"context_line":"                scope \u003d subnet[\u0027address_scope_id\u0027]"},{"line_number":1252,"context_line":"                cidr \u003d netaddr.IPNetwork(subnet[\u0027cidr\u0027])"},{"line_number":1253,"context_line":"                scopes[cidr.version] \u003d scope"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"                # If this subnet is used by the port (has a matching entry"},{"line_number":1256,"context_line":"                # in the port\u0027s fixed_ips), then add this subnet to the"}],"source_content_type":"text/x-python","patch_set":20,"id":"da85f559_e13bb736","line":1253,"updated":"2015-11-10 17:35:49.000000000","message":"What happens when a network has multiple IPv4/6 subnets?  The port only has space for one address scope per family.","commit_id":"7a3db6c6b9f35e7c656de8d485ef1dc76ac92160"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c063f35ab75ee534556d39566342dd75976eb935","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"},{"line_number":1251,"context_line":"                scope \u003d subnet[\u0027address_scope_id\u0027]"},{"line_number":1252,"context_line":"                cidr \u003d netaddr.IPNetwork(subnet[\u0027cidr\u0027])"},{"line_number":1253,"context_line":"                scopes[cidr.version] \u003d scope"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"                # If this subnet is used by the port (has a matching entry"},{"line_number":1256,"context_line":"                # in the port\u0027s fixed_ips), then add this subnet to the"}],"source_content_type":"text/x-python","patch_set":20,"id":"da85f559_015b5b88","line":1253,"in_reply_to":"da85f559_e13bb736","updated":"2015-11-10 17:37:39.000000000","message":"They are all required to be in the same subnet pool and, by extension, the same address scope.","commit_id":"7a3db6c6b9f35e7c656de8d485ef1dc76ac92160"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":1211,"context_line":"                  \u0027network_id\u0027, \u0027ipv6_ra_mode\u0027, \u0027subnetpool_id\u0027]"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"        subnets_by_network \u003d dict((id, []) for id in network_ids)"},{"line_number":1214,"context_line":"        for subnet in self._core_plugin.get_subnets(context, filters, fields):"},{"line_number":1215,"context_line":"            subnets_by_network[subnet[\u0027network_id\u0027]].append(subnet)"},{"line_number":1216,"context_line":"        return subnets_by_network"},{"line_number":1217,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_4b1684f2","side":"PARENT","line":1214,"updated":"2015-11-17 18:45:08.000000000","message":"we should check git logs (if you have not already done so). The explicit call to the plugin was probably made in response to a bug.\n\nThat bug had to with 3rd party plugin needing to do \"particular\" things on subnet operations. We might or might not care of that.","commit_id":"b8b8a549e8820bb60875bf44a449da6e683241f0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":1211,"context_line":"                  \u0027network_id\u0027, \u0027ipv6_ra_mode\u0027, \u0027subnetpool_id\u0027]"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"        subnets_by_network \u003d dict((id, []) for id in network_ids)"},{"line_number":1214,"context_line":"        for subnet in self._core_plugin.get_subnets(context, filters, fields):"},{"line_number":1215,"context_line":"            subnets_by_network[subnet[\u0027network_id\u0027]].append(subnet)"},{"line_number":1216,"context_line":"        return subnets_by_network"},{"line_number":1217,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_24eefcec","side":"PARENT","line":1214,"in_reply_to":"ba8a016a_4b1684f2","updated":"2015-11-23 20:30:48.000000000","message":"ditto","commit_id":"b8b8a549e8820bb60875bf44a449da6e683241f0"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"            subnet_db, address_scope_id \u003d row"},{"line_number":1221,"context_line":"            subnet \u003d self._core_plugin._make_subnet_dict("},{"line_number":1222,"context_line":"                subnet_db, fields, context\u003dcontext)"},{"line_number":1223,"context_line":"            subnet[\u0027address_scope_id\u0027] \u003d address_scope_id"},{"line_number":1224,"context_line":"            return subnet"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"        subnets_by_network \u003d dict((id, []) for id in network_ids)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_4b4a04ae","line":1223,"updated":"2015-11-17 18:45:08.000000000","message":"I was expecting the \u0027base\u0027 db calls would provide a solution for adding the address scope id in make_subnet?\n\nAdmittedly it seems a bit awkward to find this logic here as currently subnets are \"owner\" by the \"base\" db plugin class.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"85594ed16073bcdea19f4da8583beb86934e06f4","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"            subnet_db, address_scope_id \u003d row"},{"line_number":1221,"context_line":"            subnet \u003d self._core_plugin._make_subnet_dict("},{"line_number":1222,"context_line":"                subnet_db, fields, context\u003dcontext)"},{"line_number":1223,"context_line":"            subnet[\u0027address_scope_id\u0027] \u003d address_scope_id"},{"line_number":1224,"context_line":"            return subnet"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"        subnets_by_network \u003d dict((id, []) for id in network_ids)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_7c745b9b","line":1223,"in_reply_to":"ba8a016a_04f178cd","updated":"2015-11-23 23:00:52.000000000","message":"I remember why I did it this way.  In the initial stages of playing around with this patch, I found the many levels of indirection and generic methods pretty difficult to deal with.\n\n  get_subnets -\u003e _get_subnets -\u003e _get_collection -\u003e _get_collection_query -\u003e _model_query\n\nIt wasn\u0027t clear to me how/where to add a join to the SubnetPool table to get the address scope and so I punted and failed to come back and address this properly.  Looking at it again, there may be a better way to accomplish this maybe using a UnionModel.  Let me continue to look in to it.  Whatever the answer is, it wasn\u0027t apparent to me when I first worked on this patch and I was more interested in getting the functionality.  Apologies.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"6957440cd9575220344fd3df42e988a52df1f616","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"            subnet_db, address_scope_id \u003d row"},{"line_number":1221,"context_line":"            subnet \u003d self._core_plugin._make_subnet_dict("},{"line_number":1222,"context_line":"                subnet_db, fields, context\u003dcontext)"},{"line_number":1223,"context_line":"            subnet[\u0027address_scope_id\u0027] \u003d address_scope_id"},{"line_number":1224,"context_line":"            return subnet"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"        subnets_by_network \u003d dict((id, []) for id in network_ids)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a8ffd7b_50996f6d","line":1223,"in_reply_to":"ba8a016a_3ffec56b","updated":"2015-11-25 10:12:41.000000000","message":"I saw the WIP you posted, but it\u0027s not yet clear to me how it will serve this purpose. I\u0027ll keep thinking about it.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"            subnet_db, address_scope_id \u003d row"},{"line_number":1221,"context_line":"            subnet \u003d self._core_plugin._make_subnet_dict("},{"line_number":1222,"context_line":"                subnet_db, fields, context\u003dcontext)"},{"line_number":1223,"context_line":"            subnet[\u0027address_scope_id\u0027] \u003d address_scope_id"},{"line_number":1224,"context_line":"            return subnet"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"        subnets_by_network \u003d dict((id, []) for id in network_ids)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_04f178cd","line":1223,"in_reply_to":"ba8a016a_4b4a04ae","updated":"2015-11-23 20:30:48.000000000","message":"I\u0027ll look at this.  Admittedly, I\u0027ve felt a bit funny doing this but I wasn\u0027t sure what the right thing to do was.  So, I stayed my course for the time being.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"dc35d0d14844aef7e803123fa3efff0d067cd9b2","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"            subnet_db, address_scope_id \u003d row"},{"line_number":1221,"context_line":"            subnet \u003d self._core_plugin._make_subnet_dict("},{"line_number":1222,"context_line":"                subnet_db, fields, context\u003dcontext)"},{"line_number":1223,"context_line":"            subnet[\u0027address_scope_id\u0027] \u003d address_scope_id"},{"line_number":1224,"context_line":"            return subnet"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"        subnets_by_network \u003d dict((id, []) for id in network_ids)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_3ffec56b","line":1223,"in_reply_to":"ba8a016a_7c745b9b","updated":"2015-11-23 23:58:06.000000000","message":"So, looking in to UnionModel.  It was added in the RBAC work [1].  So, it didn\u0027t exist when I started out with this patch.  Also, I\u0027m not sure it is really what I want.  I\u0027ll have to look at it some more.\n\nHowever, it might give me some ideas for how to make this better.\n\n [1] Ib90e2a931df068f417faf26e9c3780dc3c468867","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"b51702f1bf69b0e921386f3948d4d02ee41c3102","unresolved":false,"context_lines":[{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"            port[\u0027subnets\u0027] \u003d []"},{"line_number":1245,"context_line":"            port[\u0027extra_subnets\u0027] \u003d []"},{"line_number":1246,"context_line":"            port[\u0027address_scopes\u0027] \u003d {4: None, 6: None}"},{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"            scopes \u003d {}"},{"line_number":1249,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da85f559_a30c0e43","line":1246,"updated":"2015-11-14 08:10:59.000000000","message":"Why not using IP_VERSION_4 here? Given the constant has already been imported.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87dc9cdd1d0075aad9ba106e448c0df580bd086a","unresolved":false,"context_lines":[{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"            port[\u0027subnets\u0027] \u003d []"},{"line_number":1245,"context_line":"            port[\u0027extra_subnets\u0027] \u003d []"},{"line_number":1246,"context_line":"            port[\u0027address_scopes\u0027] \u003d {4: None, 6: None}"},{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"            scopes \u003d {}"},{"line_number":1249,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_c4b930ee","line":1246,"in_reply_to":"ba8a016a_6b8a68c1","updated":"2015-11-23 20:30:48.000000000","message":"I\u0027m fine using the constants.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"            port[\u0027subnets\u0027] \u003d []"},{"line_number":1245,"context_line":"            port[\u0027extra_subnets\u0027] \u003d []"},{"line_number":1246,"context_line":"            port[\u0027address_scopes\u0027] \u003d {4: None, 6: None}"},{"line_number":1247,"context_line":""},{"line_number":1248,"context_line":"            scopes \u003d {}"},{"line_number":1249,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_6b8a68c1","line":1246,"in_reply_to":"da85f559_a30c0e43","updated":"2015-11-17 18:45:08.000000000","message":"technically speaking yes.\n\nBut I also dare question the usefulness of using constants for literals which will never change in their lifecycle because of their nature.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"4db10d88ebbbe634b9732d6ad307ad35ca380f2d","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"},{"line_number":1250,"context_line":"                scope \u003d subnet[\u0027address_scope_id\u0027]"},{"line_number":1251,"context_line":"                cidr \u003d netaddr.IPNetwork(subnet[\u0027cidr\u0027])"},{"line_number":1252,"context_line":"                scopes[cidr.version] \u003d scope"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"                # If this subnet is used by the port (has a matching entry"},{"line_number":1255,"context_line":"                # in the port\u0027s fixed_ips), then add this subnet to the"}],"source_content_type":"text/x-python","patch_set":21,"id":"da85f559_e39e9606","line":1252,"updated":"2015-11-14 07:52:46.000000000","message":"I am not sure I fully understand all the details of the bp. It looks like you are pushing the address scope of a network to a port here. It is OK when the port have both V4 and V6 IP.\nWhat if the port only have a V4 IP address. Is it still meaningful to push the V6 address scope to the port?","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"            for subnet in subnets_by_network[port[\u0027network_id\u0027]]:"},{"line_number":1250,"context_line":"                scope \u003d subnet[\u0027address_scope_id\u0027]"},{"line_number":1251,"context_line":"                cidr \u003d netaddr.IPNetwork(subnet[\u0027cidr\u0027])"},{"line_number":1252,"context_line":"                scopes[cidr.version] \u003d scope"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"                # If this subnet is used by the port (has a matching entry"},{"line_number":1255,"context_line":"                # in the port\u0027s fixed_ips), then add this subnet to the"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_abb61088","line":1252,"in_reply_to":"da85f559_e39e9606","updated":"2015-11-17 18:45:08.000000000","message":"The reason for doing this has been explained both in the spec and in the rst document which is part of this patch","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"}],"neutron/tests/unit/db/test_l3_db.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"80cb390260ebd1e8e80223b11d65e127b9cd13e6","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertEqual({"},{"line_number":62,"context_line":"            mock.sentinel.network_id: [{"},{"line_number":63,"context_line":"                \u0027address_scope_id\u0027: mock.sentinel.address_scope_id,"},{"line_number":64,"context_line":"                \u0027network_id\u0027: mock.sentinel.network_id}]}, subnets)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test__populate_ports_for_subnets_none(self):"},{"line_number":67,"context_line":"        \"\"\"Basic test that the method runs correctly with no ports\"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_06863165","line":64,"updated":"2015-11-17 18:45:08.000000000","message":"There\u0027s so much code mocked out that I\u0027m not sure anymore what parts of your code you are actually testing.\n\nBut if you want to do pedant testing possibly you should also validate two more cases:\n1) a subnet for a mock.sentinel.alter_network_id network\n2) a subnet without address scope","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"85594ed16073bcdea19f4da8583beb86934e06f4","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertEqual({"},{"line_number":62,"context_line":"            mock.sentinel.network_id: [{"},{"line_number":63,"context_line":"                \u0027address_scope_id\u0027: mock.sentinel.address_scope_id,"},{"line_number":64,"context_line":"                \u0027network_id\u0027: mock.sentinel.network_id}]}, subnets)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test__populate_ports_for_subnets_none(self):"},{"line_number":67,"context_line":"        \"\"\"Basic test that the method runs correctly with no ports\"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_b9dbb51a","line":64,"in_reply_to":"ba8a016a_06863165","updated":"2015-11-23 23:00:52.000000000","message":"To be fair, I only added mock sentinel objects which are just a fancy way of providing fake opaque data.  Would you rather I use other fake data?  Or, do you have other specific suggestions?\n\nI\u0027ll look at adding those those other cases.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"4db10d88ebbbe634b9732d6ad307ad35ca380f2d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                           \u0027network_id\u0027: \u0027net_id\u0027,"},{"line_number":95,"context_line":"                           \u0027subnets\u0027: [{k: subnet[k] for k in keys}],"},{"line_number":96,"context_line":"                           \u0027address_scopes\u0027: address_scopes}], ports)"},{"line_number":97,"context_line":"        self.assertEqual(address_scopes, ports[0][\u0027address_scopes\u0027])"}],"source_content_type":"text/x-python","patch_set":21,"id":"da85f559_433a029a","line":97,"updated":"2015-11-14 07:52:46.000000000","message":"If the last assertEqual succeeded, is this assertEqual still needed?","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"85594ed16073bcdea19f4da8583beb86934e06f4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                           \u0027network_id\u0027: \u0027net_id\u0027,"},{"line_number":95,"context_line":"                           \u0027subnets\u0027: [{k: subnet[k] for k in keys}],"},{"line_number":96,"context_line":"                           \u0027address_scopes\u0027: address_scopes}], ports)"},{"line_number":97,"context_line":"        self.assertEqual(address_scopes, ports[0][\u0027address_scopes\u0027])"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba8a016a_b9f2d598","line":97,"in_reply_to":"da85f559_433a029a","updated":"2015-11-23 23:00:52.000000000","message":"I suppose not.  Good catch.","commit_id":"105fdb738bbc83ffdd90e67f1d4525ceb5b1d573"}]}
