)]}'
{"specs/train/atomic-extraroute-api.rst":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e89284d1e2d8aef985c624d635a94037142aed93","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"::"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"  $ wget -O extraroute-concurrent.yaml http://paste.openstack.org/raw/749738/"},{"line_number":33,"context_line":"  $ openstack stack create --wait -t extraroute-concurrent.yaml stack0"},{"line_number":34,"context_line":"  $ openstack stack resource list stack0 --filter name\u003drouter0 -f value -c physical_resource_id \\"},{"line_number":35,"context_line":"    | xargs -r openstack router show -f value -c routes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_0ee0ddf9","line":32,"updated":"2019-04-29 00:14:51.000000000","message":"nit: maybe would be better to just include whole this template here instead of link to other site?","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6021e13bc1741553bac62b358550de32ce61f59e","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"::"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"  $ wget -O extraroute-concurrent.yaml http://paste.openstack.org/raw/749738/"},{"line_number":33,"context_line":"  $ openstack stack create --wait -t extraroute-concurrent.yaml stack0"},{"line_number":34,"context_line":"  $ openstack stack resource list stack0 --filter name\u003drouter0 -f value -c physical_resource_id \\"},{"line_number":35,"context_line":"    | xargs -r openstack router show -f value -c routes"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_967cd883","line":32,"in_reply_to":"ffb9cba7_0ee0ddf9","updated":"2019-04-29 21:33:01.000000000","message":"Done","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e89284d1e2d8aef985c624d635a94037142aed93","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"::"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"  PUT /v2.0/routers/{router_id}/add_extraroutes"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"  [ { \"destination\": \"179.24.1.0/24\","},{"line_number":51,"context_line":"      \"nexthop\": \"172.24.3.99\" },"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_aee8b1e1","line":48,"updated":"2019-04-29 00:14:51.000000000","message":"IMO if we want to allow bulk adding/removing extraroutes, it should be done in same way as e.g. bulk ports creation. If one will fail, all is reverted.","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"a351e5b32ad78607a801f462ce0a89b3c2836de6","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"::"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"  PUT /v2.0/routers/{router_id}/add_extraroutes"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"  [ { \"destination\": \"179.24.1.0/24\","},{"line_number":51,"context_line":"      \"nexthop\": \"172.24.3.99\" },"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_f70eae8b","line":48,"range":{"start_line":48,"start_character":46,"end_line":48,"end_character":47},"updated":"2019-04-25 14:24:03.000000000","message":"If we allow adding/removing a set of extraroutes at once, how do we handle partial success/failure?","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6021e13bc1741553bac62b358550de32ce61f59e","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"::"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"  PUT /v2.0/routers/{router_id}/add_extraroutes"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"  [ { \"destination\": \"179.24.1.0/24\","},{"line_number":51,"context_line":"      \"nexthop\": \"172.24.3.99\" },"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_d6b25049","line":48,"in_reply_to":"ffb9cba7_aee8b1e1","updated":"2019-04-29 21:33:01.000000000","message":"Good idea. Added it to the proposal.","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"a351e5b32ad78607a801f462ce0a89b3c2836de6","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  PUT /v2.0/routers/{router_id}/remove_extraroutes"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"  [ { \"destination\": \"179.24.1.0/24\","},{"line_number":60,"context_line":"      \"nexthop\": \"172.24.3.99\" },"},{"line_number":61,"context_line":"    ..."},{"line_number":62,"context_line":"  ]"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_971df2be","line":59,"range":{"start_line":59,"start_character":6,"end_line":59,"end_character":36},"updated":"2019-04-25 14:24:03.000000000","message":"Do we ever need to delete just by destination?","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6021e13bc1741553bac62b358550de32ce61f59e","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"  PUT /v2.0/routers/{router_id}/remove_extraroutes"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"  [ { \"destination\": \"179.24.1.0/24\","},{"line_number":60,"context_line":"      \"nexthop\": \"172.24.3.99\" },"},{"line_number":61,"context_line":"    ..."},{"line_number":62,"context_line":"  ]"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_76ea840f","line":59,"range":{"start_line":59,"start_character":6,"end_line":59,"end_character":36},"in_reply_to":"ffb9cba7_971df2be","updated":"2019-04-29 21:33:01.000000000","message":"Unless somebody comes up with a use case I\u0027m gonna treat this as YAGNI.","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e89284d1e2d8aef985c624d635a94037142aed93","unresolved":false,"context_lines":[{"line_number":82,"context_line":"* Tempest test in neutron-tempest-plugin."},{"line_number":83,"context_line":"* Adapt openstackclient."},{"line_number":84,"context_line":"* I also hope to improve Heat\u0027s OS::Neutron::Extraroute resource building"},{"line_number":85,"context_line":"  on this work, but that will be described in its own Heat blueprint."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"Deprecations"},{"line_number":88,"context_line":"~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_cee5e50a","line":85,"updated":"2019-04-29 00:14:51.000000000","message":"I\u0027m not sure if this last point is related to Neutron specs at all :)","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e89284d1e2d8aef985c624d635a94037142aed93","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Alternatives"},{"line_number":103,"context_line":"~~~~~~~~~~~~"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Compare and Swap"},{"line_number":106,"context_line":"++++++++++++++++"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"Neutron has `compare-and-swap API update logic"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_6eee39ee","line":105,"updated":"2019-04-29 00:14:51.000000000","message":"Maybe You can somehow underline that \"Compare and Swap\" and \"First Class Resource\" are different alternatives. Something like \"sub titles\" or points maybe, what do You think?","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6021e13bc1741553bac62b358550de32ce61f59e","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Alternatives"},{"line_number":103,"context_line":"~~~~~~~~~~~~"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Compare and Swap"},{"line_number":106,"context_line":"++++++++++++++++"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"Neutron has `compare-and-swap API update logic"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_766124a9","line":105,"in_reply_to":"ffb9cba7_6eee39ee","updated":"2019-04-29 21:33:01.000000000","message":"My RST formatting skills are quite limited :-) but I added a note in plain English to make this clear.","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e89284d1e2d8aef985c624d635a94037142aed93","unresolved":false,"context_lines":[{"line_number":110,"context_line":"to solve this problem is awkward on the client side (retry until success"},{"line_number":111,"context_line":"if the routes attibute change while the client edited it). Plus as the"},{"line_number":112,"context_line":"number of racing clients grow use of the compare-and-swap API is going"},{"line_number":113,"context_line":"to generate unnecessary load on API as update requests must be thrown"},{"line_number":114,"context_line":"away and retried."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"First Class Resource"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_8eeb6dda","line":113,"updated":"2019-04-29 00:14:51.000000000","message":"I definitelly think that this wouldn\u0027t be good idea :)","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6021e13bc1741553bac62b358550de32ce61f59e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"to solve this problem is awkward on the client side (retry until success"},{"line_number":111,"context_line":"if the routes attibute change while the client edited it). Plus as the"},{"line_number":112,"context_line":"number of racing clients grow use of the compare-and-swap API is going"},{"line_number":113,"context_line":"to generate unnecessary load on API as update requests must be thrown"},{"line_number":114,"context_line":"away and retried."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"First Class Resource"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_966618c1","line":113,"in_reply_to":"ffb9cba7_8eeb6dda","updated":"2019-04-29 21:33:01.000000000","message":"ack","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e89284d1e2d8aef985c624d635a94037142aed93","unresolved":false,"context_lines":[{"line_number":123,"context_line":"  POST /v2.0/extraroutes"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"  { \"extraroute\":"},{"line_number":126,"context_line":"    { \"destination\": \"179.24.1.0/24\","},{"line_number":127,"context_line":"      \"nexthop\": \"172.24.3.99\","},{"line_number":128,"context_line":"      \"router_id\": \"c56ae8f4-674f-11e9-ac88-bb91270af224\" },"},{"line_number":129,"context_line":"  }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_2ebe01d5","line":126,"updated":"2019-04-29 00:14:51.000000000","message":"I think that first proposes solution is more consistent with how router interfaces are added/deleted.","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6021e13bc1741553bac62b358550de32ce61f59e","unresolved":false,"context_lines":[{"line_number":123,"context_line":"  POST /v2.0/extraroutes"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"  { \"extraroute\":"},{"line_number":126,"context_line":"    { \"destination\": \"179.24.1.0/24\","},{"line_number":127,"context_line":"      \"nexthop\": \"172.24.3.99\","},{"line_number":128,"context_line":"      \"router_id\": \"c56ae8f4-674f-11e9-ac88-bb91270af224\" },"},{"line_number":129,"context_line":"  }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ffb9cba7_36572ccd","line":126,"in_reply_to":"ffb9cba7_2ebe01d5","updated":"2019-04-29 21:33:01.000000000","message":"ack","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"a351e5b32ad78607a801f462ce0a89b3c2836de6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ffb9cba7_577d3ae5","line":145,"updated":"2019-04-25 14:24:03.000000000","message":"I\u0027ll add the link to the Heat blueprint when I manage to open it.","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"6021e13bc1741553bac62b358550de32ce61f59e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ffb9cba7_565c20ec","line":145,"in_reply_to":"ffb9cba7_577d3ae5","updated":"2019-04-29 21:33:01.000000000","message":"Done","commit_id":"4150cd01c676eba3decc8c6dd569eb70548e2dcd"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"858d064b90094073b4ada873541972124a3b1b0f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"Proposed Change"},{"line_number":38,"context_line":"---------------"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":41,"context_line":"a second API. While keeping the original functionality and extraroute"},{"line_number":42,"context_line":"API for backwards compatibility."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_98f2619a","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":8},"updated":"2019-05-02 20:53:42.000000000","message":"Could you add an URL to a bug RFE somewhere?","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0e10199c15f3bb81cabc571447aadc1cbaf454ec","unresolved":false,"context_lines":[{"line_number":37,"context_line":"Proposed Change"},{"line_number":38,"context_line":"---------------"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":41,"context_line":"a second API. While keeping the original functionality and extraroute"},{"line_number":42,"context_line":"API for backwards compatibility."},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_97cb071d","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":8},"in_reply_to":"dfbec78f_98f2619a","updated":"2019-05-03 15:07:22.000000000","message":"Added it at the top too.","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"858d064b90094073b4ada873541972124a3b1b0f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"* Documentation: api-ref."},{"line_number":87,"context_line":"* Unit tests."},{"line_number":88,"context_line":"* Tempest test in neutron-tempest-plugin."},{"line_number":89,"context_line":"* Adapt openstackclient."},{"line_number":90,"context_line":"* I also hope to improve Heat\u0027s OS::Neutron::Extraroute resource building"},{"line_number":91,"context_line":"  on this work, but that will be described in its own Heat blueprint."},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_b82ac58d","line":89,"updated":"2019-05-02 20:53:42.000000000","message":"heat uses the neutronclient python binding, so python-neutronclient needs to be changed too (in addition to openstacksdk and OSC)","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0e10199c15f3bb81cabc571447aadc1cbaf454ec","unresolved":false,"context_lines":[{"line_number":86,"context_line":"* Documentation: api-ref."},{"line_number":87,"context_line":"* Unit tests."},{"line_number":88,"context_line":"* Tempest test in neutron-tempest-plugin."},{"line_number":89,"context_line":"* Adapt openstackclient."},{"line_number":90,"context_line":"* I also hope to improve Heat\u0027s OS::Neutron::Extraroute resource building"},{"line_number":91,"context_line":"  on this work, but that will be described in its own Heat blueprint."},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_17d717c2","line":89,"in_reply_to":"dfbec78f_b82ac58d","updated":"2019-05-03 15:07:22.000000000","message":"Done","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"858d064b90094073b4ada873541972124a3b1b0f","unresolved":false,"context_lines":[{"line_number":143,"context_line":"of extra routes in the scope of a single router. For example auto-deleting"},{"line_number":144,"context_line":"all extraroutes when a router is deleted seems a convenient user interface"},{"line_number":145,"context_line":"to me. Or I don\u0027t see a use case to list all extraroutes independently"},{"line_number":146,"context_line":"of routers."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"References"},{"line_number":149,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_a376163e","line":146,"updated":"2019-05-02 20:53:42.000000000","message":"I agree this. The extra routes is specific to a single router, so I don\u0027t see a good reason to make it a top-level resource.","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0e10199c15f3bb81cabc571447aadc1cbaf454ec","unresolved":false,"context_lines":[{"line_number":143,"context_line":"of extra routes in the scope of a single router. For example auto-deleting"},{"line_number":144,"context_line":"all extraroutes when a router is deleted seems a convenient user interface"},{"line_number":145,"context_line":"to me. Or I don\u0027t see a use case to list all extraroutes independently"},{"line_number":146,"context_line":"of routers."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"References"},{"line_number":149,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_b7e3aba4","line":146,"in_reply_to":"dfbec78f_a376163e","updated":"2019-05-03 15:07:22.000000000","message":"ack","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"858d064b90094073b4ada873541972124a3b1b0f","unresolved":false,"context_lines":[{"line_number":151,"context_line":"* RFE bug report of this spec: https://bugs.launchpad.net/neutron/+bug/1826396"},{"line_number":152,"context_line":"* Heat story to consume the API proposed here: https://storyboard.openstack.org/#!/story/2005522"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"extraroute-concurrent.yaml"},{"line_number":155,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_639a5ec6","line":154,"updated":"2019-05-02 20:53:42.000000000","message":"do we need to have this in the spec document?","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0e10199c15f3bb81cabc571447aadc1cbaf454ec","unresolved":false,"context_lines":[{"line_number":151,"context_line":"* RFE bug report of this spec: https://bugs.launchpad.net/neutron/+bug/1826396"},{"line_number":152,"context_line":"* Heat story to consume the API proposed here: https://storyboard.openstack.org/#!/story/2005522"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"extraroute-concurrent.yaml"},{"line_number":155,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_f702833e","line":154,"in_reply_to":"dfbec78f_639a5ec6","updated":"2019-05-03 15:07:22.000000000","message":"Originally I put this in a paste and linked to it. Then Slawek asked to inline it. I can live with both.","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"2ab4cd4f90ca0b09fa658c11ee980d798f2b51e1","unresolved":false,"context_lines":[{"line_number":151,"context_line":"* RFE bug report of this spec: https://bugs.launchpad.net/neutron/+bug/1826396"},{"line_number":152,"context_line":"* Heat story to consume the API proposed here: https://storyboard.openstack.org/#!/story/2005522"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"extraroute-concurrent.yaml"},{"line_number":155,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"dfbec78f_f755a21e","line":154,"in_reply_to":"dfbec78f_f702833e","updated":"2019-05-03 15:56:29.000000000","message":"Thanks for sharing the context. I am okay to have it now. \nWe can update an example.","commit_id":"9e96e26c3697f6d5ce106af1780b5e5c3c0f491a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":36,"context_line":"  $ openstack stack resource list stack0 --filter name\u003drouter0 -f value -c physical_resource_id \\"},{"line_number":37,"context_line":"    | xargs -r openstack router show -f value -c routes"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"The second problem is (the extra routes not having IDs) the ownership of"},{"line_number":40,"context_line":"extra routes cannot be expressed and multiple needs for the same extra"},{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_5d94b244","line":39,"updated":"2019-05-06 09:40:08.000000000","message":"I would write something like \"The second problem is that the ownership of extra routes cannot be expresses because they don\u0027t have uniq IDs.\"","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":36,"context_line":"  $ openstack stack resource list stack0 --filter name\u003drouter0 -f value -c physical_resource_id \\"},{"line_number":37,"context_line":"    | xargs -r openstack router show -f value -c routes"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"The second problem is (the extra routes not having IDs) the ownership of"},{"line_number":40,"context_line":"extra routes cannot be expressed and multiple needs for the same extra"},{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_e690f24c","line":39,"in_reply_to":"dfbec78f_5d94b244","updated":"2019-05-14 13:15:27.000000000","message":"Done","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":39,"context_line":"The second problem is (the extra routes not having IDs) the ownership of"},{"line_number":40,"context_line":"extra routes cannot be expressed and multiple needs for the same extra"},{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_7d917652","line":42,"updated":"2019-05-06 09:40:08.000000000","message":"or any other user of Neutron\u0027s API","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":39,"context_line":"The second problem is (the extra routes not having IDs) the ownership of"},{"line_number":40,"context_line":"extra routes cannot be expressed and multiple needs for the same extra"},{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_667c021f","line":42,"in_reply_to":"dfbec78f_7d917652","updated":"2019-05-14 13:15:27.000000000","message":"Done","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":47,"context_line":"---------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":50,"context_line":"a second API."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Introduce a new API extension: extraroutes-firstclass"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_1d9e3a63","line":50,"updated":"2019-05-06 09:40:08.000000000","message":"maybe I\u0027m missing something but what is \"second API\" here?","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":47,"context_line":"---------------"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":50,"context_line":"a second API."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Introduce a new API extension: extraroutes-firstclass"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_66cac24e","line":50,"in_reply_to":"dfbec78f_1d9e3a63","updated":"2019-05-14 13:15:27.000000000","message":"Rephrased, let me know if it\u0027s clearer.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":49,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":50,"context_line":"a second API."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Introduce a new API extension: extraroutes-firstclass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"::"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_3d9bfe72","line":52,"updated":"2019-05-06 09:40:08.000000000","message":"according to our discussion on PTG and proposal from Akihiro, it maybe not be new extension :)","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":49,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":50,"context_line":"a second API."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Introduce a new API extension: extraroutes-firstclass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"::"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_46d21e02","line":52,"in_reply_to":"dfbec78f_3d9bfe72","updated":"2019-05-14 13:15:27.000000000","message":"Let\u0027s not make two specs tangled. Until that spec is merged I\u0027ll keep this. :-)\n\nAlso in the light of the next comment \u0027-firstclass\u0027 is not a good name anymore. I\u0027ll make up a good name after we finalize the API part of the proposal.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"::"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"  POST /v2.0/extraroutes"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"  { \"extraroute\" :"},{"line_number":59,"context_line":"    { \"destination\": \"179.24.1.0/24\","}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_dd898226","line":56,"updated":"2019-05-06 09:40:08.000000000","message":"maybe \"route\" would be better if that has to be first class object? What do You think?\nand one more question here is: has it really be first class object? Why not do something like /v2.0/router/\u003crouter_id\u003e/extraroutes but add uuid to extraroute? I think that it works exactly in this way for e.g. security groups and security group rules or qos policy and qos policy rules","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"::"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"  POST /v2.0/extraroutes"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"  { \"extraroute\" :"},{"line_number":59,"context_line":"    { \"destination\": \"179.24.1.0/24\","}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_c6bfee5e","line":56,"in_reply_to":"dfbec78f_dd898226","updated":"2019-05-14 13:15:27.000000000","message":"I changed the API to the second-class syntax.\n\nI did not find the security group/rule API working this way. But the qos policy rules have something very similar.\n\nOn the other hand I\u0027d like to keep the \u0027extra\u0027 in the name, because there is a set of routes implicitly managed (routes belonging to the router interfaces and the default route). I think it makes sense that here you can only manage the \u0027extra\u0027 routes beyond those implicitly managed.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"057b10ee95af7ec7818d539a4192e369d889b7a4","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"  GET /v2.0/extraroutes"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  { \"extraroutes\" : ["},{"line_number":68,"context_line":"    { \"id\": \"55be7dac-6e90-11e9-8ab5-9fb288883b38\","}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_45bce604","line":65,"updated":"2019-05-04 19:31:40.000000000","message":"And I guess standardattributes should apply to all top level resources.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"  GET /v2.0/extraroutes"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  { \"extraroutes\" : ["},{"line_number":68,"context_line":"    { \"id\": \"55be7dac-6e90-11e9-8ab5-9fb288883b38\","}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_66b0828b","line":65,"in_reply_to":"dfbec78f_45bce604","updated":"2019-05-14 13:15:27.000000000","message":"If extraroutes are second-class we may not want standardattributes.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"057b10ee95af7ec7818d539a4192e369d889b7a4","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"::"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  DELETE /v2.0/extraroutes/55be7dac-6e90-11e9-8ab5-9fb288883b38"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Creating or deleting multiple extra routes in a single API call is not"},{"line_number":98,"context_line":"supported."}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_e5d15a59","line":95,"updated":"2019-05-04 19:31:40.000000000","message":"Do we need delete by destination/nexthop in the API? In the CLI I think yes, but probably not direclty in the API.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"::"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"  DELETE /v2.0/extraroutes/55be7dac-6e90-11e9-8ab5-9fb288883b38"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Creating or deleting multiple extra routes in a single API call is not"},{"line_number":98,"context_line":"supported."}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_c64dae9a","line":95,"in_reply_to":"dfbec78f_e5d15a59","updated":"2019-05-14 13:15:27.000000000","message":"Assuming the simpler until somebody proves me wrong.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":103,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":104,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":105,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_fd8ec62c","line":106,"updated":"2019-05-06 09:40:08.000000000","message":"Now when I\u0027m thinking about it more, it looks for me that potentially this is very similar problem like for security group rules or qos rules - in all those cases same thing may happend. Only reason between those resources and extraroutes is fact that in this case this is indepotent so attempt to try already existing route will not raise error and in case os SG rules or QoS rules it will raise exception.\nI\u0027m not API expert but shouldn\u0027t we maybe be consistent across API resources?","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"9bcfea203e5e747fee2af73e8480965c029de4a1","unresolved":false,"context_lines":[{"line_number":103,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":104,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":105,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bfb3d3c7_a96cfdcd","line":106,"in_reply_to":"bfb3d3c7_b30fb835","updated":"2019-05-29 14:28:10.000000000","message":"Keeping to your assumed example: In the contrary situation if one of those tenants removes the extra route the other tenant\u0027s app breaks. Which one is better: confusion or breakage?\n\nI\u0027m not sure about the level of confusion - especially if it\u0027s documented behavior. Another example: a file in a unix file system is not deleted until all of its hard links are deleted. Is that confusing? I think it depends. It\u0027s not confusing to people familiar with unix file systems and refcounting.\n\nI\u0027m not sure if \u0027confusing\u0027 is the right term in this argument, because I find confusion highly subjective and dependent on previous expectations. We can manage those expectations by documentation. But I fully acknowledge there is a difference in complexity between the two virtual router abstractions we are discussing here. However I don\u0027t think additional complexity necessarily leads to confusion.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"1f12e5998a312b248b8a4cd7e8909e53fa3b3c02","unresolved":false,"context_lines":[{"line_number":103,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":104,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":105,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_59528115","line":106,"in_reply_to":"dfbec78f_53a022f5","updated":"2019-05-06 15:41:57.000000000","message":"Both Security Group Rules and QOS Policy Rules have UUIDs.\n\nI guess you could reject duplicates, but why? How would that help users, as opposed to making them jump through hoops for no particular reason?\n\nIf there\u0027s a difference it\u0027s probably that Routers are probably more likely to be shared between two different application definitions than a Security Group or QoS Policy is.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a1059461ac2e348fd2b6840203b65ba1123184ea","unresolved":false,"context_lines":[{"line_number":103,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":104,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":105,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_758f41cc","line":106,"in_reply_to":"dfbec78f_59528115","updated":"2019-05-07 07:43:04.000000000","message":"Just for reference the original comment from Zane on the heat spec: https://review.opendev.org/#/c/655892/5/specs/train/atomic-extraroute.rst@30","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a0cfcc0353ad8fd65a2f86fefacd8cf68c0a5b04","unresolved":false,"context_lines":[{"line_number":103,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":104,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":105,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bfb3d3c7_b30fb835","line":106,"in_reply_to":"dfbec78f_69205349","updated":"2019-05-25 14:30:45.000000000","message":"So lets assume that there are 2 tenants which share one router. Each of them configured same extra route (both have different uuid and are \"squashed\" into one entry by L3 agent\u0027s implementation).\nNow one of those tenants removes extra route but it still works - wouldn\u0027t this be confusing for this tenant?","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":103,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":104,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":105,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_69205349","line":106,"in_reply_to":"dfbec78f_758f41cc","updated":"2019-05-14 13:15:27.000000000","message":"I spent quite some time grasping the possible use case for tracking multiple needs(/owners) for the same extra route.\n\nPlease keep in mind this is still purely theoretical. I have zero information if people do this in the wild or not.\n\n(Assuming but not allowing yet) Alternatively to what\u0027s proposed here we could solve the problem of multiple needs by forcing the stacks to each create their own virtual routers / security groups / qos policies. If each has their own then the extra routes / security group rules / qos policy rules cannot conflict. Problem is solved, right? Not exactly.\n\nIf two stacks can share a virtual router they are one hop away from each other. And they are unconditionally connected on l3.\n\nIf we force each stack to create its own virtual router, then two stacks are at least 3 hops away (virtual router A - external router - virtual router B) and their connectivity depends on the existence/configuration of an external router.\n\nTherefore I think it\u0027s a theorertically valid use case for two stacks to share a single virtual router. That plus allowing the stacks\u0027 need for extra routes validates the use case of tracking multiple needs(/owners) for extra routes.\n\nNow on to the comparison of routers with security groups and qos policies. As we have seen sharing the same virtual router between two stacks can have physical consequences. But sharing the same security group / qos policy should not. That\u0027s because security groups and qos policies work on the port level. And unlike sharing virtual routers it does not make sense to share ports between two stacks.\n\n(In a sense I think this is just a more elaborate way of saying \"Routers are probably more likely to be shared between two different application definitions than a Security Group or QoS Policy\").\n\nAlltogether it seems to me that forcing the same API behavior on these would be misleading because these things actually do not behave the same way.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"bc99ba7c9fca0c43dfbc7104f9e9474699f4247b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":104,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":105,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_53a022f5","line":106,"in_reply_to":"dfbec78f_fd8ec62c","updated":"2019-05-06 13:23:41.000000000","message":"Slawek: Bence is on holiday, but after discussion with Akihiro we decided to go to the weekly heat meeting (next week perhaps) or call for a separated meeting with heat team to understand exactly their usecase for asking this.\nMe or Bence come back with details if we know more.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"057b10ee95af7ec7818d539a4192e369d889b7a4","unresolved":false,"context_lines":[{"line_number":106,"context_line":"the backend routing tables."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":109,"context_line":"Updates made on the legacy API should be reflected in the first class extra"},{"line_number":110,"context_line":"route objects too based on a best guess about the client\u0027s intention."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Deleting a router cascades to deleting all extra routes of that router."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_c5d0d653","line":110,"range":{"start_line":109,"start_character":0,"end_line":110,"end_character":69},"updated":"2019-05-04 19:31:40.000000000","message":"My life would be easier though if we could deprecate the old API. Or at least if we could turn it read-only.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":127,"context_line":"The routerroutes table needs to be extended with column \u0027id\u0027."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"The uniqueness constraint needs to be relaxed from unique(destination,"},{"line_number":130,"context_line":"nexthop, router_id) to unique(id, destination, nexthop, router_id)."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"The RouterRoutes OVO object needs to be extended with attribute \u0027id\u0027."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_9d830a05","line":130,"updated":"2019-05-06 09:40:08.000000000","message":"in this case I don\u0027t think we need such unique constraint. UUID is expected to be unique and that will be enough :)","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":127,"context_line":"The routerroutes table needs to be extended with column \u0027id\u0027."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"The uniqueness constraint needs to be relaxed from unique(destination,"},{"line_number":130,"context_line":"nexthop, router_id) to unique(id, destination, nexthop, router_id)."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"The RouterRoutes OVO object needs to be extended with attribute \u0027id\u0027."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_e9c20359","line":130,"in_reply_to":"dfbec78f_9d830a05","updated":"2019-05-14 13:15:27.000000000","message":"ack","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9bcb8d30cad9a720b6077607f98fd07950a23282","unresolved":false,"context_lines":[{"line_number":137,"context_line":"* Unit tests."},{"line_number":138,"context_line":"* Tempest test in neutron-tempest-plugin."},{"line_number":139,"context_line":"* Adapt python-neutronclient."},{"line_number":140,"context_line":"* Adapt openstackclient."},{"line_number":141,"context_line":"* I also hope to improve Heat\u0027s OS::Neutron::Extraroute resource building"},{"line_number":142,"context_line":"  on this work, but that will be described in its own Heat blueprint."},{"line_number":143,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_bd884e1f","line":140,"updated":"2019-05-06 09:40:08.000000000","message":"also openstack SDK should be updated","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":137,"context_line":"* Unit tests."},{"line_number":138,"context_line":"* Tempest test in neutron-tempest-plugin."},{"line_number":139,"context_line":"* Adapt python-neutronclient."},{"line_number":140,"context_line":"* Adapt openstackclient."},{"line_number":141,"context_line":"* I also hope to improve Heat\u0027s OS::Neutron::Extraroute resource building"},{"line_number":142,"context_line":"  on this work, but that will be described in its own Heat blueprint."},{"line_number":143,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_49d1cf22","line":140,"in_reply_to":"dfbec78f_bd884e1f","updated":"2019-05-14 13:15:27.000000000","message":"Done","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"1f12e5998a312b248b8a4cd7e8909e53fa3b3c02","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"Keeping in line with the long standing Neutron tradition of not making"},{"line_number":148,"context_line":"backward incompatible API changes the old extraroutes extension is"},{"line_number":149,"context_line":"*not* deprecated."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Other Impact"},{"line_number":152,"context_line":"~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_9947994c","line":149,"updated":"2019-05-06 15:41:57.000000000","message":"Deprecated and removed are different things. Why not deprecate the old and clearly broken existing API?","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"Keeping in line with the long standing Neutron tradition of not making"},{"line_number":148,"context_line":"backward incompatible API changes the old extraroutes extension is"},{"line_number":149,"context_line":"*not* deprecated."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Other Impact"},{"line_number":152,"context_line":"~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_a9864b12","line":149,"in_reply_to":"dfbec78f_9947994c","updated":"2019-05-14 13:15:27.000000000","message":"If the Neutron community is okay with having an extension forever deprecated (but not removed) then I\u0027m happy to deprecate it.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"1f12e5998a312b248b8a4cd7e8909e53fa3b3c02","unresolved":false,"context_lines":[{"line_number":167,"context_line":"if the routes attibute change while the client edited it). Plus as the"},{"line_number":168,"context_line":"number of racing clients grow use of the compare-and-swap API is going"},{"line_number":169,"context_line":"to generate unnecessary load on API as update requests must be thrown"},{"line_number":170,"context_line":"away and retried."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"API Submethods"},{"line_number":173,"context_line":"++++++++++++++"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_399b0dca","line":170,"updated":"2019-05-06 15:41:57.000000000","message":"Additionally, not even the python client supports this automagically, and support would need to be added to every possible client to guarantee it to work properly.","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":167,"context_line":"if the routes attibute change while the client edited it). Plus as the"},{"line_number":168,"context_line":"number of racing clients grow use of the compare-and-swap API is going"},{"line_number":169,"context_line":"to generate unnecessary load on API as update requests must be thrown"},{"line_number":170,"context_line":"away and retried."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"API Submethods"},{"line_number":173,"context_line":"++++++++++++++"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_c9905f46","line":170,"in_reply_to":"dfbec78f_399b0dca","updated":"2019-05-14 13:15:27.000000000","message":"ack","commit_id":"e31de2d7a2d1694e3bde1bdf99d39c6a65c72345"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"98ce30b35f85a126230c2b274e5cabdb70b4b797","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"This problem can be easily (but nondeterministically) reproduced by a"},{"line_number":30,"context_line":"`simple HOT template as included in the References section below"},{"line_number":31,"context_line":"\u003c#extraroute-concurrent-yaml\u003e`_."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"::"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_f076a4a4","line":31,"updated":"2019-05-10 05:59:52.000000000","message":"I agree this problem description. We should provide a way to manipulate route entries per entry basis.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"This problem can be easily (but nondeterministically) reproduced by a"},{"line_number":30,"context_line":"`simple HOT template as included in the References section below"},{"line_number":31,"context_line":"\u003c#extraroute-concurrent-yaml\u003e`_."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"::"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_e9cd2331","line":31,"in_reply_to":"dfbec78f_f076a4a4","updated":"2019-05-14 13:15:27.000000000","message":"ack","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"98ce30b35f85a126230c2b274e5cabdb70b4b797","unresolved":false,"context_lines":[{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Change"},{"line_number":47,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_d05a8028","line":44,"range":{"start_line":44,"start_character":7,"end_line":44,"end_character":70},"updated":"2019-05-10 05:59:52.000000000","message":"I have a concern on this.\n\nIn a usual network abstraction, a router cannot have multiple route entries with same combination of (destination, nexthop).\n(destination, nexthop) is unique in general.\n\nIf we go to the route to allow multiple same extra routes, the router abstraction of the neutron API would no longer follow the usual router abstraction in the network world.\n\nThus, I am against this problem description.\n\nIt seems it comes from heat implementation.\nWhat we need to do is to ensure some some route is populated. IMHO, If multiple heat stacks populate same route on a router, such population should be maintained by heat. I don\u0027t think it is a good idea to change the common network modeling by heat implementation need.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"9bcfea203e5e747fee2af73e8480965c029de4a1","unresolved":false,"context_lines":[{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Change"},{"line_number":47,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfb3d3c7_09ce69b3","line":44,"range":{"start_line":44,"start_character":7,"end_line":44,"end_character":70},"in_reply_to":"bfb3d3c7_a993d25a","updated":"2019-05-29 14:28:10.000000000","message":"I also think I tried to argue that security groups/rules and qos policies/rules do not behave the same way as routers/extra routes despite the seemingly similar APIs. I\u0027m happy to reconsider if that argument is not valid. Please show me if it\u0027s not.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7e96de2f4d34c3b3c5bbefcb370213d476cb5be9","unresolved":false,"context_lines":[{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Change"},{"line_number":47,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfb3d3c7_ed647d24","line":44,"range":{"start_line":44,"start_character":7,"end_line":44,"end_character":70},"in_reply_to":"bfb3d3c7_ba4cb69e","updated":"2019-05-24 13:46:30.000000000","message":"I understand Your points here. I looked on existing neutron APIs, like security groups and security group rules or qos policies and qos rules. In both cases relatations are very similar IMHO. And in those cases neutron simply don\u0027t allow to create duplicate entries - if You will try to create same SG rule as already existing one, or same QoS rule as existing one in policy, Neutron will return Duplicate Entry error.\nSo why we want to do it differently here? Shouldn\u0027t we be consistent for all neutron resources?","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"54f183355e9975d39a030293a92711cd60973ccb","unresolved":false,"context_lines":[{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Change"},{"line_number":47,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfb3d3c7_a993d25a","line":44,"range":{"start_line":44,"start_character":7,"end_line":44,"end_character":70},"in_reply_to":"bfb3d3c7_ed647d24","updated":"2019-05-24 19:49:32.000000000","message":"I don\u0027t really have much to add over the previous discussion of that topic:\n\nhttps://review.opendev.org/#/c/655680/5/specs/train/atomic-extraroute-api.rst@106","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"a325ef9b587e0b82f9f1d4a4be6a9f64a47fed7e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Change"},{"line_number":47,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfb3d3c7_ba4cb69e","line":44,"range":{"start_line":44,"start_character":7,"end_line":44,"end_character":70},"in_reply_to":"dfbec78f_6c114152","updated":"2019-05-21 20:54:58.000000000","message":"I agree with Bence. It\u0027s not a Heat problem, it\u0027s a client problem. Like the race condition problem, there\u0027s only one place it can be fixed for all clients and that\u0027s in the service itself.\n\n\u003e In a usual network abstraction, a router cannot have multiple route entries with same combination of (destination, nexthop).\n\nThis is just not true.\n\nIn the forwarding table (or in hardware in a L3 switch) a destination/nexthop combination is unique. But that\u0027s hardly what I would call an abstraction.\n\nThe forwarding table is built from a RIB that aggregates routes from multiple sources (e.g. static routes, OSPF, IS-IS, RIP, \u0026c.), and it absolutely keeps a reference of where they came from when they share the same nexthop. If e.g. RIP stops advertising a route then you would never want that to cause an identical static route to be removed from the RIB.\n\nFinally, it\u0027s important to note that what we\u0027re building is an API for cloud applications, and the test for success is whether it works well for them. If it works badly in practice when used by real cloud applications then it\u0027s a bad API, and being consistent with how network abstractions have traditionally been built is of no comfort - though as I\u0027ve mentioned requiring uniqueness is in no way consistent with how network abstractions have traditionally been built IMHO.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":41,"context_line":"route cannot be tracked. For example consider two Heat stacks (or any"},{"line_number":42,"context_line":"other API user of Neutron) needing and therefore creating the same extra"},{"line_number":43,"context_line":"route. When one of them is deleted the extra route gets deleted for both"},{"line_number":44,"context_line":"unless we have a way to track multiple needs for the same extra route."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Change"},{"line_number":47,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_6c114152","line":44,"range":{"start_line":44,"start_character":7,"end_line":44,"end_character":70},"in_reply_to":"dfbec78f_d05a8028","updated":"2019-05-14 13:15:27.000000000","message":"I suggest to separete objections to the problem description and objections to the proposed solution.\n\nAs far as I can tell the problem is not Heat specific. It applies to all programmatic users of the Neutron API. Even to multiple clients. Let\u0027s say Heat and another programmatic client needs the same extra routes. Heat clearly cannot solve that.\n\nI see three choices:\n\n1) Neutron solves the coordination between multiple programmatic clients\n2) a 3rd (not yet existing) global component solves the coordination between multiple programmatic clients\n3) we ignore the problem of multiple programmatic clients\n\nI think Heat folks raised a valid problem Neutron did not care about so far so I\u0027d like to avoid (3).\n\nI find (2) unrealistic to ever happen, therefore my original proposal was (1). I still don\u0027t see a better solution.\n\nOn the other hand I agree that this routing table abstraction is more complex than the original abstraction we had. I think that is because it solves a porblem that\u0027s more complex than the original. Instead of representing a routing table our new abstraction needs to represent a routing table that can be edited concurrently by uncoordinated clients without conflicts.\n\nI don\u0027t think we can eliminate the complexity. At best we can push it around. I think pushing it to Heat would be the wrong choice from an overall OpenStack perspective.\n\nThe real question in my mind is: Do we want to support uncoordinated clients at the price of the more complex abstraction (and therefore likely some user confusion and extra documentation)?\n\nI would be happy to hear other opinions on this question too.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"98ce30b35f85a126230c2b274e5cabdb70b4b797","unresolved":false,"context_lines":[{"line_number":49,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":50,"context_line":"a second API."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Introduce a new API extension: extraroutes-firstclass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"::"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_b0090c2d","line":52,"range":{"start_line":52,"start_character":31,"end_line":52,"end_character":53},"updated":"2019-05-10 05:59:52.000000000","message":"I don\u0027t mind the name of the extension. It can be determined after all consensus has been made.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":49,"context_line":"This RFE proposes to expose the extraroute functionality of Neutron on"},{"line_number":50,"context_line":"a second API."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Introduce a new API extension: extraroutes-firstclass"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"::"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_0c1a056e","line":52,"range":{"start_line":52,"start_character":31,"end_line":52,"end_character":53},"in_reply_to":"dfbec78f_b0090c2d","updated":"2019-05-14 13:15:27.000000000","message":"Ack. Let\u0027s find a good name after we settle everything else.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"98ce30b35f85a126230c2b274e5cabdb70b4b797","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  { \"extraroute\" :"},{"line_number":59,"context_line":"    { \"destination\": \"179.24.1.0/24\","},{"line_number":60,"context_line":"      \"nexthop\": \"172.24.3.99\","},{"line_number":61,"context_line":"      \"router_id\": \"b10561c8-6e8e-11e9-92ce-a759f702e9aa\" }}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"::"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_d0a840dc","line":61,"updated":"2019-05-10 05:59:52.000000000","message":"Ownership of an extraroute is detemined by router_id, so I don\u0027t see any good reason to have \"extraroutes\" as the top level resource.\n\nEven if we have \"extraroutes\" as a subresource of a router ( /routers/{id}/extraroutes ), the same thing can be achieved.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  { \"extraroute\" :"},{"line_number":59,"context_line":"    { \"destination\": \"179.24.1.0/24\","},{"line_number":60,"context_line":"      \"nexthop\": \"172.24.3.99\","},{"line_number":61,"context_line":"      \"router_id\": \"b10561c8-6e8e-11e9-92ce-a759f702e9aa\" }}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"::"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_2c17c947","line":61,"in_reply_to":"dfbec78f_d0a840dc","updated":"2019-05-14 13:15:27.000000000","message":"Done","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"98ce30b35f85a126230c2b274e5cabdb70b4b797","unresolved":false,"context_lines":[{"line_number":95,"context_line":"  DELETE /v2.0/extraroutes/55be7dac-6e90-11e9-8ab5-9fb288883b38"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Creating or deleting multiple extra routes in a single API call is not"},{"line_number":98,"context_line":"supported."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"Updates to extra routes are not allowed."},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_70415439","line":98,"updated":"2019-05-10 05:59:52.000000000","message":"As I mentioned in L.44, I still believe (destination, nexthop) on a single router should be unique. and it should be a constraint.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":95,"context_line":"  DELETE /v2.0/extraroutes/55be7dac-6e90-11e9-8ab5-9fb288883b38"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Creating or deleting multiple extra routes in a single API call is not"},{"line_number":98,"context_line":"supported."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"Updates to extra routes are not allowed."},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_ac2419b0","line":98,"in_reply_to":"dfbec78f_70415439","updated":"2019-05-14 13:15:27.000000000","message":"I guess you meant this comment for L129?","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"98ce30b35f85a126230c2b274e5cabdb70b4b797","unresolved":false,"context_lines":[{"line_number":127,"context_line":"The routerroutes table needs to be extended with column \u0027id\u0027."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"The uniqueness constraint needs to be relaxed from unique(destination,"},{"line_number":130,"context_line":"nexthop, router_id) to unique(id, destination, nexthop, router_id)."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"The RouterRoutes OVO object needs to be extended with attribute \u0027id\u0027."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_90aac8cf","line":130,"updated":"2019-05-10 05:59:52.000000000","message":"Aa I mentioned in the other comment, this makes the router abstraction in the neutron API level different from common router modeling, so I don\u0027t think it is the right approach (as neutron API perspective). The abstraction of the neutron API should not be affected by implementation specific needs of API consumers.\n\nI would like to hear more opinions from others.","commit_id":"25d64d83308f1923359b99f308398e090426f290"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"fddb3018e51f85efd9b61da89ccaecd8425f37ae","unresolved":false,"context_lines":[{"line_number":127,"context_line":"The routerroutes table needs to be extended with column \u0027id\u0027."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"The uniqueness constraint needs to be relaxed from unique(destination,"},{"line_number":130,"context_line":"nexthop, router_id) to unique(id, destination, nexthop, router_id)."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"The RouterRoutes OVO object needs to be extended with attribute \u0027id\u0027."},{"line_number":133,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfbec78f_8c54b5ff","line":130,"in_reply_to":"dfbec78f_90aac8cf","updated":"2019-05-14 13:15:27.000000000","message":"Please see my answers in L44 and ps5.","commit_id":"25d64d83308f1923359b99f308398e090426f290"}],"specs/train/improve-extraroute-api.rst":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f6afd8bc90c4edb47b810a19cdc54622027117c6","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  GET /v2.0/routers/{router_id}/extraroutes"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"  { \"extraroutes\" : ["},{"line_number":67,"context_line":"    { \"id\": \"55be7dac-6e90-11e9-8ab5-9fb288883b38\","},{"line_number":68,"context_line":"      \"destination\": \"179.24.1.0/24\","},{"line_number":69,"context_line":"      \"nexthop\": \"172.24.3.99\" },"},{"line_number":70,"context_line":"    { \"id\": \"66c1c8de-6e90-11e9-b47a-4b16336c9637\","},{"line_number":71,"context_line":"      \"destination\": \"179.24.1.0/24\","},{"line_number":72,"context_line":"      \"nexthop\": \"172.24.3.99\" },"},{"line_number":73,"context_line":"    { \"id\": \"81c64164-6e90-11e9-9206-5fa176b10068\","},{"line_number":74,"context_line":"      \"destination\": \"179.24.2.0/24\","},{"line_number":75,"context_line":"      \"nexthop\": \"172.24.4.99\" },"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_ad63b441","line":72,"range":{"start_line":66,"start_character":2,"end_line":72,"end_character":32},"updated":"2019-05-28 22:56:27.000000000","message":"I\u0027m a little bothered that I see essentially 2 identical extra routes associated with a router. Something about this feel wrong to me, it\u0027s still not entirely clear to me why we want to allow duplicate nexthop and destinations and what benefits that really provides.","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"9bcfea203e5e747fee2af73e8480965c029de4a1","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  GET /v2.0/routers/{router_id}/extraroutes"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"  { \"extraroutes\" : ["},{"line_number":67,"context_line":"    { \"id\": \"55be7dac-6e90-11e9-8ab5-9fb288883b38\","},{"line_number":68,"context_line":"      \"destination\": \"179.24.1.0/24\","},{"line_number":69,"context_line":"      \"nexthop\": \"172.24.3.99\" },"},{"line_number":70,"context_line":"    { \"id\": \"66c1c8de-6e90-11e9-b47a-4b16336c9637\","},{"line_number":71,"context_line":"      \"destination\": \"179.24.1.0/24\","},{"line_number":72,"context_line":"      \"nexthop\": \"172.24.3.99\" },"},{"line_number":73,"context_line":"    { \"id\": \"81c64164-6e90-11e9-9206-5fa176b10068\","},{"line_number":74,"context_line":"      \"destination\": \"179.24.2.0/24\","},{"line_number":75,"context_line":"      \"nexthop\": \"172.24.4.99\" },"}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_69efe5e8","line":72,"range":{"start_line":66,"start_character":2,"end_line":72,"end_character":32},"in_reply_to":"bfb3d3c7_ad63b441","updated":"2019-05-29 14:28:10.000000000","message":"I tried describing the use case in lines 39 through 44. Clearly I failed in that. Please help me how to describe it better because I can hardly upload an improved proposal based on that \"it feels wrong\".\n\nIs the following any better?\n\nThe second problem is that the ownership of extra routes cannot be expressed because they don\u0027t have unique identifiers. If we allow two apps to share the same virtual router and we allow that these apps may need the same extra route Then these apps need to manage the extra routes of the shared router cooperatively. For example consider the first and second Heat stacks of a scale-out app (or any other user of Neutron\u0027s API) needing and therefore creating the same extra route. When one of them is deleted the extra route gets deleted for both unless we have a way to track  multiple needs for the same extra route.","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f6afd8bc90c4edb47b810a19cdc54622027117c6","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Multiple extra routes having the same destination, nexthop and router_id"},{"line_number":98,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":99,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":100,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":101,"context_line":"the backend routing tables."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_0d43e0b0","line":99,"range":{"start_line":99,"start_character":39,"end_line":99,"end_character":55},"updated":"2019-05-28 22:56:27.000000000","message":"What about overlapping destinations? Are we simply leaving that for longest prefix matching in the forwarding plane to deal with?","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"9bcfea203e5e747fee2af73e8480965c029de4a1","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Multiple extra routes having the same destination, nexthop and router_id"},{"line_number":98,"context_line":"fields *are* allowed. This is to track multiple needs for the same"},{"line_number":99,"context_line":"extra route.  Extra routes sharing the same destination, nexthop and"},{"line_number":100,"context_line":"router_id fields are to be collapsed to a single extra route entry in"},{"line_number":101,"context_line":"the backend routing tables."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_54a714be","line":99,"range":{"start_line":99,"start_character":39,"end_line":99,"end_character":55},"in_reply_to":"bfb3d3c7_0d43e0b0","updated":"2019-05-29 14:28:10.000000000","message":"Whatever behavior we have today for overlapping routes, I think we have to keep that behavior for backward compatibility. This is the first time I ever checked how neutron handles overlapping routes. They are allowed. For example this works:\n\nopenstack router set --route destination\u003d10.0.4.0/24,gateway\u003d10.0.0.11 --route destination\u003d10.0.4.0/25,gateway\u003d10.0.0.12 router1\n\nThere are also some strange corner cases we allow today:\n\nopenstack router set --route destination\u003d10.0.4.0/24,gateway\u003d10.0.0.11 --route destination\u003d10.0.4.0/25,gateway\u003d10.0.0.11 --route destination\u003d10.0.4.128/25,gateway\u003d10.0.0.11 router1","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f6afd8bc90c4edb47b810a19cdc54622027117c6","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":104,"context_line":"Updates made on the legacy API should be reflected in the first class extra"},{"line_number":105,"context_line":"route objects too based on a best guess about the client\u0027s intention."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Deleting a router cascades to deleting all extra routes of that router."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_8d02706e","line":105,"range":{"start_line":105,"start_character":18,"end_line":105,"end_character":68},"updated":"2019-05-28 22:56:27.000000000","message":"This sounds a little dangerous to me. Can we be sure we\u0027re not breaking the API contract really providing backward compatibility?","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"9bcfea203e5e747fee2af73e8480965c029de4a1","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"The legacy exraroutes API is to be kept for backwards compatibility."},{"line_number":104,"context_line":"Updates made on the legacy API should be reflected in the first class extra"},{"line_number":105,"context_line":"route objects too based on a best guess about the client\u0027s intention."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Deleting a router cascades to deleting all extra routes of that router."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_ef5515fb","line":105,"range":{"start_line":105,"start_character":18,"end_line":105,"end_character":68},"in_reply_to":"bfb3d3c7_8d02706e","updated":"2019-05-29 14:28:10.000000000","message":"You\u0027re right it\u0027s actually not trivial what the best guess is. I see two options:\n\na) Any time an update to the routes attribute is made (i.e. we use PUT on the old API) then the whole route set is re-created from scratch without any duplicates.\n\nb) When an update to the routes attribute is made we diff the routes value in the update request to the collapsed version of the current route set. We delete all duplicate entries that were deleted in the diff. But we keep the duplicates not present in the diff.\n\nFor example:\n\ncurrent\nid1 sn1 gw1\nid2 sn1 gw1\nid3 sn2 gw2\nid4 sn2 gw2\n\nupdate\nsn1 gw1\nsn3 gw3\n\na) outcome\nid5 sn1 gw1\nid6 sn3 gw3\n\nb) outcome\nid1 sn1 gw1\nid2 sn1 gw1\nid7 sn3 gw3\n\nb) is better geared towards the concurrent use of the old and new APIs, but I think we should not encourage that mixed use.\n\na) is simpler to implement.","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f6afd8bc90c4edb47b810a19cdc54622027117c6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"The routerroutes table needs to be extended with column \u0027id\u0027."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"The uniqueness constraint needs to be relaxed from unique(destination,"},{"line_number":125,"context_line":"nexthop, router_id) to unique(id)."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"The RouterRoutes OVO object needs to be extended with attribute \u0027id\u0027."},{"line_number":128,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_cd0ce8a6","line":125,"range":{"start_line":125,"start_character":23,"end_line":125,"end_character":33},"updated":"2019-05-28 22:56:27.000000000","message":"Do you mean primary_key(id)?","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"9bcfea203e5e747fee2af73e8480965c029de4a1","unresolved":false,"context_lines":[{"line_number":122,"context_line":"The routerroutes table needs to be extended with column \u0027id\u0027."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"The uniqueness constraint needs to be relaxed from unique(destination,"},{"line_number":125,"context_line":"nexthop, router_id) to unique(id)."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"The RouterRoutes OVO object needs to be extended with attribute \u0027id\u0027."},{"line_number":128,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"bfb3d3c7_6f5365e3","line":125,"range":{"start_line":125,"start_character":23,"end_line":125,"end_character":33},"in_reply_to":"bfb3d3c7_cd0ce8a6","updated":"2019-05-29 14:28:10.000000000","message":"Yes, in fact that would be the primary key of the table, but in this context that does not really matter, that\u0027s why I only wrote about uniqueness.","commit_id":"a51f9f351f5d1ad21c5ca8e453f603a0c77eea49"}]}
