)]}'
{"specs/xena/approved/placement-allow-provider-re-parenting.rst":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bb0501b6508aec85ab37cc2035abe446538a4c21","unresolved":true,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"The first reason is moot as the loop check is already needed and implemented"},{"line_number":59,"context_line":"for the case when the parent is updated from None to an RP."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"The second reason does not make sense to me. By moving an RP under another RP"},{"line_number":62,"context_line":"all the descendants should be moved as well. Similarly how the None -\u003e UUID"}],"source_content_type":"text/x-rst","patch_set":1,"id":"44622ed1_b7e4a886","line":59,"updated":"2021-04-29 21:24:34.000000000","message":"I was going to ask what will be the return status code if a loop is detected (400 or 409) but I realized if loop detection already exists, then a return status code for such situation has already been chosen in the past and we just use that.","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0f2b0f87c6734805cc3f33c429281ffe6e37a4eb","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"The first reason is moot as the loop check is already needed and implemented"},{"line_number":59,"context_line":"for the case when the parent is updated from None to an RP."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"The second reason does not make sense to me. By moving an RP under another RP"},{"line_number":62,"context_line":"all the descendants should be moved as well. Similarly how the None -\u003e UUID"}],"source_content_type":"text/x-rst","patch_set":1,"id":"154e2e1b_88b7f8bf","line":59,"in_reply_to":"44622ed1_b7e4a886","updated":"2021-05-04 14:55:29.000000000","message":"It is HTTP 400.","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bb0501b6508aec85ab37cc2035abe446538a4c21","unresolved":true,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"The second reason does not make sense to me. By moving an RP under another RP"},{"line_number":62,"context_line":"all the descendants should be moved as well. Similarly how the None -\u003e UUID"},{"line_number":63,"context_line":"case works today. So I don\u0027t see how can we orphan any RP by re-parenting."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"I see the following possible cases of move:"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"73e84dce_dce13714","line":63,"updated":"2021-04-29 21:24:34.000000000","message":"Hm, I was thinking the same thing... maybe it\u0027s also referring to a loop, that if you do create a loop, then that entire subtree would also be no longer attached to anything but itself? ¯\\_(ツ)_/¯","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7e8c03197eab3681a4949c81b1954ddf7eaca24c","unresolved":true,"context_lines":[{"line_number":107,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"As noted above re-parenting can significantly change the RP model in the"},{"line_number":110,"context_line":"Placement database. So it such action needs to be done carefully. While the"},{"line_number":111,"context_line":"Placement API is already admin only by default, the community asked for extra"},{"line_number":112,"context_line":"safety measures against unintentional parent changes. Therefore a new query"},{"line_number":113,"context_line":"parameter is proposed for the ``PUT /resource_providers/{uuid}`` API called"}],"source_content_type":"text/x-rst","patch_set":1,"id":"f7a4fb4f_c482f9b2","line":110,"range":{"start_line":110,"start_character":23,"end_line":110,"end_character":25},"updated":"2021-05-01 01:33:16.000000000","message":"needless?","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0f2b0f87c6734805cc3f33c429281ffe6e37a4eb","unresolved":false,"context_lines":[{"line_number":107,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"As noted above re-parenting can significantly change the RP model in the"},{"line_number":110,"context_line":"Placement database. So it such action needs to be done carefully. While the"},{"line_number":111,"context_line":"Placement API is already admin only by default, the community asked for extra"},{"line_number":112,"context_line":"safety measures against unintentional parent changes. Therefore a new query"},{"line_number":113,"context_line":"parameter is proposed for the ``PUT /resource_providers/{uuid}`` API called"}],"source_content_type":"text/x-rst","patch_set":1,"id":"68c14459_5653bca7","line":110,"range":{"start_line":110,"start_character":23,"end_line":110,"end_character":25},"in_reply_to":"f7a4fb4f_c482f9b2","updated":"2021-05-04 14:55:29.000000000","message":"Done","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bb0501b6508aec85ab37cc2035abe446538a4c21","unresolved":true,"context_lines":[{"line_number":116,"context_line":"the request contains the new query parameter with the ``True`` value. E.g.:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"  ``PUT /resource_providers/{uuid}?allow_reparenting\u003dTrue``"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"There was a list of alternatives discussed to this safety measure:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* `Do nothing`: This considered not safe enough"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ac02ee39_5c981ef7","line":119,"updated":"2021-04-29 21:24:34.000000000","message":"Yes please. I think this is the prudent thing to do.","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0f2b0f87c6734805cc3f33c429281ffe6e37a4eb","unresolved":true,"context_lines":[{"line_number":116,"context_line":"the request contains the new query parameter with the ``True`` value. E.g.:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"  ``PUT /resource_providers/{uuid}?allow_reparenting\u003dTrue``"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"There was a list of alternatives discussed to this safety measure:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* `Do nothing`: This considered not safe enough"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3fa98163_7c3e55e4","line":119,"in_reply_to":"818b3b16_bafc9b93","updated":"2021-05-04 14:55:29.000000000","message":"\u003e One concern is that the new parameter can create another bug where we can reparent an RP from None to one and combine two RP trees into one tree even when we set \"allow_reparenting\u003dFalse\". \n\nI\u0027m not sure it is a bug. Today we already allow changing the parent from None to a valid RP UUID. If that was not considered dangerous in the past I don\u0027t see why it would be moved under the protection of new \"allow_reparenting\u003dTrue\" query parameter. Moreover it would be a strange user experience to disallow something in a new microversion by default that was accepted in an older one.\n\n\u003e If the new query parameter is needed only because we haven\u0027t supported it so far, isn\u0027t that what microversion is for?\n\nThe argument was on the PTG that simply using the microversion to prevent unintentional re-parenting is not enough as later when newer microversions are added to the PUT /resource_providers API then the user might want to use the new feature but still want to avoid unintentional re-parenting. As microversioning uses an increasing integer value, we cannot selectively disable re-parenting and enable the newer features on the same API resource.","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7e8c03197eab3681a4949c81b1954ddf7eaca24c","unresolved":true,"context_lines":[{"line_number":116,"context_line":"the request contains the new query parameter with the ``True`` value. E.g.:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"  ``PUT /resource_providers/{uuid}?allow_reparenting\u003dTrue``"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"There was a list of alternatives discussed to this safety measure:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* `Do nothing`: This considered not safe enough"}],"source_content_type":"text/x-rst","patch_set":1,"id":"818b3b16_bafc9b93","line":119,"in_reply_to":"ac02ee39_5c981ef7","updated":"2021-05-01 01:33:16.000000000","message":"Well, either way is okay. One concern is that the new parameter can create another bug where we can reparent an RP from None to one and combine two RP trees into one tree even when we set \"allow_reparenting\u003dFalse\". If the new query parameter is needed only because we haven\u0027t supported it so far, isn\u0027t that what microversion is for?","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7e8c03197eab3681a4949c81b1954ddf7eaca24c","unresolved":true,"context_lines":[{"line_number":149,"context_line":"Other end user impact"},{"line_number":150,"context_line":"---------------------"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Nonoe"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Performance Impact"},{"line_number":155,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"404320d1_e762e4f3","line":152,"range":{"start_line":152,"start_character":0,"end_line":152,"end_character":5},"updated":"2021-05-01 01:33:16.000000000","message":"None?","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0f2b0f87c6734805cc3f33c429281ffe6e37a4eb","unresolved":false,"context_lines":[{"line_number":149,"context_line":"Other end user impact"},{"line_number":150,"context_line":"---------------------"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Nonoe"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Performance Impact"},{"line_number":155,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dbe173ae_cbe3219b","line":152,"range":{"start_line":152,"start_character":0,"end_line":152,"end_character":5},"in_reply_to":"404320d1_e762e4f3","updated":"2021-05-04 14:55:29.000000000","message":"Done","commit_id":"ba03787689a2e8ef61a4fe66aa27d6aa58fd232a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d45a5beb81e7491bdcf54ede2effd4c043b0d001","unresolved":true,"context_lines":[{"line_number":69,"context_line":"* RP moved to top level, becoming a new root RP"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"From placement perspective every case results in one or more valid RP trees."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Based on the data model if there was allocations against the moved RP those"},{"line_number":74,"context_line":"allocations will still refer to the RP after the move. This means that an"},{"line_number":75,"context_line":"consumer has allocation against a single RP tree before the move might have"}],"source_content_type":"text/x-rst","patch_set":2,"id":"dfd31e77_f351fa94","line":72,"updated":"2021-05-11 16:32:09.000000000","message":"either way, I\u0027m all up about saying that if you call this new API method, you know what you do so it\u0027s a caller issue.","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"548ada984abb4cb355cea71a42abacc552f6f501","unresolved":true,"context_lines":[{"line_number":69,"context_line":"* RP moved to top level, becoming a new root RP"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"From placement perspective every case results in one or more valid RP trees."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Based on the data model if there was allocations against the moved RP those"},{"line_number":74,"context_line":"allocations will still refer to the RP after the move. This means that an"},{"line_number":75,"context_line":"consumer has allocation against a single RP tree before the move might have"}],"source_content_type":"text/x-rst","patch_set":2,"id":"adc15ea8_5154bec4","line":72,"in_reply_to":"dfd31e77_f351fa94","updated":"2021-05-12 10:06:58.000000000","message":"That is an alternative yes. But on the PTG it was raised that we need an extra safety check.","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d45a5beb81e7491bdcf54ede2effd4c043b0d001","unresolved":true,"context_lines":[{"line_number":83,"context_line":"after an RP is moved. However placement never promised to keep such invariant"},{"line_number":84,"context_line":"as that would require the storage of the rules and correlating allocation"},{"line_number":85,"context_line":"candidate queries and allocations. Moreover such issue can already"},{"line_number":86,"context_line":"be created with the POST /reshape API as well. Therefore keeping any such"},{"line_number":87,"context_line":"invariant is the responsibility of the client. So I propose to start supporting"},{"line_number":88,"context_line":"all form of RP re-parenting in a new placement API microversion."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Alternatives"},{"line_number":91,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9a6b8870_feb56f6f","line":88,"range":{"start_line":86,"start_character":47,"end_line":88,"end_character":64},"updated":"2021-05-11 16:32:09.000000000","message":"this is surely the responsibility of the caller, as I said above. That being said, I wonder whether we should tho verify that there are no allocations and asking the caller to force this if so ?","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"548ada984abb4cb355cea71a42abacc552f6f501","unresolved":true,"context_lines":[{"line_number":83,"context_line":"after an RP is moved. However placement never promised to keep such invariant"},{"line_number":84,"context_line":"as that would require the storage of the rules and correlating allocation"},{"line_number":85,"context_line":"candidate queries and allocations. Moreover such issue can already"},{"line_number":86,"context_line":"be created with the POST /reshape API as well. Therefore keeping any such"},{"line_number":87,"context_line":"invariant is the responsibility of the client. So I propose to start supporting"},{"line_number":88,"context_line":"all form of RP re-parenting in a new placement API microversion."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Alternatives"},{"line_number":91,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"f759ad2d_dd22fa8c","line":88,"range":{"start_line":86,"start_character":47,"end_line":88,"end_character":64},"in_reply_to":"9a6b8870_feb56f6f","updated":"2021-05-12 10:06:58.000000000","message":"Technically we can do it but I don\u0027t want to overcomplicate the behavior.","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d45a5beb81e7491bdcf54ede2effd4c043b0d001","unresolved":true,"context_lines":[{"line_number":124,"context_line":"  as the proposed query parameter but it would be but into the request body. It"},{"line_number":125,"context_line":"  is considered non REST full as such field is not persisted or returned as the"},{"line_number":126,"context_line":"  result of the PUT request as it does not belong to the representation of the"},{"line_number":127,"context_line":"  ResourceProvider entity the PUT request updates."},{"line_number":128,"context_line":"* `Use a PATCH request for updating the parent`: While this would make the"},{"line_number":129,"context_line":"  parent change more explicit it would also cause great confusion for the"},{"line_number":130,"context_line":"  client for multiple reasons:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"e9232513_53e2f6d9","line":127,"updated":"2021-05-11 16:32:09.000000000","message":"yep","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"548ada984abb4cb355cea71a42abacc552f6f501","unresolved":false,"context_lines":[{"line_number":124,"context_line":"  as the proposed query parameter but it would be but into the request body. It"},{"line_number":125,"context_line":"  is considered non REST full as such field is not persisted or returned as the"},{"line_number":126,"context_line":"  result of the PUT request as it does not belong to the representation of the"},{"line_number":127,"context_line":"  ResourceProvider entity the PUT request updates."},{"line_number":128,"context_line":"* `Use a PATCH request for updating the parent`: While this would make the"},{"line_number":129,"context_line":"  parent change more explicit it would also cause great confusion for the"},{"line_number":130,"context_line":"  client for multiple reasons:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"f7fa73d9_965f4f6f","line":127,"in_reply_to":"e9232513_53e2f6d9","updated":"2021-05-12 10:06:58.000000000","message":"Ack","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d45a5beb81e7491bdcf54ede2effd4c043b0d001","unresolved":true,"context_lines":[{"line_number":133,"context_line":"     PUT request, but not the ``parent_uuid`` field."},{"line_number":134,"context_line":"  2) Changing the ``parent_uuid`` field from None to a valid RP uuid is"},{"line_number":135,"context_line":"     supported by the PUT request but to change it from one RP uuid to another"},{"line_number":136,"context_line":"     would require a totally different ``PATCH`` request."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"43c10cfc_d6d443bd","line":136,"updated":"2021-05-11 16:32:09.000000000","message":"when we discussed this at the PTG, I told about PATCH for saying \"yeah, as a client, I know I\u0027ll force\". I wasn\u0027t really opiniated about PATCH so I understand your point.\n\nThat being said, there is one other alternative that you haven\u0027t mentioned, which is by using HTTP header like \u0027Force\u0027. Thoughts on it instead of this very specific and hacky query param ?","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"548ada984abb4cb355cea71a42abacc552f6f501","unresolved":true,"context_lines":[{"line_number":133,"context_line":"     PUT request, but not the ``parent_uuid`` field."},{"line_number":134,"context_line":"  2) Changing the ``parent_uuid`` field from None to a valid RP uuid is"},{"line_number":135,"context_line":"     supported by the PUT request but to change it from one RP uuid to another"},{"line_number":136,"context_line":"     would require a totally different ``PATCH`` request."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"0fdb0553_bcb352a5","line":136,"in_reply_to":"43c10cfc_d6d443bd","updated":"2021-05-12 10:06:58.000000000","message":"True I can add that as an alternative. I think the header is a lot less tight to a certain API than the query parameter hence it feels a bit less clean that the query parameter.","commit_id":"ba04008b3499dd8877167b30352f90e210b11e78"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"62fb3010120185c8152105d31739986f7c2c70ec","unresolved":true,"context_lines":[{"line_number":85,"context_line":"candidate queries and allocations. Moreover such issue can already"},{"line_number":86,"context_line":"be created with the POST /reshape API as well. Therefore keeping any such"},{"line_number":87,"context_line":"invariant is the responsibility of the client. So I propose to start supporting"},{"line_number":88,"context_line":"all form of RP re-parenting in a new placement API microversion."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Alternatives"},{"line_number":91,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"096c2f22_5f1cabbb","line":88,"updated":"2021-05-25 12:58:00.000000000","message":"I\u0027m eventually OK with this.","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aff77921371b9ebc50421aba3ad5ed9419532d59","unresolved":true,"context_lines":[{"line_number":84,"context_line":"as that would require the storage of the rules and correlating allocation"},{"line_number":85,"context_line":"candidate queries and allocations. Moreover such issue can already"},{"line_number":86,"context_line":"be created with the POST /reshape API as well. Therefore keeping any such"},{"line_number":87,"context_line":"invariant is the responsibility of the client. So I propose to start supporting"},{"line_number":88,"context_line":"all form of RP re-parenting in a new placement API microversion."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Alternatives"},{"line_number":91,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"0cf1aa33_0bfffc1d","line":88,"range":{"start_line":87,"start_character":47,"end_line":88,"end_character":64},"updated":"2021-05-25 22:05:29.000000000","message":"Is this mention of \"new placement API microversion\" talking about the proposal in this spec or a future proposal? I was thinking it\u0027s talking about this spec proposal.","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"724d66d8d7c59e99874a02f8e6ad99ef3fb8166e","unresolved":true,"context_lines":[{"line_number":115,"context_line":"the re-parenting cases defined in this spec is only accepted by Placement if"},{"line_number":116,"context_line":"the request contains the new query parameter with the ``True`` value. E.g.:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"  ``PUT /resource_providers/{uuid}?allow_reparenting\u003dTrue``"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"There was a list of alternatives discussed to this safety measure:"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"44bc9c40_6d72ed34","line":118,"range":{"start_line":118,"start_character":35,"end_line":118,"end_character":52},"updated":"2021-05-25 13:32:25.000000000","message":"i prefer this over force but as i not below \n\nPUT /resource-providers/{uuid}/parent_uuid/{parent} with an empty body\n\nim not -1 on this proposal however.\n\nif other wanted a shorter QA name you could have just\n\nreparent\u003dTrue\n\nas long as we dont use force\u003dtrue i think im ok with most name for the arg however.","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aff77921371b9ebc50421aba3ad5ed9419532d59","unresolved":true,"context_lines":[{"line_number":115,"context_line":"the re-parenting cases defined in this spec is only accepted by Placement if"},{"line_number":116,"context_line":"the request contains the new query parameter with the ``True`` value. E.g.:"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"  ``PUT /resource_providers/{uuid}?allow_reparenting\u003dTrue``"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"There was a list of alternatives discussed to this safety measure:"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"4e889e14_945dbcb1","line":118,"range":{"start_line":118,"start_character":35,"end_line":118,"end_character":52},"in_reply_to":"44bc9c40_6d72ed34","updated":"2021-05-25 22:05:29.000000000","message":"I think I prefer this over \"force\" too but I\u0027m realizing this terminology doesn\u0027t cover the un-parenting case, right? That is, when we say \"allow_reparenting\u003dTrue\" we are indicating that the API should go ahead and re-parent or un-parent if that\u0027s what\u0027s being requested, but the word is only saying \"reparenting\". I guess you would say you can re-parent to None so it\u0027s still re-parenting.\n\nAdmittedly I\u0027m now starting to wonder whether the query parameter addition is helpful or if it could be cumbersome. For the latter I wonder would it result in API callers simply adding \"allow_reparenting\u003dTrue\" all the time, making it meaningless. Or if callers could be rejected when they change parent_uuid and then the caller just calls again with allow_reparenting\u003dTrue.\n\nI\u0027m starting to think that maybe the combination of (1) new microversion and (2) the code comment that documented the reasoning behind rejecting re-parenting and un-parenting requests might be indicating that a \"allow\" or \"force\" keyword isn\u0027t really needed. The new microversion (1) signals the change/addition of behavior to the API. And it\u0027s possible that if the issues in (2) had not been present (loops and orphans), then the PUT API would have allowed re-parenting and un-parenting by default, back when it was first implemented.\n\nI keep thinking that the query param seems kind of redundant when changing the parent_uuid inherently means \"re-parent/un-parent\". If you\u0027re even changing it, you know you\u0027re re-parenting, so if you also have to also pass a query param, it would be like saying, \"I want to re-parent this RP\" twice.\n\nBased on this, I think I have a slight preference for \"do nothing\" now.","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"724d66d8d7c59e99874a02f8e6ad99ef3fb8166e","unresolved":true,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"There was a list of alternatives discussed to this safety measure:"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"* `Do nothing`: This considered not safe enough"},{"line_number":123,"context_line":"* `A new field in the request body`: This new field would have the same meaning"},{"line_number":124,"context_line":"  as the proposed query parameter but it would be but into the request body. It"},{"line_number":125,"context_line":"  is considered non REST full as such field is not persisted or returned as the"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ac418bd6_28003e6c","line":122,"range":{"start_line":122,"start_character":1,"end_line":122,"end_character":47},"updated":"2021-05-25 13:32:25.000000000","message":"this is still my preference for what its worth but its not a stong preference.","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"62fb3010120185c8152105d31739986f7c2c70ec","unresolved":true,"context_lines":[{"line_number":125,"context_line":"  is considered non REST full as such field is not persisted or returned as the"},{"line_number":126,"context_line":"  result of the PUT request as it does not belong to the representation of the"},{"line_number":127,"context_line":"  ResourceProvider entity the PUT request updates."},{"line_number":128,"context_line":"* `A new Header``: Instead of a new query paramtere use a new HTTP header"},{"line_number":129,"context_line":"  ``x-openstack-placement-allow-provider-reparenting:True``. As the name shows"},{"line_number":130,"context_line":"  this needs a lot more context encoded in it to be specific for the API it"},{"line_number":131,"context_line":"  modifies while the query parameter already totally API specific."}],"source_content_type":"text/x-rst","patch_set":4,"id":"d8a6ad1c_253b975d","line":128,"range":{"start_line":128,"start_character":42,"end_line":128,"end_character":51},"updated":"2021-05-25 12:58:00.000000000","message":"nit: parameter","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"724d66d8d7c59e99874a02f8e6ad99ef3fb8166e","unresolved":true,"context_lines":[{"line_number":128,"context_line":"* `A new Header``: Instead of a new query paramtere use a new HTTP header"},{"line_number":129,"context_line":"  ``x-openstack-placement-allow-provider-reparenting:True``. As the name shows"},{"line_number":130,"context_line":"  this needs a lot more context encoded in it to be specific for the API it"},{"line_number":131,"context_line":"  modifies while the query parameter already totally API specific."},{"line_number":132,"context_line":"* `Use a PATCH request for updating the parent`: While this would make the"},{"line_number":133,"context_line":"  parent change more explicit it would also cause great confusion for the"},{"line_number":134,"context_line":"  client for multiple reasons:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"8023d26c_b2a5abac","line":131,"updated":"2021-05-25 13:32:25.000000000","message":"ya the header woudl be annoyign to type and im not sure it will be captured in loging as well as some other approaches. its also not a common paridime for this type of api.\nwe use this patern for thing like keystone auth that is transfromed by midelware but i dont think we normally use headers in project apis so -1 to using a header.","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"62fb3010120185c8152105d31739986f7c2c70ec","unresolved":true,"context_lines":[{"line_number":138,"context_line":"  2) Changing the ``parent_uuid`` field from None to a valid RP uuid is"},{"line_number":139,"context_line":"     supported by the PUT request but to change it from one RP uuid to another"},{"line_number":140,"context_line":"     would require a totally different ``PATCH`` request."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Security impact"},{"line_number":144,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"f8179d9e_3badbfb6","line":141,"updated":"2021-05-25 12:58:00.000000000","message":"Honestly, I tried a lot to think about this spec by looking at some kind of RESTful question.\n\nThat said, the current API endpoint is not RESTful : you can PUT a resource with some parameters with all the resource parameters but what you\u0027ll get will depend on whether the current resource parameter is None or other.\n\nIn a RESTful API, we could accept PUT to modify all the resource parameters and we would use PATCH for only updating the ones we\u0027d like to modify :\nhttps://restful-api-design.readthedocs.io/en/latest/methods.html\n\nThat being said, this would mean changing all the existing PUT calls depending on the new microversion, and just for the sake of being RESTful... \n\nSo, honestly, I\u0027m done with this and I wonder whether we should do like Nova : use some sub-resource for PUT :\n\n PUT /resource-providers/{uuid}/force\n\nThis isn\u0027t great but this would explicitely mean this subresource would accept to change *every* single Resource Provider parameter.\n\nThoughts ?","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"724d66d8d7c59e99874a02f8e6ad99ef3fb8166e","unresolved":true,"context_lines":[{"line_number":138,"context_line":"  2) Changing the ``parent_uuid`` field from None to a valid RP uuid is"},{"line_number":139,"context_line":"     supported by the PUT request but to change it from one RP uuid to another"},{"line_number":140,"context_line":"     would require a totally different ``PATCH`` request."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Security impact"},{"line_number":144,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"893f48a5_f900719b","line":141,"in_reply_to":"f8179d9e_3badbfb6","updated":"2021-05-25 13:32:25.000000000","message":"as mentioned on IRC i think i would prefer\n\nPUT /resource-providers/{uuid}/parent_uuid/{parent} with an empty body\n\nif we were to use a sub resouces not  PUT /resource-providers/{uuid}/force\n\n\nPUT /resource-providers/{uuid}/parent_uuid/{parent} woudl patch \n/resource-providers/{uuid} with the new parent uuid.\n\nthe limitation to taking this approch woudl be that we can only update one filed the parent_uuid in this api call.\n\ni do not think we intend to update the parent and the name or uuid concurently for any of the usecase we currently have so this restriction might be fine.","commit_id":"fa8464b62970953ac22f88098099e98dba6fa3dd"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b66bfbecc3a9e7e497e2115f14c3b9068f29956c","unresolved":true,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"As noted above re-parenting can significantly change the RP model in the"},{"line_number":110,"context_line":"Placement database. So such action needs to be done carefully. While the"},{"line_number":111,"context_line":"Placement API is already admin only by default, the requqst is raised on the"},{"line_number":112,"context_line":"Xena PTG for extra safety measures against unintentional parent changes."},{"line_number":113,"context_line":"During the spec discussion every the reviewer expressed the view that such"},{"line_number":114,"context_line":"safety measure is not really needed. So this spec only propose to use the new"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ee6c48e6_b8e12df7","line":111,"range":{"start_line":111,"start_character":52,"end_line":111,"end_character":59},"updated":"2021-05-26 14:46:40.000000000","message":"request","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"054a537d7a9de3df8953da9b4fb719045b0fe55b","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"As noted above re-parenting can significantly change the RP model in the"},{"line_number":110,"context_line":"Placement database. So such action needs to be done carefully. While the"},{"line_number":111,"context_line":"Placement API is already admin only by default, the requqst is raised on the"},{"line_number":112,"context_line":"Xena PTG for extra safety measures against unintentional parent changes."},{"line_number":113,"context_line":"During the spec discussion every the reviewer expressed the view that such"},{"line_number":114,"context_line":"safety measure is not really needed. So this spec only propose to use the new"}],"source_content_type":"text/x-rst","patch_set":5,"id":"d27501c5_ad7cda5f","line":111,"range":{"start_line":111,"start_character":52,"end_line":111,"end_character":59},"in_reply_to":"ee6c48e6_b8e12df7","updated":"2021-05-28 11:46:16.000000000","message":"Done","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b66bfbecc3a9e7e497e2115f14c3b9068f29956c","unresolved":true,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"* `Do nothing`: While it is considered not safe enough during the PTG, during"},{"line_number":120,"context_line":"  the spec review we ended up choosing this as the main solution."},{"line_number":121,"context_line":"* `A new query parameter`: Anew query parameter is proposed for the"},{"line_number":122,"context_line":"  ``PUT /resource_providers/{uuid}`` API called ``allow_reparenting`` the default"},{"line_number":123,"context_line":"  value of the query parameter is ``False`` and the re-parenting cases defined"},{"line_number":124,"context_line":"  in this spec is only accepted by Placement if the request contains the new"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9223e0b1_55988f6e","line":121,"range":{"start_line":121,"start_character":27,"end_line":121,"end_character":31},"updated":"2021-05-26 14:46:40.000000000","message":"A new","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"054a537d7a9de3df8953da9b4fb719045b0fe55b","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"* `Do nothing`: While it is considered not safe enough during the PTG, during"},{"line_number":120,"context_line":"  the spec review we ended up choosing this as the main solution."},{"line_number":121,"context_line":"* `A new query parameter`: Anew query parameter is proposed for the"},{"line_number":122,"context_line":"  ``PUT /resource_providers/{uuid}`` API called ``allow_reparenting`` the default"},{"line_number":123,"context_line":"  value of the query parameter is ``False`` and the re-parenting cases defined"},{"line_number":124,"context_line":"  in this spec is only accepted by Placement if the request contains the new"}],"source_content_type":"text/x-rst","patch_set":5,"id":"100fd09b_baa1b0ec","line":121,"range":{"start_line":121,"start_character":27,"end_line":121,"end_character":31},"in_reply_to":"9223e0b1_55988f6e","updated":"2021-05-28 11:46:16.000000000","message":"Done","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b66bfbecc3a9e7e497e2115f14c3b9068f29956c","unresolved":true,"context_lines":[{"line_number":125,"context_line":"  query parameter with the ``True``. It is considered hacky to add a query"},{"line_number":126,"context_line":"  parameter for a PUT request."},{"line_number":127,"context_line":"* `A new field in the request body`: This new field would have the same meaning"},{"line_number":128,"context_line":"  as the proposed query parameter but it would be but into the request body. It"},{"line_number":129,"context_line":"  is considered non REST full as such field is not persisted or returned as the"},{"line_number":130,"context_line":"  result of the PUT request as it does not belong to the representation of the"},{"line_number":131,"context_line":"  ResourceProvider entity the PUT request updates."}],"source_content_type":"text/x-rst","patch_set":5,"id":"ef0efae0_fec9879c","line":128,"range":{"start_line":128,"start_character":50,"end_line":128,"end_character":53},"updated":"2021-05-26 14:46:40.000000000","message":"put","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"054a537d7a9de3df8953da9b4fb719045b0fe55b","unresolved":false,"context_lines":[{"line_number":125,"context_line":"  query parameter with the ``True``. It is considered hacky to add a query"},{"line_number":126,"context_line":"  parameter for a PUT request."},{"line_number":127,"context_line":"* `A new field in the request body`: This new field would have the same meaning"},{"line_number":128,"context_line":"  as the proposed query parameter but it would be but into the request body. It"},{"line_number":129,"context_line":"  is considered non REST full as such field is not persisted or returned as the"},{"line_number":130,"context_line":"  result of the PUT request as it does not belong to the representation of the"},{"line_number":131,"context_line":"  ResourceProvider entity the PUT request updates."}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a2f43b7_e7255ca1","line":128,"range":{"start_line":128,"start_character":50,"end_line":128,"end_character":53},"in_reply_to":"ef0efae0_fec9879c","updated":"2021-05-28 11:46:16.000000000","message":"Done","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b66bfbecc3a9e7e497e2115f14c3b9068f29956c","unresolved":true,"context_lines":[{"line_number":126,"context_line":"  parameter for a PUT request."},{"line_number":127,"context_line":"* `A new field in the request body`: This new field would have the same meaning"},{"line_number":128,"context_line":"  as the proposed query parameter but it would be but into the request body. It"},{"line_number":129,"context_line":"  is considered non REST full as such field is not persisted or returned as the"},{"line_number":130,"context_line":"  result of the PUT request as it does not belong to the representation of the"},{"line_number":131,"context_line":"  ResourceProvider entity the PUT request updates."},{"line_number":132,"context_line":"* `A new Header`: Instead of a new query paramtere use a new HTTP header"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ec68feea_a31f3ebe","line":129,"range":{"start_line":129,"start_character":16,"end_line":129,"end_character":29},"updated":"2021-05-26 14:46:40.000000000","message":"non-RESTful","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"054a537d7a9de3df8953da9b4fb719045b0fe55b","unresolved":false,"context_lines":[{"line_number":126,"context_line":"  parameter for a PUT request."},{"line_number":127,"context_line":"* `A new field in the request body`: This new field would have the same meaning"},{"line_number":128,"context_line":"  as the proposed query parameter but it would be but into the request body. It"},{"line_number":129,"context_line":"  is considered non REST full as such field is not persisted or returned as the"},{"line_number":130,"context_line":"  result of the PUT request as it does not belong to the representation of the"},{"line_number":131,"context_line":"  ResourceProvider entity the PUT request updates."},{"line_number":132,"context_line":"* `A new Header`: Instead of a new query paramtere use a new HTTP header"}],"source_content_type":"text/x-rst","patch_set":5,"id":"5f2f0b99_45ef8e1b","line":129,"range":{"start_line":129,"start_character":16,"end_line":129,"end_character":29},"in_reply_to":"ec68feea_a31f3ebe","updated":"2021-05-28 11:46:16.000000000","message":"Done","commit_id":"d69bd7e1909d79d204ed18bb5ff2af25ad664f88"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5c3af073a18b541fb2d8b78079f18d7cda065f6b","unresolved":true,"context_lines":[{"line_number":86,"context_line":"be created with the POST /reshape API as well. Therefore keeping any such"},{"line_number":87,"context_line":"invariant is the responsibility of the client. So I propose to start supporting"},{"line_number":88,"context_line":"all form of RP re-parenting in a new placement API microversion."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"Alternatives"},{"line_number":91,"context_line":"------------"},{"line_number":92,"context_line":"See the API alternatives below."}],"source_content_type":"text/x-rst","patch_set":7,"id":"7cfbf9b7_a31e25a2","line":89,"updated":"2021-06-02 12:45:59.000000000","message":"ack, its goot to all this out but the reshap api point i think is important its already possible to violate\nthe orginal query rules with a reshape.","commit_id":"15cce573ff839419f4cc8f1dd23a771070b109e0"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"04ac2a81e5c84bcf48031021f7dfef90d0020994","unresolved":true,"context_lines":[{"line_number":148,"context_line":"  option seems to be acceptable to multiple reviewers, I think it will be"},{"line_number":149,"context_line":"  confusing similarly to ``PATCH``. It would create another way to update a"},{"line_number":150,"context_line":"  field of an entity while other fields still updated directly on the parent"},{"line_number":151,"context_line":"  resource."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"11a08b71_1aa300d4","line":151,"updated":"2021-06-02 08:28:39.000000000","message":"Ack.","commit_id":"15cce573ff839419f4cc8f1dd23a771070b109e0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5c3af073a18b541fb2d8b78079f18d7cda065f6b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"  option seems to be acceptable to multiple reviewers, I think it will be"},{"line_number":149,"context_line":"  confusing similarly to ``PATCH``. It would create another way to update a"},{"line_number":150,"context_line":"  field of an entity while other fields still updated directly on the parent"},{"line_number":151,"context_line":"  resource."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"97045ca6_5c70a12a","line":151,"in_reply_to":"11a08b71_1aa300d4","updated":"2021-06-02 12:45:59.000000000","message":"Ack","commit_id":"15cce573ff839419f4cc8f1dd23a771070b109e0"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"04ac2a81e5c84bcf48031021f7dfef90d0020994","unresolved":true,"context_lines":[{"line_number":227,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"* API doc needs to be updated. Warn the user that this is a potentially"},{"line_number":230,"context_line":"  dangerous operation."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"References"},{"line_number":233,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1cf4bcb0_a43cebca","line":230,"updated":"2021-06-02 08:28:39.000000000","message":"++ at least in the docs.\n\nWe could also have osc-placement saying \u0027Are you sure ?\u0027 (aha, just a joke, but still, the client could maybe help too)","commit_id":"15cce573ff839419f4cc8f1dd23a771070b109e0"}]}
