)]}'
{"api-ref/source/v2/routers.inc":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0264fc7c7a177c2723d264e964e2acd5c545fddb","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"The extra route extension (``extraroute``) extends ``router`` resources adding"},{"line_number":23,"context_line":"a ``routes`` attribute that contains an array of route objects. Each route"},{"line_number":24,"context_line":"object has a ``destination`` and ``nexthop`` attribute representing the route."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Extra routes (atomic) extension"},{"line_number":27,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"7faddb67_54452a42","line":24,"updated":"2019-07-29 15:34:17.000000000","message":"I think it is nice to add some description here to mention that you can edit individual routes separately by using actions \"extraroute-atomic\" extension.","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0fd74f03e14aa7e4025f505b6f8d6e829192a034","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"The extra route extension (``extraroute``) extends ``router`` resources adding"},{"line_number":23,"context_line":"a ``routes`` attribute that contains an array of route objects. Each route"},{"line_number":24,"context_line":"object has a ``destination`` and ``nexthop`` attribute representing the route."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Extra routes (atomic) extension"},{"line_number":27,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"7faddb67_39de5bda","line":24,"in_reply_to":"7faddb67_54452a42","updated":"2019-07-30 10:57:35.000000000","message":"Good idea.","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0264fc7c7a177c2723d264e964e2acd5c545fddb","unresolved":false,"context_lines":[{"line_number":636,"context_line":".. rest_parameters:: parameters.yaml"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"   - router_id: router_id"},{"line_number":639,"context_line":"   - routes: router-routes"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"Request Example"},{"line_number":642,"context_line":"---------------"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"7faddb67_146332b3","line":639,"range":{"start_line":639,"start_character":5,"end_line":639,"end_character":11},"updated":"2019-07-29 15:34:17.000000000","message":"There is no \"routes\" attribute in the sample request body.... but.... I have no idea on how to represent a nameless list. AFAIK, this is the first case in the neutron API reference.","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0fd74f03e14aa7e4025f505b6f8d6e829192a034","unresolved":false,"context_lines":[{"line_number":636,"context_line":".. rest_parameters:: parameters.yaml"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"   - router_id: router_id"},{"line_number":639,"context_line":"   - routes: router-routes"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"Request Example"},{"line_number":642,"context_line":"---------------"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"7faddb67_198fdfcd","line":639,"range":{"start_line":639,"start_character":5,"end_line":639,"end_character":11},"in_reply_to":"7faddb67_146332b3","updated":"2019-07-30 10:57:35.000000000","message":"I also noticed this problem and I could not find a better solution. I don\u0027t think we should wrap the whole request in a dict just to make it work for the documentation tool.","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"4b7f139ec15aaedb11a4b3a500b0888611ef5ef3","unresolved":false,"context_lines":[{"line_number":656,"context_line":"Response Example"},{"line_number":657,"context_line":"----------------"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":".. literalinclude:: samples/routers/router-add-extraroutes-response.json"},{"line_number":660,"context_line":"   :language: javascript"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"Remove extra routes from router"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"7faddb67_4356eb08","line":659,"updated":"2019-07-26 12:52:49.000000000","message":"I know you are reusing an existing response, but the tags in the response show up as::\n\n  \"tags\": [\"tag1,tag2\"]\n\n\nShouldn\u0027t that be a proper list of strings like::\n\n  \"tags\": [\"tag1\", \"tag2\"]","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"c8f30b625564ab7e9a88b0a968908ac0fc9c986f","unresolved":false,"context_lines":[{"line_number":656,"context_line":"Response Example"},{"line_number":657,"context_line":"----------------"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":".. literalinclude:: samples/routers/router-add-extraroutes-response.json"},{"line_number":660,"context_line":"   :language: javascript"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"Remove extra routes from router"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"7faddb67_6dfd0239","line":659,"in_reply_to":"7faddb67_4356eb08","updated":"2019-07-29 08:16:12.000000000","message":"I cannot reproduce this.\n\n$ openstack router set router1 --tag foo --tag bar\n$ export TOKEN\u003d\"$( openstack token issue -f value -c id )\"\n$ router\u003d\"$( openstack router show router1 -f value -c id )\"\n$ echo \u0027[{\"destination\": \"10.0.3.0\", \"nexthop\": \"10.0.0.13\"}, {\"destination\": \"10.0.4.0\", \"nexthop\": \"10.0.0.14\"}]\u0027 | curl -s -d @- -H \"Accept: application/json\" -H \"Content-Type: application/json\" -H \"X-Auth-Token: $TOKEN\" -X PUT \"http://127.0.0.1:9696/v2.0/routers/$router/add_extraroutes\" | jq \u0027.tags\u0027 \n[\n  \"bar\",\n  \"foo\"\n]","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"1fbd4e379d231cb19e35b33c271b538c5eddffa7","unresolved":false,"context_lines":[{"line_number":656,"context_line":"Response Example"},{"line_number":657,"context_line":"----------------"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":".. literalinclude:: samples/routers/router-add-extraroutes-response.json"},{"line_number":660,"context_line":"   :language: javascript"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"Remove extra routes from router"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"7faddb67_6071840c","line":659,"in_reply_to":"7faddb67_6dfd0239","updated":"2019-07-29 12:50:15.000000000","message":"I think this is a typo in the existing response json and not related to this patch.\nWe can fix it later.","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"86c84e657ad7ea1b7ff99baa82ad5d481cd26006","unresolved":false,"context_lines":[{"line_number":615,"context_line":""},{"line_number":616,"context_line":"* When (destinationB, nexthopB) is to be added but (destinationB,"},{"line_number":617,"context_line":"  nexthopC) is already present then only (destinationB, nexthopB) is"},{"line_number":618,"context_line":"  added to the result set."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"7faddb67_8466c2ba","line":618,"updated":"2019-08-02 13:10:48.000000000","message":"and (destinationB, nexthopC) is removed in this case?","commit_id":"70122e203fb9579a271a0bc042f492f769dfb380"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a782520cb12b86e5b687535c67153d674d59e42e","unresolved":false,"context_lines":[{"line_number":615,"context_line":""},{"line_number":616,"context_line":"* When (destinationB, nexthopB) is to be added but (destinationB,"},{"line_number":617,"context_line":"  nexthopC) is already present then only (destinationB, nexthopB) is"},{"line_number":618,"context_line":"  added to the result set."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"7faddb67_3b531a6f","line":618,"in_reply_to":"7faddb67_1db8c00e","updated":"2019-08-08 08:53:47.000000000","message":"I think it\u0027s fine, I just wasn\u0027t sure about this removal. Thx for clarify this for me :)","commit_id":"70122e203fb9579a271a0bc042f492f769dfb380"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"f26d18c070191b2672e5473abbcb4b283a97333c","unresolved":false,"context_lines":[{"line_number":615,"context_line":""},{"line_number":616,"context_line":"* When (destinationB, nexthopB) is to be added but (destinationB,"},{"line_number":617,"context_line":"  nexthopC) is already present then only (destinationB, nexthopB) is"},{"line_number":618,"context_line":"  added to the result set."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"7faddb67_1db8c00e","line":618,"in_reply_to":"7faddb67_8466c2ba","updated":"2019-08-06 10:30:35.000000000","message":"Yes (destinationB, nexthopC) is removed. Now I stated the removal explicitly. But let me know if you were asking this question because you thought this is the wrong behavior.","commit_id":"70122e203fb9579a271a0bc042f492f769dfb380"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9c00c503d85f4fa75a7ed99b5916c39531eb9da8","unresolved":false,"context_lines":[{"line_number":615,"context_line":""},{"line_number":616,"context_line":"* When (destinationB, nexthopB) is to be added but (destinationB,"},{"line_number":617,"context_line":"  nexthopC) is already present then only (destinationB, nexthopB) is"},{"line_number":618,"context_line":"  added to the result set and (destinationB, nexthopC) is removed."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_bb870a13","line":618,"updated":"2019-08-08 09:20:34.000000000","message":"I think what you mean is\n\n When there is a route whose destination is same as a destination\n of a route to be added, the present route will be replaced by\n the new route. For example, (destinationB, nexthopB) is ....\n\nIt is good to mention that a comparison is made using \"destination\".","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"54190eb524a73414713eeb2d5c15a0b6792bb333","unresolved":false,"context_lines":[{"line_number":615,"context_line":""},{"line_number":616,"context_line":"* When (destinationB, nexthopB) is to be added but (destinationB,"},{"line_number":617,"context_line":"  nexthopC) is already present then only (destinationB, nexthopB) is"},{"line_number":618,"context_line":"  added to the result set and (destinationB, nexthopC) is removed."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_21f66efb","line":618,"in_reply_to":"7faddb67_bb870a13","updated":"2019-08-09 12:26:31.000000000","message":"Since I changed the behavior I had to change this section deeper.","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9c00c503d85f4fa75a7ed99b5916c39531eb9da8","unresolved":false,"context_lines":[{"line_number":617,"context_line":"  nexthopC) is already present then only (destinationB, nexthopB) is"},{"line_number":618,"context_line":"  added to the result set and (destinationB, nexthopC) is removed."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"},{"line_number":622,"context_line":"  allowed in the update request to the ``routes`` parameter."},{"line_number":623,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_3b223abc","line":620,"updated":"2019-08-08 09:20:34.000000000","message":"Per IRC chat with Bence, \"overlapping\" means a overlap of \"destination\" CIDR.\n\nMy idea is:\n\n A route whose destination overlaps some of destinations of\n existing routes can be added and existing routes are untouched.\n \u003csome example of \"overlapping\" would be nice here like\n  192.168.1.0/24 and 192.168.1.0/22 are overlaps.\u003e","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"54190eb524a73414713eeb2d5c15a0b6792bb333","unresolved":false,"context_lines":[{"line_number":617,"context_line":"  nexthopC) is already present then only (destinationB, nexthopB) is"},{"line_number":618,"context_line":"  added to the result set and (destinationB, nexthopC) is removed."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"},{"line_number":622,"context_line":"  allowed in the update request to the ``routes`` parameter."},{"line_number":623,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_015812f8","line":620,"in_reply_to":"7faddb67_3b223abc","updated":"2019-08-09 12:26:31.000000000","message":"Done","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9c00c503d85f4fa75a7ed99b5916c39531eb9da8","unresolved":false,"context_lines":[{"line_number":618,"context_line":"  added to the result set and (destinationB, nexthopC) is removed."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"},{"line_number":622,"context_line":"  allowed in the update request to the ``routes`` parameter."},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"The format of the request body is the same as the format of the ``routes``"},{"line_number":625,"context_line":"parameter."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_1ba65e55","line":622,"range":{"start_line":621,"start_character":62,"end_line":622,"end_character":60},"updated":"2019-08-08 09:20:34.000000000","message":"This reasoning looks unnecessary as the API reference.","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"54190eb524a73414713eeb2d5c15a0b6792bb333","unresolved":false,"context_lines":[{"line_number":618,"context_line":"  added to the result set and (destinationB, nexthopC) is removed."},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"* When (destinationD, nexthopD) is to be added but an overlapping"},{"line_number":621,"context_line":"  (destinationE, nexthopE) is already present that is allowed as it was"},{"line_number":622,"context_line":"  allowed in the update request to the ``routes`` parameter."},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"The format of the request body is the same as the format of the ``routes``"},{"line_number":625,"context_line":"parameter."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_215d0ee9","line":622,"range":{"start_line":621,"start_character":62,"end_line":622,"end_character":60},"in_reply_to":"7faddb67_1ba65e55","updated":"2019-08-09 12:26:31.000000000","message":"Done","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9c00c503d85f4fa75a7ed99b5916c39531eb9da8","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"* An extra route is only removed if there is an exact match (including the"},{"line_number":686,"context_line":"  ``destination`` and ``nexthop``) between the route sent and the route"},{"line_number":687,"context_line":"  already present."},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* When (destinationA, nexthopA) is to be removed but it is already missing"},{"line_number":690,"context_line":"  that is accepted and the request succeeds."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_1e45ec43","line":687,"updated":"2019-08-08 09:20:34.000000000","message":"I wonder why the add operation replaces an existing route whose destination matches a new route but the remove operation checks both destination and nexthop. What is the rational and/or the background?","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"343170ba1a6a49ca73d072b8cd64483d36f28184","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"* An extra route is only removed if there is an exact match (including the"},{"line_number":686,"context_line":"  ``destination`` and ``nexthop``) between the route sent and the route"},{"line_number":687,"context_line":"  already present."},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* When (destinationA, nexthopA) is to be removed but it is already missing"},{"line_number":690,"context_line":"  that is accepted and the request succeeds."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_7852dfe0","line":687,"in_reply_to":"7faddb67_1e45ec43","updated":"2019-08-09 08:51:20.000000000","message":"Good catch. I think what the add operation does now is actually a bug. This one now \"overwrites\" the the nexthop of an existing route, but the old API did something different: accepted both routes.\n\nTherefore I\u0027m putting workflow-1 on this until I fix it.","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"213cf466ac1309f1b7056074ea974d57830b969a","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"* An extra route is only removed if there is an exact match (including the"},{"line_number":686,"context_line":"  ``destination`` and ``nexthop``) between the route sent and the route"},{"line_number":687,"context_line":"  already present."},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* When (destinationA, nexthopA) is to be removed but it is already missing"},{"line_number":690,"context_line":"  that is accepted and the request succeeds."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_69fd163a","line":687,"in_reply_to":"7faddb67_23266018","updated":"2019-08-12 10:11:47.000000000","message":"Sorry for the confusion.\n\nI did already make the adding and removing symmetrical (and therefore removed the workflow-1). So now the addition never \"overwrites\" the nexthop of an already existing route. On the other hand if the same destination was present with a different nexthop then the same destionation will be kept with both nexthops.\n\nThat\u0027s also how the extraroute extension was working before.\n\nBut I forgot to answer to my own comment here.","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"cc167dd601627f50b36b2f790309eeb727c3b056","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"* An extra route is only removed if there is an exact match (including the"},{"line_number":686,"context_line":"  ``destination`` and ``nexthop``) between the route sent and the route"},{"line_number":687,"context_line":"  already present."},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* When (destinationA, nexthopA) is to be removed but it is already missing"},{"line_number":690,"context_line":"  that is accepted and the request succeeds."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_c4dbcf1e","line":687,"in_reply_to":"7faddb67_44ca7f4f","updated":"2019-08-12 10:54:57.000000000","message":"Please forget about my last comment. I checked on PS5 instead of 6 :)","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"61680cf77130bc131994508e141e62c7b7ab27e5","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"* An extra route is only removed if there is an exact match (including the"},{"line_number":686,"context_line":"  ``destination`` and ``nexthop``) between the route sent and the route"},{"line_number":687,"context_line":"  already present."},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* When (destinationA, nexthopA) is to be removed but it is already missing"},{"line_number":690,"context_line":"  that is accepted and the request succeeds."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_44ca7f4f","line":687,"in_reply_to":"7faddb67_69fd163a","updated":"2019-08-12 10:54:02.000000000","message":"Ok, but I still see in L616-L618 that old nextHop will be removed if new nextHop will be added with same destination. Shouldn\u0027t that be changed now?","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"aa3400fc221f60a0a697ca71bc9c09f84ad62115","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"* An extra route is only removed if there is an exact match (including the"},{"line_number":686,"context_line":"  ``destination`` and ``nexthop``) between the route sent and the route"},{"line_number":687,"context_line":"  already present."},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* When (destinationA, nexthopA) is to be removed but it is already missing"},{"line_number":690,"context_line":"  that is accepted and the request succeeds."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_23266018","line":687,"in_reply_to":"7faddb67_7852dfe0","updated":"2019-08-11 20:06:55.000000000","message":"hmm, Now I\u0027m a bit confused. Should this patch still have -W set? Or how You addressed this?","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"4102a57a94187b1d7bf80780401ce8485aa8d6ed","unresolved":false,"context_lines":[{"line_number":684,"context_line":""},{"line_number":685,"context_line":"* An extra route is only removed if there is an exact match (including the"},{"line_number":686,"context_line":"  ``destination`` and ``nexthop``) between the route sent and the route"},{"line_number":687,"context_line":"  already present."},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"* When (destinationA, nexthopA) is to be removed but it is already missing"},{"line_number":690,"context_line":"  that is accepted and the request succeeds."}],"source_content_type":"text/x-c++src","patch_set":5,"id":"7faddb67_9fde843c","line":687,"in_reply_to":"7faddb67_c4dbcf1e","updated":"2019-08-12 11:51:27.000000000","message":":-)","commit_id":"6ede90b41b68a2e0365fe8255e2db5acbd5240d1"}],"api-ref/source/v2/samples/routers/router-add-extraroutes-request.json":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0264fc7c7a177c2723d264e964e2acd5c545fddb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"["},{"line_number":2,"context_line":"    {\"destination\": \"10.0.3.0\", \"nexthop\": \"10.0.0.13\"},"},{"line_number":3,"context_line":"    {\"destination\": \"10.0.4.0\", \"nexthop\": \"10.0.0.14\"}"},{"line_number":4,"context_line":"]"}],"source_content_type":"application/json","patch_set":3,"id":"7faddb67_94a962de","line":2,"range":{"start_line":2,"start_character":21,"end_line":2,"end_character":29},"updated":"2019-07-29 15:34:17.000000000","message":"Don\u0027t we need netmask part for destination like 10.0.3.0/24?","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"0fd74f03e14aa7e4025f505b6f8d6e829192a034","unresolved":false,"context_lines":[{"line_number":1,"context_line":"["},{"line_number":2,"context_line":"    {\"destination\": \"10.0.3.0\", \"nexthop\": \"10.0.0.13\"},"},{"line_number":3,"context_line":"    {\"destination\": \"10.0.4.0\", \"nexthop\": \"10.0.0.14\"}"},{"line_number":4,"context_line":"]"}],"source_content_type":"application/json","patch_set":3,"id":"7faddb67_3c16494b","line":2,"range":{"start_line":2,"start_character":21,"end_line":2,"end_character":29},"in_reply_to":"7faddb67_94a962de","updated":"2019-07-30 10:57:35.000000000","message":"Oops, thanks for catching this.","commit_id":"54e8193a7137525be6585b741fd9153415ed0b9b"}],"api-ref/source/v2/samples/routers/router-add-extraroutes-response.json":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d33469e2070ec2b9d411203db252215f110682d9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"      {\"destination\" : \"10.0.3.0\", \"nexthop\" : \"10.0.0.13\"},"},{"line_number":8,"context_line":"      {\"destination\" : \"10.0.4.0\", \"nexthop\" : \"10.0.0.14\"}"},{"line_number":9,"context_line":"   ],"},{"line_number":10,"context_line":"   ..."},{"line_number":11,"context_line":"}"}],"source_content_type":"application/json","patch_set":2,"id":"7faddb67_dd472fbc","line":10,"range":{"start_line":10,"start_character":3,"end_line":10,"end_character":6},"updated":"2019-07-25 12:56:36.000000000","message":"Oops, this has to be valid json.","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"86c84e657ad7ea1b7ff99baa82ad5d481cd26006","unresolved":false,"context_lines":[{"line_number":7,"context_line":"      {\"destination\" : \"10.0.3.0\", \"nexthop\" : \"10.0.0.13\"},"},{"line_number":8,"context_line":"      {\"destination\" : \"10.0.4.0\", \"nexthop\" : \"10.0.0.14\"}"},{"line_number":9,"context_line":"   ],"},{"line_number":10,"context_line":"   \"further_router_properties\": \"...\""},{"line_number":11,"context_line":"}"}],"source_content_type":"application/json","patch_set":4,"id":"7faddb67_84e9e2e3","line":10,"updated":"2019-08-02 13:10:48.000000000","message":"Is this really necessary here?","commit_id":"70122e203fb9579a271a0bc042f492f769dfb380"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"f26d18c070191b2672e5473abbcb4b283a97333c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"      {\"destination\" : \"10.0.3.0\", \"nexthop\" : \"10.0.0.13\"},"},{"line_number":8,"context_line":"      {\"destination\" : \"10.0.4.0\", \"nexthop\" : \"10.0.0.14\"}"},{"line_number":9,"context_line":"   ],"},{"line_number":10,"context_line":"   \"further_router_properties\": \"...\""},{"line_number":11,"context_line":"}"}],"source_content_type":"application/json","patch_set":4,"id":"7faddb67_dd3b0899","line":10,"in_reply_to":"7faddb67_84e9e2e3","updated":"2019-08-06 10:30:35.000000000","message":"Not really. I originally just put ... here, but since this file must be valid json, that wasn\u0027t a good idea.","commit_id":"70122e203fb9579a271a0bc042f492f769dfb380"}],"api-ref/source/v2/samples/routers/router-remove-extraroutes-response.json":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d33469e2070ec2b9d411203db252215f110682d9","unresolved":false,"context_lines":[{"line_number":5,"context_line":"      {\"destination\" : \"10.0.1.0\", \"nexthop\" : \"10.0.0.11\"},"},{"line_number":6,"context_line":"      {\"destination\" : \"10.0.2.0\", \"nexthop\" : \"10.0.0.12\"}"},{"line_number":7,"context_line":"   ],"},{"line_number":8,"context_line":"   ..."},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":2,"id":"7faddb67_fd422bab","line":8,"range":{"start_line":8,"start_character":3,"end_line":8,"end_character":6},"updated":"2019-07-25 12:56:36.000000000","message":"Oops, this has to be valid json.","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"86c84e657ad7ea1b7ff99baa82ad5d481cd26006","unresolved":false,"context_lines":[{"line_number":5,"context_line":"      {\"destination\" : \"10.0.1.0\", \"nexthop\" : \"10.0.0.11\"},"},{"line_number":6,"context_line":"      {\"destination\" : \"10.0.2.0\", \"nexthop\" : \"10.0.0.12\"}"},{"line_number":7,"context_line":"   ],"},{"line_number":8,"context_line":"   \"further_router_properties\": \"...\""},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":4,"id":"7faddb67_24beeed4","line":8,"updated":"2019-08-02 13:10:48.000000000","message":"same here","commit_id":"70122e203fb9579a271a0bc042f492f769dfb380"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"f26d18c070191b2672e5473abbcb4b283a97333c","unresolved":false,"context_lines":[{"line_number":5,"context_line":"      {\"destination\" : \"10.0.1.0\", \"nexthop\" : \"10.0.0.11\"},"},{"line_number":6,"context_line":"      {\"destination\" : \"10.0.2.0\", \"nexthop\" : \"10.0.0.12\"}"},{"line_number":7,"context_line":"   ],"},{"line_number":8,"context_line":"   \"further_router_properties\": \"...\""},{"line_number":9,"context_line":"}"}],"source_content_type":"application/json","patch_set":4,"id":"7faddb67_1d4d203a","line":8,"in_reply_to":"7faddb67_24beeed4","updated":"2019-08-06 10:30:35.000000000","message":"Done","commit_id":"70122e203fb9579a271a0bc042f492f769dfb380"}],"neutron_lib/api/definitions/extraroute_atomic.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"e0b6ee7cebeddd7fa35eb916120162370daed1ce","unresolved":false,"context_lines":[{"line_number":24,"context_line":"               \u0027adding/removing extra routes\u0027)"},{"line_number":25,"context_line":"UPDATED_TIMESTAMP \u003d \u00272019-07-10T00:00:00+00:00\u0027"},{"line_number":26,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":27,"context_line":"    l3.ROUTERS: {}"},{"line_number":28,"context_line":"}"},{"line_number":29,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d None"},{"line_number":30,"context_line":"ACTION_MAP \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5d21ff9e","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":18},"updated":"2019-07-25 12:12:09.000000000","message":"Is it necessary to define this empty attribute?","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d33469e2070ec2b9d411203db252215f110682d9","unresolved":false,"context_lines":[{"line_number":24,"context_line":"               \u0027adding/removing extra routes\u0027)"},{"line_number":25,"context_line":"UPDATED_TIMESTAMP \u003d \u00272019-07-10T00:00:00+00:00\u0027"},{"line_number":26,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":27,"context_line":"    l3.ROUTERS: {}"},{"line_number":28,"context_line":"}"},{"line_number":29,"context_line":"SUB_RESOURCE_ATTRIBUTE_MAP \u003d None"},{"line_number":30,"context_line":"ACTION_MAP \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_5d833f05","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":18},"in_reply_to":"7faddb67_5d21ff9e","updated":"2019-07-25 12:56:36.000000000","message":"This is a side effect of how neutron.api.v2.resource_helper.build_resource_info() works. If we don\u0027t have this key in the attribute map then the action map below gets ignored. Please see here:\n\nhttps://opendev.org/openstack/neutron/src/commit/6d9283c1bc2878c9f29af45a4543df846f5c293e/neutron/api/v2/resource_helper.py#L79","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"e0b6ee7cebeddd7fa35eb916120162370daed1ce","unresolved":false,"context_lines":[{"line_number":30,"context_line":"ACTION_MAP \u003d {"},{"line_number":31,"context_line":"    l3.ROUTER: {"},{"line_number":32,"context_line":"        \u0027add_extraroutes\u0027: \u0027PUT\u0027,"},{"line_number":33,"context_line":"        \u0027remove_extraroutes\u0027: \u0027PUT\u0027,"},{"line_number":34,"context_line":"    }"},{"line_number":35,"context_line":"}"},{"line_number":36,"context_line":"REQUIRED_EXTENSIONS \u003d [l3.ALIAS, extraroute.ALIAS]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_1d3b87d1","line":33,"range":{"start_line":33,"start_character":31,"end_line":33,"end_character":34},"updated":"2019-07-25 12:12:09.000000000","message":"Just to confirm; this should be PUT and not DELETE??","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d33469e2070ec2b9d411203db252215f110682d9","unresolved":false,"context_lines":[{"line_number":30,"context_line":"ACTION_MAP \u003d {"},{"line_number":31,"context_line":"    l3.ROUTER: {"},{"line_number":32,"context_line":"        \u0027add_extraroutes\u0027: \u0027PUT\u0027,"},{"line_number":33,"context_line":"        \u0027remove_extraroutes\u0027: \u0027PUT\u0027,"},{"line_number":34,"context_line":"    }"},{"line_number":35,"context_line":"}"},{"line_number":36,"context_line":"REQUIRED_EXTENSIONS \u003d [l3.ALIAS, extraroute.ALIAS]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_1dcb8753","line":33,"range":{"start_line":33,"start_character":31,"end_line":33,"end_character":34},"in_reply_to":"7faddb67_1d3b87d1","updated":"2019-07-25 12:56:36.000000000","message":"We\u0027re following the \"standard\" set by add/remove_router_interface:\n\nhttps://opendev.org/openstack/neutron-lib/src/commit/60ca196817fd4fe375a89b56e9e78338ae6f12eb/neutron_lib/api/definitions/l3.py#L158\n\nIn my understanding these member actions are not really RESTful, so the HTTP methods used are quite arbitrary/accidental.","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"}],"releasenotes/notes/extraroute-atomic-apidef-80a7c6d4a773c701.yaml":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"e0b6ee7cebeddd7fa35eb916120162370daed1ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    New API definition: ``extraroute_atomic``"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7faddb67_fd2f8b85","line":4,"range":{"start_line":4,"start_character":26,"end_line":4,"end_character":43},"updated":"2019-07-25 12:12:09.000000000","message":"Nit; best to use the alias here... so ``extraroute-atomic``","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d33469e2070ec2b9d411203db252215f110682d9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    New API definition: ``extraroute_atomic``"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7faddb67_bd16f3a6","line":4,"range":{"start_line":4,"start_character":26,"end_line":4,"end_character":43},"in_reply_to":"7faddb67_fd2f8b85","updated":"2019-07-25 12:56:36.000000000","message":"Done","commit_id":"a8ee86247443cbc3898d9ab5e5f2f1dec411cd96"}]}
