)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"e01a65e5809202a65c3f18debb1ad3eb211f2693","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Spec to import image in multi stores"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"DocImpact"},{"line_number":10,"context_line":"APIImpact"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ia909ae1afab54242a1ca1a109a62a28131dc4dcf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3fa7e38b_9e22ca00","line":9,"updated":"2019-12-05 18:51:08.000000000","message":"I don\u0027t think we want to use this tag anymore. Since the docs team went away, this now just creates a new bug in the projects bug tracker.\n\nThis can be useful to help track and make sure docs get updated for code changes, but I don\u0027t think either of these are really necessary in a spec.","commit_id":"d64d2cb39da67b084e25b287cde72cfe2f53ada8"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ce7e2da2610ce56d99e96d0ae2ba9654fea8b699","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Spec to import image in multi stores"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"DocImpact"},{"line_number":10,"context_line":"APIImpact"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ia909ae1afab54242a1ca1a109a62a28131dc4dcf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"3fa7e38b_db627ba7","line":9,"updated":"2020-01-03 14:33:06.000000000","message":"These still need to be removed.","commit_id":"973bbac83c1e1f5fc485200d9de6d30a210d235a"}],"specs/train/approved/glance/import-multi-stores.rst":[{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"  image bits."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Most of the code is shared between these two workflow. The idea is to accept"},{"line_number":57,"context_line":"multiple stores separated by a comma in the optional header field"},{"line_number":58,"context_line":"\u0027X-Image-Meta-Store\u0027 (example: ceph_fast,ceph_cheap)."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"If an unavailable store is submitted, the Api should reject the request."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_9f42040f","line":58,"range":{"start_line":57,"start_character":37,"end_line":58,"end_character":20},"updated":"2019-08-12 12:01:32.000000000","message":"I really dislike this. We have the json payload for import call, that was designed to contain all the input for the import tasks. I really think we should utilize that for providing the list when importing to multiple stores. Mixing the json payload with optional headers (which we desided to minimize when moving to Images API v2 to make it more user friendly).","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"83fb92709d2dee28ac77a14eba750d1688bb7a4d","unresolved":false,"context_lines":[{"line_number":54,"context_line":"  image bits."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"Most of the code is shared between these two workflow. The idea is to accept"},{"line_number":57,"context_line":"multiple stores separated by a comma in the optional header field"},{"line_number":58,"context_line":"\u0027X-Image-Meta-Store\u0027 (example: ceph_fast,ceph_cheap)."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"If an unavailable store is submitted, the Api should reject the request."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_0366c4bc","line":58,"range":{"start_line":57,"start_character":37,"end_line":58,"end_character":20},"in_reply_to":"7faddb67_9f42040f","updated":"2019-08-27 09:27:31.000000000","message":"Do we keep this header for backward compatibility or do we completely remove it which involve a breaking change for the api?","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"If an unavailable store is submitted, the Api should reject the request."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"If an error occurs during the upload in one backend, the request should be"},{"line_number":63,"context_line":"rejected, the data deleted, and the state of the image remains the same."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Current location strategies modules should\u0027nt be affected by theses changes as"},{"line_number":66,"context_line":"we don\u0027t change the behavior of the image locations. It is currently possible"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_ff5218de","line":63,"range":{"start_line":62,"start_character":0,"end_line":63,"end_character":72},"updated":"2019-08-12 12:01:32.000000000","message":"Perhaps we should have this as default behavior and include switch in the json payload allowing the user to decide if they want \"anything-fails-import-fails\" or \"all-fails-import-fails\" condition.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"Alternatives"},{"line_number":70,"context_line":"------------"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"An alternative to this solution would be to allow to import data on an image"},{"line_number":73,"context_line":"with status \u0027ACTIVE\u0027."},{"line_number":74,"context_line":"The import/upload workflow could be called multiple times, one time for each"},{"line_number":75,"context_line":"backend the operators want to store the data in."},{"line_number":76,"context_line":"This solution has multiple drawbacks:"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"* An image in status \u0027ACTIVE\u0027 can be used by end users and it shouldn\u0027t be"},{"line_number":79,"context_line":"  allowed to modify it."},{"line_number":80,"context_line":"* When calling the upload/import workflow multiple times, we would have to"},{"line_number":81,"context_line":"  ensure the same data is uploaded each time and we don\u0027t have different data"},{"line_number":82,"context_line":"  on each store."},{"line_number":83,"context_line":"* It will be a big change on the behavior of the API with a lot of rework."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Data model impact"},{"line_number":86,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_df063cce","line":83,"range":{"start_line":72,"start_character":0,"end_line":83,"end_character":74},"updated":"2019-08-12 12:01:32.000000000","message":"There is another approach to this which would avoid the drawbacks and not being mutually exclusive with the proposed solution. I\u0027ve been toying with an idea of copy import plugin that would allow to be called on active image and would copy the image data from store to another. Will write full spec for that at some point, but just highlighting here that it doesn\u0027t need to be that problematic and it does not collide with current proposal.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":95,"context_line":"**Modified APIs**"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* Import an image."},{"line_number":98,"context_line":"* Upload an image file."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"**Common Response Codes**"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_1ffcd4b3","line":98,"range":{"start_line":98,"start_character":0,"end_line":98,"end_character":23},"updated":"2019-08-12 12:01:32.000000000","message":"I think we should stick with import only.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"**API Version**"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"All URLS will be under the v2 Glance API.  If it is not explicitly specified"},{"line_number":111,"context_line":"assume /v2/\u003curl\u003e"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"**[Modified API] Import image to the backend**"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_7f26286b","line":111,"range":{"start_line":110,"start_character":0,"end_line":111,"end_character":16},"updated":"2019-08-12 12:01:32.000000000","message":"this change will require minor version bump to Images API","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":110,"context_line":"All URLS will be under the v2 Glance API.  If it is not explicitly specified"},{"line_number":111,"context_line":"assume /v2/\u003curl\u003e"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"**[Modified API] Import image to the backend**"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"Import image to the backend::"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_ff19b821","line":113,"range":{"start_line":113,"start_character":37,"end_line":113,"end_character":44},"updated":"2019-08-12 12:01:32.000000000","message":"store","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"**[Modified API] Import image to the backend**"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"Import image to the backend::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    POST /v2/images/​{image_id}​/import"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_1f15b4e5","line":115,"range":{"start_line":115,"start_character":20,"end_line":115,"end_character":27},"updated":"2019-08-12 12:01:32.000000000","message":"store","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Changed response codes:"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"* 400 -- If the X-Image-Meta-Store header is present, but specifies a list of"},{"line_number":131,"context_line":"  store id with at least one id that doesn\u0027t exist."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"Example curl usage::"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_dfbddcd7","line":131,"range":{"start_line":130,"start_character":2,"end_line":131,"end_character":51},"updated":"2019-08-12 12:01:32.000000000","message":"this seems appropriate even if we give the user power to choose the failure condition based on our fail early policy.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            $image_url/v2/images/{image_id}/import"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"**[Modified API] Upload image binary data**"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Get image binary data::"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    PUT /v2/images/​{image_id}​/file"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"This modifies the existing REST API to change the optional existing header"},{"line_number":148,"context_line":"field X-Image-Meta-Store. If present, it will now specify a list of store id"},{"line_number":149,"context_line":"(separated by a comma) to import the image data to."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Modified header fields:"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* X-Image-Meta-Store -- If present contains the list of store id to upload the"},{"line_number":154,"context_line":"  image binary data to."},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"Changed response codes:"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"* 400 -- If the X-Image-Meta-Store header is present, but specifies a list of"},{"line_number":159,"context_line":"  store id with at least one id that doesn\u0027t exist."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Example curl usage::"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        curl -i -X PUT -H \"X-Auth-Token: $token\" -H \"X-Image-Meta-Store:"},{"line_number":164,"context_line":"            ceph1,ceph2\" -H \"Content-Type: application/octet-stream\""},{"line_number":165,"context_line":"            -d @/home/glance/ubuntu-19.04.qcow2"},{"line_number":166,"context_line":"            $image_url/v2/images/{image_id}/file"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"Security impact"},{"line_number":169,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_7fa9488e","line":166,"range":{"start_line":141,"start_character":0,"end_line":166,"end_character":48},"updated":"2019-08-12 12:01:32.000000000","message":"I\u0027d rather not touch the image upload process. We\u0027re directing user away from this to use image import and the base idea is to leave the upload mainly to be used by other OpenStack services (like Cinder and Nova). Unless there is urge from those services to provide the possibility to create images/snapshots to multiple stores simultaneously this would likely not be worth of the effort.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":173,"context_line":"Notifications impact"},{"line_number":174,"context_line":"--------------------"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"None"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Other end user impact"},{"line_number":179,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_9f9a0460","line":176,"range":{"start_line":176,"start_character":0,"end_line":176,"end_character":4},"updated":"2019-08-12 12:01:32.000000000","message":"We probably should look into if we need to send notifications out per store. If the notifications are consumed by billing this would be valuable information.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":179,"context_line":"---------------------"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"**Glance client**"},{"line_number":182,"context_line":"Ideally the glance client (CLI + REST client) should be updated in accordance"},{"line_number":183,"context_line":"with this spec. Notably:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"* CLI / API support for specifying a list of store id on upload/import."},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Performance Impact"},{"line_number":188,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_5f8ecc32","line":185,"range":{"start_line":182,"start_character":0,"end_line":185,"end_character":71},"updated":"2019-08-12 12:01:32.000000000","message":"python-glanceclient support is must requirement to consider the feature done.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":187,"context_line":"Performance Impact"},{"line_number":188,"context_line":"------------------"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"No performance impact on the system. However, as we\u0027ll write data in multiple"},{"line_number":191,"context_line":"stores, the upload and import workflows could take more time depending on the"},{"line_number":192,"context_line":"backends where the upload are done."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Other deployer impact"},{"line_number":195,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_df8b9c1b","line":192,"range":{"start_line":190,"start_character":0,"end_line":192,"end_character":35},"updated":"2019-08-12 12:01:32.000000000","message":"Well this will increate the IO from the glance node by multiples towards the store backends (increasing multiplier per store) so performance impact is real.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"04b207bc0d3e3026f82de70230e05d5b995062d3","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"Primary assignee:"},{"line_number":211,"context_line":"  yebinama"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"Work Items"},{"line_number":214,"context_line":"----------"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7faddb67_3fa19096","line":212,"updated":"2019-08-12 12:01:32.000000000","message":"You can add at least me here as dedicated core reviewer.","commit_id":"a15291fd53a95a5bb9de4924119952e35f40516e"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"cf3efe0924d5f6f40c322659adcda88b3bf24a17","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"**Common Response Codes**"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"* Create Success: `201 Created`"},{"line_number":100,"context_line":"* Modify Success: `200 OK`"},{"line_number":101,"context_line":"* Delete Success: `204 No Content`"},{"line_number":102,"context_line":"* Failure: `400 Bad Request` with details."},{"line_number":103,"context_line":"* Forbidden: `403 Forbidden`"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7faddb67_9812a5fc","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":34},"updated":"2019-09-04 11:01:52.000000000","message":"We don\u0027t return any of these from the import call:\nhttps://docs.openstack.org/api-ref/image/v2/?expanded\u003dimport-an-image-detail#import-an-image\n\nWhat we do return in normal situation is 202 Accepted and that is only 200-series return code this indpoint returns.","commit_id":"168227fde5d7a5991d8227620c384ad7dc40d551"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"cf3efe0924d5f6f40c322659adcda88b3bf24a17","unresolved":false,"context_lines":[{"line_number":131,"context_line":"Changed response codes:"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"* 400 -- If the \u0027stores\u0027 field is present, but specifies a list of store id"},{"line_number":134,"context_line":"  with at least one id that doesn\u0027t exist."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"Example curl usage::"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7faddb67_d8c01d7f","line":134,"range":{"start_line":134,"start_character":28,"end_line":134,"end_character":41},"updated":"2019-09-04 11:01:52.000000000","message":"or is read-only like http, if we don\u0027t currently we probably should make sure our discovery api returns the info if store is read-only or not to avoid user frustration.","commit_id":"168227fde5d7a5991d8227620c384ad7dc40d551"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"6732999c524727af85759ed34614f2fe6c67c882","unresolved":false,"context_lines":[{"line_number":131,"context_line":"Changed response codes:"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"* 400 -- If the \u0027stores\u0027 field is present, but specifies a list of store id"},{"line_number":134,"context_line":"  with at least one id that doesn\u0027t exist."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"Example curl usage::"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"7faddb67_d761aa3a","line":134,"range":{"start_line":134,"start_character":28,"end_line":134,"end_character":41},"in_reply_to":"7faddb67_d8c01d7f","updated":"2019-09-05 15:15:35.000000000","message":"I\u0027ve checked and the read-only field is well returned by the discovery api, i\u0027ll update the spec accordingly.","commit_id":"168227fde5d7a5991d8227620c384ad7dc40d551"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"cf3efe0924d5f6f40c322659adcda88b3bf24a17","unresolved":false,"context_lines":[{"line_number":139,"context_line":"             -H \"Content-Type: application/json\""},{"line_number":140,"context_line":"             -d \u0027{\"method\":{\"name\":\"glance-direct\"},"},{"line_number":141,"context_line":"                  \"stores\": [\"ceph1\", \"ceph2\"],"},{"line_number":142,"context_line":"                  \"allow_failure\": false}\u0027"},{"line_number":143,"context_line":"             $image_url/v2/images/{image_id}/import"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7faddb67_f894f937","line":142,"range":{"start_line":142,"start_character":18,"end_line":142,"end_character":33},"updated":"2019-09-04 11:01:52.000000000","message":"NIT: Naming things are always super difficult. Not sure how I feel about this. Definitely want to hear what Abhishek,Brian and Sean think about this. We could just document the option very well but I still kind of would like to have some indication that only partial failure is acceptable.","commit_id":"168227fde5d7a5991d8227620c384ad7dc40d551"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"6732999c524727af85759ed34614f2fe6c67c882","unresolved":false,"context_lines":[{"line_number":139,"context_line":"             -H \"Content-Type: application/json\""},{"line_number":140,"context_line":"             -d \u0027{\"method\":{\"name\":\"glance-direct\"},"},{"line_number":141,"context_line":"                  \"stores\": [\"ceph1\", \"ceph2\"],"},{"line_number":142,"context_line":"                  \"allow_failure\": false}\u0027"},{"line_number":143,"context_line":"             $image_url/v2/images/{image_id}/import"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7faddb67_376d9e2e","line":142,"range":{"start_line":142,"start_character":18,"end_line":142,"end_character":33},"in_reply_to":"7faddb67_f894f937","updated":"2019-09-05 15:15:35.000000000","message":"I agree, I spent some time trying to find a concise and clear name but it\u0027s a difficult task.","commit_id":"168227fde5d7a5991d8227620c384ad7dc40d551"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"cf3efe0924d5f6f40c322659adcda88b3bf24a17","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":".. note:: Example"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    An operator calls the import image api with the following parameters::"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        curl -i -X POST -H \"X-Auth-Token: $token\""},{"line_number":165,"context_line":"             -H \"Content-Type: application/json\""},{"line_number":166,"context_line":"             -d \u0027{\"method\": {\"name\":\"glance-direct\"},"},{"line_number":167,"context_line":"                  \"stores\": [\"ceph1\", \"ceph2\"],"},{"line_number":168,"context_line":"                  \"allow_failure\": true}\u0027"},{"line_number":169,"context_line":"            $image_url/v2/images/{image_id}/import"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    The upload fails for \u0027ceph2\u0027 but succeed on \u0027ceph1\u0027. Since the parameter"},{"line_number":172,"context_line":"    \u0027allow_failure\u0027 has been set to \u0027true\u0027, the calls ends successfully and"},{"line_number":173,"context_line":"    the image is now active."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    Notifications sent by glance should look like (payload is truncated for"},{"line_number":176,"context_line":"    clarity)::"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        {"},{"line_number":179,"context_line":"            \"priority\": \"INFO\","},{"line_number":180,"context_line":"            \"event_type\": \"image.prepare\","},{"line_number":181,"context_line":"            \"timestamp\": \"2019-08-27 16:10:30.066867\","},{"line_number":182,"context_line":"            \"payload\": {\"status\": \"importing\","},{"line_number":183,"context_line":"                        \"name\": \"example\","},{"line_number":184,"context_line":"                        \"backend\": [\"ceph1\", \"ceph2\"],"},{"line_number":185,"context_line":"                        ...},"},{"line_number":186,"context_line":"            \"message_id\": \"1c8993ad-e47c-4af7-9f75-fa49596eeb10\","},{"line_number":187,"context_line":"            ..."},{"line_number":188,"context_line":"        }"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        {"},{"line_number":191,"context_line":"            \"priority\": \"INFO\","},{"line_number":192,"context_line":"            \"event_type\": \"image.upload\","},{"line_number":193,"context_line":"            \"timestamp\": \"2019-08-27 16:11:30.058812\","},{"line_number":194,"context_line":"            \"payload\": {\"status\": \"active\","},{"line_number":195,"context_line":"                        \"name\": \"example\","},{"line_number":196,"context_line":"                        \"backend\": [\"ceph1\"],"},{"line_number":197,"context_line":"                        ...},"},{"line_number":198,"context_line":"            \"message_id\": \"8b8993ad-e47c-4af7-9f75-fa49596eeb11\","},{"line_number":199,"context_line":"            ..."},{"line_number":200,"context_line":"        }"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"Other end user impact"},{"line_number":203,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7faddb67_78e24932","line":200,"range":{"start_line":162,"start_character":1,"end_line":200,"end_character":9},"updated":"2019-09-04 11:01:52.000000000","message":"I really like this. Nice and clean with all the info needed without massive change.","commit_id":"168227fde5d7a5991d8227620c384ad7dc40d551"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5ba165fba2bb7baaf5ed2ad11a62ffc1a4357455","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"**Modified APIs**"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* Import an image."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"**Common Response Codes**"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_97dc3d75","line":95,"range":{"start_line":95,"start_character":0,"end_line":95,"end_character":18},"updated":"2019-09-19 06:47:49.000000000","message":"So this does mean, we will delete staged data only after it is copied/imported to all the mentioned stores. Also the image id will be same, so for each store after image is successfully imported the location and location metadata will be updated, right?","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"edaeb255c98aadb8ca2c0e6d77b92bf1f8636ce3","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"**Modified APIs**"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* Import an image."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"**Common Response Codes**"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_66a9d179","line":95,"range":{"start_line":95,"start_character":0,"end_line":95,"end_character":18},"in_reply_to":"3fa7e38b_97dc3d75","updated":"2019-09-19 11:59:42.000000000","message":"Staged data should be deleted only after it has been copied to all requested stores.\nI think the locations should only be set once, when everything went well. Otherwise, if import works on store1 and fails on store2, locations would change from [] to [store1] and then revert to []. I find this behavior a little confusing.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5ba165fba2bb7baaf5ed2ad11a62ffc1a4357455","unresolved":false,"context_lines":[{"line_number":135,"context_line":"New body fields:"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"* stores -- (String Array)"},{"line_number":138,"context_line":"  If present contains the list of store id to upload the image binary data to."},{"line_number":139,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":140,"context_line":"  If set to true, import will fail only if upload in all stores fails."},{"line_number":141,"context_line":"  If set to false, import will fail if upload in at least one store fails."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_1737edb2","line":138,"range":{"start_line":138,"start_character":46,"end_line":138,"end_character":52},"updated":"2019-09-19 06:47:49.000000000","message":"import","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"270737cdd1ae5429803a365bb057f4557c3419be","unresolved":false,"context_lines":[{"line_number":135,"context_line":"New body fields:"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"* stores -- (String Array)"},{"line_number":138,"context_line":"  If present contains the list of store id to upload the image binary data to."},{"line_number":139,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":140,"context_line":"  If set to true, import will fail only if upload in all stores fails."},{"line_number":141,"context_line":"  If set to false, import will fail if upload in at least one store fails."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_554f9dbc","line":138,"range":{"start_line":138,"start_character":46,"end_line":138,"end_character":52},"in_reply_to":"3fa7e38b_1737edb2","updated":"2019-09-19 09:22:44.000000000","message":"Technically this is correct. User imports image into Glance, Glance uploads/writes it into store(s)","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5ba165fba2bb7baaf5ed2ad11a62ffc1a4357455","unresolved":false,"context_lines":[{"line_number":137,"context_line":"* stores -- (String Array)"},{"line_number":138,"context_line":"  If present contains the list of store id to upload the image binary data to."},{"line_number":139,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":140,"context_line":"  If set to true, import will fail only if upload in all stores fails."},{"line_number":141,"context_line":"  If set to false, import will fail if upload in at least one store fails."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Changed response codes:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_57bfa5fa","line":140,"range":{"start_line":140,"start_character":43,"end_line":140,"end_character":49},"updated":"2019-09-19 06:47:49.000000000","message":"the task will fail if import fails in all of the mentioned store.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5ba165fba2bb7baaf5ed2ad11a62ffc1a4357455","unresolved":false,"context_lines":[{"line_number":138,"context_line":"  If present contains the list of store id to upload the image binary data to."},{"line_number":139,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":140,"context_line":"  If set to true, import will fail only if upload in all stores fails."},{"line_number":141,"context_line":"  If set to false, import will fail if upload in at least one store fails."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Changed response codes:"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_376549b6","line":141,"range":{"start_line":141,"start_character":19,"end_line":141,"end_character":74},"updated":"2019-09-19 06:47:49.000000000","message":"the task will fail if import fails in one of the mentioned store.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5ba165fba2bb7baaf5ed2ad11a62ffc1a4357455","unresolved":false,"context_lines":[{"line_number":219,"context_line":"The glance client (CLI + REST client) must be updated in accordance with this"},{"line_number":220,"context_line":"spec. Notably:"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"* CLI / API support for specifying a list of store id on upload/import."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"Performance Impact"},{"line_number":225,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_97f8bdc4","line":222,"range":{"start_line":222,"start_character":57,"end_line":222,"end_character":63},"updated":"2019-09-19 06:47:49.000000000","message":"why upload, as we are modifying only import API?\n\nAlso the normal/traditional image creation does not use task flow.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"edaeb255c98aadb8ca2c0e6d77b92bf1f8636ce3","unresolved":false,"context_lines":[{"line_number":219,"context_line":"The glance client (CLI + REST client) must be updated in accordance with this"},{"line_number":220,"context_line":"spec. Notably:"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"* CLI / API support for specifying a list of store id on upload/import."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"Performance Impact"},{"line_number":225,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_c6b525f0","line":222,"range":{"start_line":222,"start_character":57,"end_line":222,"end_character":63},"in_reply_to":"3fa7e38b_97f8bdc4","updated":"2019-09-19 11:59:42.000000000","message":"Oversight from previous patch.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5ba165fba2bb7baaf5ed2ad11a62ffc1a4357455","unresolved":false,"context_lines":[{"line_number":224,"context_line":"Performance Impact"},{"line_number":225,"context_line":"------------------"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"As we\u0027ll write data in multiple stores, this will increase the IO from the"},{"line_number":228,"context_line":"glance nodes in accordance of the number of stores specified."},{"line_number":229,"context_line":"From the user point of view, the import workflow will also take more time"},{"line_number":230,"context_line":"depending on the stores where the upload are done."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Other deployer impact"},{"line_number":233,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_172e0d43","line":230,"range":{"start_line":227,"start_character":0,"end_line":230,"end_character":50},"updated":"2019-09-19 06:47:49.000000000","message":"Suppose there are 5 stores in the list, then when will image status set to active, after importing data to 1st store or after importing data to all stores?","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"b914c29e5fab1ae13bcdd610734d5680aae9ae1e","unresolved":false,"context_lines":[{"line_number":224,"context_line":"Performance Impact"},{"line_number":225,"context_line":"------------------"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"As we\u0027ll write data in multiple stores, this will increase the IO from the"},{"line_number":228,"context_line":"glance nodes in accordance of the number of stores specified."},{"line_number":229,"context_line":"From the user point of view, the import workflow will also take more time"},{"line_number":230,"context_line":"depending on the stores where the upload are done."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Other deployer impact"},{"line_number":233,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_1fce4d83","line":230,"range":{"start_line":227,"start_character":0,"end_line":230,"end_character":50},"in_reply_to":"3fa7e38b_06d33d3a","updated":"2019-10-02 11:16:01.000000000","message":"Yes this is what I\u0027m bit worried as well. Specially as user can create instance or volume from that image and we might be reverting it after.\n\nWriting the locations to the DB when all uploads are finished is risky as well. Should something happen to the api node processing the request, we might end up with image that is still queued, data is in 5 backends but not recorded in the locations, turning it into ghost data in storage we are not tracking at all.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"270737cdd1ae5429803a365bb057f4557c3419be","unresolved":false,"context_lines":[{"line_number":224,"context_line":"Performance Impact"},{"line_number":225,"context_line":"------------------"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"As we\u0027ll write data in multiple stores, this will increase the IO from the"},{"line_number":228,"context_line":"glance nodes in accordance of the number of stores specified."},{"line_number":229,"context_line":"From the user point of view, the import workflow will also take more time"},{"line_number":230,"context_line":"depending on the stores where the upload are done."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Other deployer impact"},{"line_number":233,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_d5e94d80","line":230,"range":{"start_line":227,"start_character":0,"end_line":230,"end_character":50},"in_reply_to":"3fa7e38b_172e0d43","updated":"2019-09-19 09:22:44.000000000","message":"I think what will happen is that the image gets active once the first store finishes as the image gets flipped to active, not by the task, but by the code that adds the location to the database.\n\nIf the failure scenario is strict it will still be bounced back in a case last store fails on revert. This could be potentially a problem is there is long time between the two.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"1b4085a113dc6c441d66786c87dc7c500c4ae6b2","unresolved":false,"context_lines":[{"line_number":224,"context_line":"Performance Impact"},{"line_number":225,"context_line":"------------------"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"As we\u0027ll write data in multiple stores, this will increase the IO from the"},{"line_number":228,"context_line":"glance nodes in accordance of the number of stores specified."},{"line_number":229,"context_line":"From the user point of view, the import workflow will also take more time"},{"line_number":230,"context_line":"depending on the stores where the upload are done."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Other deployer impact"},{"line_number":233,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_5ac82c73","line":230,"range":{"start_line":227,"start_character":0,"end_line":230,"end_character":50},"in_reply_to":"3fa7e38b_1fce4d83","updated":"2019-10-04 12:52:47.000000000","message":"Maybe the behavior could be:\n- If \"allow_failure\" is true then we update locations after each upload is complete.\n- Else, we update after all uploads are complete. Unfortunately, the risk of ghost data is still present in this case.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"edaeb255c98aadb8ca2c0e6d77b92bf1f8636ce3","unresolved":false,"context_lines":[{"line_number":224,"context_line":"Performance Impact"},{"line_number":225,"context_line":"------------------"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"As we\u0027ll write data in multiple stores, this will increase the IO from the"},{"line_number":228,"context_line":"glance nodes in accordance of the number of stores specified."},{"line_number":229,"context_line":"From the user point of view, the import workflow will also take more time"},{"line_number":230,"context_line":"depending on the stores where the upload are done."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Other deployer impact"},{"line_number":233,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa7e38b_06d33d3a","line":230,"range":{"start_line":227,"start_character":0,"end_line":230,"end_character":50},"in_reply_to":"3fa7e38b_d5e94d80","updated":"2019-09-19 11:59:42.000000000","message":"From a user perspective, getting and image going back from \u0027ACTIVE\u0027 to \u0027QUEUED\u0027 is confusing. What will happen if he tries to create an instance when his image is in \u0027ACTVE\u0027 state?\nI think the state and the locations should only be changed once, when the results of all import is known.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5ba165fba2bb7baaf5ed2ad11a62ffc1a4357455","unresolved":false,"context_lines":[{"line_number":272,"context_line":"Testing"},{"line_number":273,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"Appropriate unit tests to ensure the changes to glance function correctly."},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"Documentation Impact"},{"line_number":278,"context_line":"\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-rst","patch_set":6,"id":"3fa7e38b_f72c9148","line":275,"updated":"2019-09-19 06:47:49.000000000","message":"Need functional tests as well.","commit_id":"eb7f10e65b76406243ad2932e973ef1c79528ffd"}],"specs/ussuri/approved/glance/import-multi-stores.rst":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5c8ae5911475379c363342b42ce253a964648274","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"This modifies the existing REST API to add two new optional body fields."},{"line_number":130,"context_line":"For backwards compatibility, if the \u0027stores\u0027 parameter is not specified, the"},{"line_number":131,"context_line":"header \u0027X-Image-Meta-Store\u0027 is evaluated. If it\u0027s not specified, the store"},{"line_number":132,"context_line":"configured as the default (e.g. default_store) is used to upload the image"},{"line_number":133,"context_line":"to."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"New body fields:"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"3fa7e38b_44b723f7","line":133,"range":{"start_line":131,"start_character":42,"end_line":133,"end_character":3},"updated":"2019-11-06 07:04:22.000000000","message":"If both \u0027stores\u0027 parameter i.e. \u0027X-Image-Meta-Store\u0027 header and \u0027stores\u0027 are not specified then the store configured as default (e.g. default_backend) is used to upload the image to.","commit_id":"1afb1f618d3b7f68d133704913173b3216c0c273"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5c8ae5911475379c363342b42ce253a964648274","unresolved":false,"context_lines":[{"line_number":137,"context_line":"* stores -- (String Array)"},{"line_number":138,"context_line":"  If present contains the list of store id to import the image binary data to."},{"line_number":139,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":140,"context_line":"  If set to true, the task will fail only if import fails in all specified"},{"line_number":141,"context_line":"  stores."},{"line_number":142,"context_line":"  If set to false, the task will fail if import fails in one of the mentioned"},{"line_number":143,"context_line":"  store."},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"3fa7e38b_0477eb3d","line":141,"range":{"start_line":140,"start_character":2,"end_line":141,"end_character":9},"updated":"2019-11-06 07:04:22.000000000","message":"How we are going to treat failures, are we going to log it as warning with failure cause (exception traceback)??","commit_id":"1afb1f618d3b7f68d133704913173b3216c0c273"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"290c97465f9f7906a52a320b11e0b3df1b340c1c","unresolved":false,"context_lines":[{"line_number":137,"context_line":"* stores -- (String Array)"},{"line_number":138,"context_line":"  If present contains the list of store id to import the image binary data to."},{"line_number":139,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":140,"context_line":"  If set to true, the task will fail only if import fails in all specified"},{"line_number":141,"context_line":"  stores."},{"line_number":142,"context_line":"  If set to false, the task will fail if import fails in one of the mentioned"},{"line_number":143,"context_line":"  store."},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"3fa7e38b_c56ae37f","line":141,"range":{"start_line":140,"start_character":2,"end_line":141,"end_character":9},"in_reply_to":"3fa7e38b_0477eb3d","updated":"2019-11-13 12:58:20.000000000","message":"Warning log with a clear error message should be sufficient.","commit_id":"1afb1f618d3b7f68d133704913173b3216c0c273"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"5c8ae5911475379c363342b42ce253a964648274","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Changed response codes:"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* 400 -- If the \u0027stores\u0027 field is present, but specifies a list of store id"},{"line_number":148,"context_line":"  with at least one id that doesn\u0027t exist or is read-only (like http)."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"Example curl usage::"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"3fa7e38b_049ccb59","line":148,"range":{"start_line":147,"start_character":2,"end_line":148,"end_character":70},"updated":"2019-11-06 07:04:22.000000000","message":"Should we treat with allow_failure, e.g. if allow_failure is true and even if store not present then we should ignore it upload/import the image to rest of the stores?","commit_id":"1afb1f618d3b7f68d133704913173b3216c0c273"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"290c97465f9f7906a52a320b11e0b3df1b340c1c","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Changed response codes:"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"* 400 -- If the \u0027stores\u0027 field is present, but specifies a list of store id"},{"line_number":148,"context_line":"  with at least one id that doesn\u0027t exist or is read-only (like http)."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"Example curl usage::"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"3fa7e38b_e5b7df20","line":148,"range":{"start_line":147,"start_character":2,"end_line":148,"end_character":70},"in_reply_to":"3fa7e38b_049ccb59","updated":"2019-11-13 12:58:20.000000000","message":"I think we should reject the request even if allow_failure is set to True.\nAllow_failure should only be used in case of failure during the treatment of the request, not if the user send a wrong payload.","commit_id":"1afb1f618d3b7f68d133704913173b3216c0c273"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a31fe26110dafe542f2d87deba6a66da99cabd4a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Problem description"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"At the moment, the import workflow only allow to push image data in one"},{"line_number":23,"context_line":"store. As a result, operators today need to perform a number of manual steps"},{"line_number":24,"context_line":"in order to replicate image bits on backend glance stores despite using the"},{"line_number":25,"context_line":"\u0027enabled_backends\u0027 configuration option."}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_2a1830d1","line":22,"range":{"start_line":22,"start_character":19,"end_line":22,"end_character":34},"updated":"2019-11-18 06:01:24.000000000","message":"If you are going to change import as well as upload API as well then you need to specify both here in problem description, Maybe like;\n\nAt the moment the new import workflow as well as traditional image upload API only allow to...","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"b25f4d57c4692c9a8dffbf816dbb47ebafcbe5fa","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Problem description"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"At the moment, the import workflow only allow to push image data in one"},{"line_number":23,"context_line":"store. As a result, operators today need to perform a number of manual steps"},{"line_number":24,"context_line":"in order to replicate image bits on backend glance stores despite using the"},{"line_number":25,"context_line":"\u0027enabled_backends\u0027 configuration option."}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_ef3b0398","line":22,"range":{"start_line":22,"start_character":19,"end_line":22,"end_character":34},"in_reply_to":"3fa7e38b_2a1830d1","updated":"2019-11-18 13:51:44.000000000","message":"Erno Kuvaja asked on August 12 to only add this new feature to import API and remove from the specs the upload part.\nShould I rollback?","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"17aa3a7c8c2157ea9c41d5bd3b2e114d40e354d3","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Problem description"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"At the moment, the import workflow only allow to push image data in one"},{"line_number":23,"context_line":"store. As a result, operators today need to perform a number of manual steps"},{"line_number":24,"context_line":"in order to replicate image bits on backend glance stores despite using the"},{"line_number":25,"context_line":"\u0027enabled_backends\u0027 configuration option."}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_240923db","line":22,"range":{"start_line":22,"start_character":19,"end_line":22,"end_character":34},"in_reply_to":"3fa7e38b_ef3b0398","updated":"2019-11-20 05:38:56.000000000","message":"Lets discuss this in weekly meeting.","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a31fe26110dafe542f2d87deba6a66da99cabd4a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    An operator provides an Openstack cloud with different sites, each"},{"line_number":30,"context_line":"    with their local backends which nova hosts are accessing directly (Ceph)."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    This operator use multiple backend support and want its images to be"},{"line_number":33,"context_line":"    available in each store to prevent the images to be downloaded through"},{"line_number":34,"context_line":"    glance each time a new virtual machine is created and let Nova use COW."},{"line_number":35,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_ca087c81","line":32,"range":{"start_line":32,"start_character":22,"end_line":32,"end_character":38},"updated":"2019-11-18 06:01:24.000000000","message":"replace \u0027multiple backend\u0027 with \u0027multiple stores\u0027 as we have changed backend to store to avoid confusion with cinder\u0027s backend concept.","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a31fe26110dafe542f2d87deba6a66da99cabd4a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    available in each store to prevent the images to be downloaded through"},{"line_number":34,"context_line":"    glance each time a new virtual machine is created and let Nova use COW."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    For this purpose, when creating a new image, he needs to use the import"},{"line_number":37,"context_line":"    workflow to store image data in store. Since the image is now in status"},{"line_number":38,"context_line":"    \"ACTIVE\", he can\u0027t use the import workflow anymore and need to manually"},{"line_number":39,"context_line":"    upload data in store2 to storeN and register these others locations URL"},{"line_number":40,"context_line":"    using the glance API."}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_ea0d388f","line":37,"range":{"start_line":36,"start_character":69,"end_line":37,"end_character":12},"updated":"2019-11-18 06:01:24.000000000","message":"ditto, import as well as upload","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a31fe26110dafe542f2d87deba6a66da99cabd4a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"This spec proposes the following high level feature to support multiple"},{"line_number":49,"context_line":"stores import:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"* Enhance the image import API to support targeting a list of stores for the"},{"line_number":52,"context_line":"  image bits."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"The idea is to provide a new \u0027stores\u0027 array field in the json payload where"}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_aa23c004","line":51,"range":{"start_line":51,"start_character":20,"end_line":51,"end_character":30},"updated":"2019-11-18 06:01:24.000000000","message":"import as well as upload","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a31fe26110dafe542f2d87deba6a66da99cabd4a","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    * 405: `Method Not Allowed` (only POST supported for this call)"},{"line_number":124,"context_line":"    * 409: `Conflict` (image is not in appropriate status)"},{"line_number":125,"context_line":"    * 410: `Gone`"},{"line_number":126,"context_line":"    * 413: `Payload Too Large`"},{"line_number":127,"context_line":"    * 415: `Unsupported Media Type` (must be ``application/json``)"},{"line_number":128,"context_line":"    * 503: `Service Unavailable`"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_ca7ddce6","line":126,"range":{"start_line":126,"start_character":6,"end_line":126,"end_character":30},"updated":"2019-11-18 06:01:24.000000000","message":"When this will be raised?","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"17aa3a7c8c2157ea9c41d5bd3b2e114d40e354d3","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    * 405: `Method Not Allowed` (only POST supported for this call)"},{"line_number":124,"context_line":"    * 409: `Conflict` (image is not in appropriate status)"},{"line_number":125,"context_line":"    * 410: `Gone`"},{"line_number":126,"context_line":"    * 413: `Payload Too Large`"},{"line_number":127,"context_line":"    * 415: `Unsupported Media Type` (must be ``application/json``)"},{"line_number":128,"context_line":"    * 503: `Service Unavailable`"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_440e9fe4","line":126,"range":{"start_line":126,"start_character":6,"end_line":126,"end_character":30},"in_reply_to":"3fa7e38b_4f3b379b","updated":"2019-11-20 05:38:56.000000000","message":"Yes please","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"b25f4d57c4692c9a8dffbf816dbb47ebafcbe5fa","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    * 405: `Method Not Allowed` (only POST supported for this call)"},{"line_number":124,"context_line":"    * 409: `Conflict` (image is not in appropriate status)"},{"line_number":125,"context_line":"    * 410: `Gone`"},{"line_number":126,"context_line":"    * 413: `Payload Too Large`"},{"line_number":127,"context_line":"    * 415: `Unsupported Media Type` (must be ``application/json``)"},{"line_number":128,"context_line":"    * 503: `Service Unavailable`"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_4f3b379b","line":126,"range":{"start_line":126,"start_character":6,"end_line":126,"end_character":30},"in_reply_to":"3fa7e38b_ca7ddce6","updated":"2019-11-18 13:51:44.000000000","message":"I copy/pasted the response codes part from the specs defining the import API. It\u0027s not a new error code. Should I only put the modified ones?","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a31fe26110dafe542f2d87deba6a66da99cabd4a","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"New body fields:"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"* stores -- (String Array)"},{"line_number":152,"context_line":"  If present contains the list of store id to import the image binary data to."},{"line_number":153,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":154,"context_line":"  If set to true, the task will fail only if import fails in all specified"}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_8a6b641d","line":151,"range":{"start_line":151,"start_character":2,"end_line":151,"end_character":26},"updated":"2019-11-18 06:01:24.000000000","message":"What happens if user specifies only one store in \u0027stores\u0027, are we going to process it or just reject it saying need to specify more than one store?","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"17aa3a7c8c2157ea9c41d5bd3b2e114d40e354d3","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"New body fields:"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"* stores -- (String Array)"},{"line_number":152,"context_line":"  If present contains the list of store id to import the image binary data to."},{"line_number":153,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":154,"context_line":"  If set to true, the task will fail only if import fails in all specified"}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_a4fc33b6","line":151,"range":{"start_line":151,"start_character":2,"end_line":151,"end_character":26},"in_reply_to":"3fa7e38b_326f2c93","updated":"2019-11-20 05:38:56.000000000","message":"sounds good","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"80be0afcdab768f4feaa8ae54201a4ca3c8ff1ab","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"New body fields:"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"* stores -- (String Array)"},{"line_number":152,"context_line":"  If present contains the list of store id to import the image binary data to."},{"line_number":153,"context_line":"* allow_failure -- (Boolean, default to false)"},{"line_number":154,"context_line":"  If set to true, the task will fail only if import fails in all specified"}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_326f2c93","line":151,"range":{"start_line":151,"start_character":2,"end_line":151,"end_character":26},"in_reply_to":"3fa7e38b_8a6b641d","updated":"2019-11-19 16:16:06.000000000","message":"We should accept it. Using the \u0027stores\u0027 parameter should be prefered over the header field (maybe deprecated in futures versions?).","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"7baf97a6e43247feb0991d58b497cf822fc61feb","unresolved":false,"context_lines":[{"line_number":237,"context_line":"The glance client (CLI + REST client) must be updated in accordance with this"},{"line_number":238,"context_line":"spec. Notably:"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"* CLI / API support for specifying a list of store id on import."},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Performance Impact"},{"line_number":243,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_25c06150","line":240,"range":{"start_line":240,"start_character":2,"end_line":240,"end_character":64},"updated":"2019-11-18 08:12:29.000000000","message":"CLI/API support for specifying allow_failure option on import","commit_id":"59dca8d09356493f346b8892dbf87b108c0fb149"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"129cd900e038ee72286ebfe468631b454cca911a","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    * 400: `Bad Request` with details."},{"line_number":119,"context_line":"    * 401: `Unauthorized`"},{"line_number":120,"context_line":"    * 403: `Forbidden`"},{"line_number":121,"context_line":"    * 404: `Not Found` (image doesn\u0027t exist or is not owned by the caller)"},{"line_number":122,"context_line":"    * 409: `Conflict` (image is not in appropriate status)"},{"line_number":123,"context_line":"    * 410: `Gone` (image deleted while operation in progress)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"3fa7e38b_31dcc372","line":120,"range":{"start_line":120,"start_character":3,"end_line":120,"end_character":22},"updated":"2019-11-25 09:54:52.000000000","message":"we are not dealing in policy here, so this 403 will never be raised.","commit_id":"0ce1e3b47fbd172f2b0ddb88d59b70472f719af1"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"0bdf6887ffb18242955a3c6c58025203be27b111","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    * 400: `Bad Request` with details."},{"line_number":119,"context_line":"    * 401: `Unauthorized`"},{"line_number":120,"context_line":"    * 403: `Forbidden`"},{"line_number":121,"context_line":"    * 404: `Not Found` (image doesn\u0027t exist or is not owned by the caller)"},{"line_number":122,"context_line":"    * 409: `Conflict` (image is not in appropriate status)"},{"line_number":123,"context_line":"    * 410: `Gone` (image deleted while operation in progress)"}],"source_content_type":"text/x-rst","patch_set":12,"id":"3fa7e38b_abc7bb11","line":120,"range":{"start_line":120,"start_character":3,"end_line":120,"end_character":22},"in_reply_to":"3fa7e38b_31dcc372","updated":"2019-11-27 13:17:44.000000000","message":"Done","commit_id":"0ce1e3b47fbd172f2b0ddb88d59b70472f719af1"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6807a169ccf5b14a4b5c2efc9060e61e5b68b294","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* If this field is set to \u0027false\u0027 (default behavior) and an error occurs"},{"line_number":64,"context_line":"  during the upload in at least one store, the request should be rejected, the"},{"line_number":65,"context_line":"  data deleted, and the state of the image remains the same."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* If this field is set to \u0027true\u0027, the request will fail (data deleted, ...)"},{"line_number":68,"context_line":"  only if the upload fails on all stores specified by the user. In case of a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_d20095b4","line":65,"range":{"start_line":65,"start_character":7,"end_line":65,"end_character":14},"updated":"2019-11-28 13:05:35.000000000","message":"NIT: deleted from stores, not staging.","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6807a169ccf5b14a4b5c2efc9060e61e5b68b294","unresolved":false,"context_lines":[{"line_number":67,"context_line":"* If this field is set to \u0027true\u0027, the request will fail (data deleted, ...)"},{"line_number":68,"context_line":"  only if the upload fails on all stores specified by the user. In case of a"},{"line_number":69,"context_line":"  partial success, the locations added to the image will be the stores where"},{"line_number":70,"context_line":"  the data has been correctly uploaded."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Image locations will be updated each time an upload in a store succeed (with"},{"line_number":73,"context_line":"informations from this store) but the status of the image will only be set to"}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_920a1dcf","line":70,"updated":"2019-11-28 13:05:35.000000000","message":"NIT: Ditto","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"73cb795460cc3b5f71d3073b2c2b92df867bffde","unresolved":false,"context_lines":[{"line_number":67,"context_line":"* If this field is set to \u0027true\u0027, the request will fail (data deleted, ...)"},{"line_number":68,"context_line":"  only if the upload fails on all stores specified by the user. In case of a"},{"line_number":69,"context_line":"  partial success, the locations added to the image will be the stores where"},{"line_number":70,"context_line":"  the data has been correctly uploaded."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"Image locations will be updated each time an upload in a store succeed (with"},{"line_number":73,"context_line":"informations from this store) but the status of the image will only be set to"}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_435cd2ef","line":70,"in_reply_to":"3fa7e38b_920a1dcf","updated":"2019-11-29 08:41:48.000000000","message":"Done","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6807a169ccf5b14a4b5c2efc9060e61e5b68b294","unresolved":false,"context_lines":[{"line_number":77,"context_line":"remaining stores will not be processed and already uploaded data should be"},{"line_number":78,"context_line":"deleted."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Current location strategies modules should\u0027nt be affected by theses changes as"},{"line_number":81,"context_line":"we don\u0027t change the behavior of the image locations. It is currently possible"},{"line_number":82,"context_line":"to do the same by patching an image and specify a list of locations."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_12694d8b","line":80,"range":{"start_line":80,"start_character":42,"end_line":80,"end_character":44},"updated":"2019-11-28 13:05:35.000000000","message":"NIT (if you need to respin) n\u0027","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"73cb795460cc3b5f71d3073b2c2b92df867bffde","unresolved":false,"context_lines":[{"line_number":77,"context_line":"remaining stores will not be processed and already uploaded data should be"},{"line_number":78,"context_line":"deleted."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Current location strategies modules should\u0027nt be affected by theses changes as"},{"line_number":81,"context_line":"we don\u0027t change the behavior of the image locations. It is currently possible"},{"line_number":82,"context_line":"to do the same by patching an image and specify a list of locations."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_0356dacf","line":80,"range":{"start_line":80,"start_character":42,"end_line":80,"end_character":44},"in_reply_to":"3fa7e38b_12694d8b","updated":"2019-11-29 08:41:48.000000000","message":"Done","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6807a169ccf5b14a4b5c2efc9060e61e5b68b294","unresolved":false,"context_lines":[{"line_number":136,"context_line":"This modifies the existing REST API to add two new optional body fields."},{"line_number":137,"context_line":"For backwards compatibility, if the \u0027stores\u0027 parameter is not specified, the"},{"line_number":138,"context_line":"header \u0027X-Image-Meta-Store\u0027 is evaluated."},{"line_number":139,"context_line":"If both parameters i.e. \u0027X-Image-Meta-Store\u0027 header and \u0027stores\u0027 are not"},{"line_number":140,"context_line":"specified then the store configured as default (e.g. default_backend) is used"},{"line_number":141,"context_line":"to upload the image to."},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_d229753a","line":139,"range":{"start_line":139,"start_character":3,"end_line":139,"end_character":18},"updated":"2019-11-28 13:05:35.000000000","message":"neither parameter","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"73cb795460cc3b5f71d3073b2c2b92df867bffde","unresolved":false,"context_lines":[{"line_number":136,"context_line":"This modifies the existing REST API to add two new optional body fields."},{"line_number":137,"context_line":"For backwards compatibility, if the \u0027stores\u0027 parameter is not specified, the"},{"line_number":138,"context_line":"header \u0027X-Image-Meta-Store\u0027 is evaluated."},{"line_number":139,"context_line":"If both parameters i.e. \u0027X-Image-Meta-Store\u0027 header and \u0027stores\u0027 are not"},{"line_number":140,"context_line":"specified then the store configured as default (e.g. default_backend) is used"},{"line_number":141,"context_line":"to upload the image to."},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_a366e6ba","line":139,"range":{"start_line":139,"start_character":3,"end_line":139,"end_character":18},"in_reply_to":"3fa7e38b_d229753a","updated":"2019-11-29 08:41:48.000000000","message":"Done","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"6807a169ccf5b14a4b5c2efc9060e61e5b68b294","unresolved":false,"context_lines":[{"line_number":138,"context_line":"header \u0027X-Image-Meta-Store\u0027 is evaluated."},{"line_number":139,"context_line":"If both parameters i.e. \u0027X-Image-Meta-Store\u0027 header and \u0027stores\u0027 are not"},{"line_number":140,"context_line":"specified then the store configured as default (e.g. default_backend) is used"},{"line_number":141,"context_line":"to upload the image to."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"New body fields:"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_521d850e","line":141,"updated":"2019-11-28 13:05:35.000000000","message":"If both parameters are supplied, we should fail the request as  Bad Request.","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"73cb795460cc3b5f71d3073b2c2b92df867bffde","unresolved":false,"context_lines":[{"line_number":138,"context_line":"header \u0027X-Image-Meta-Store\u0027 is evaluated."},{"line_number":139,"context_line":"If both parameters i.e. \u0027X-Image-Meta-Store\u0027 header and \u0027stores\u0027 are not"},{"line_number":140,"context_line":"specified then the store configured as default (e.g. default_backend) is used"},{"line_number":141,"context_line":"to upload the image to."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"New body fields:"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fa7e38b_6306aed0","line":141,"in_reply_to":"3fa7e38b_521d850e","updated":"2019-11-29 08:41:48.000000000","message":"That\u0027s specified on l157, but I add it here too.","commit_id":"60a0e57197853d6af39edff6457869b83bc6ceb8"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"259ae87a19a06430aee15acac6e2c4b42cef6fb6","unresolved":false,"context_lines":[{"line_number":193,"context_line":"Notifications impact"},{"line_number":194,"context_line":"--------------------"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"When entering the image import workflow, the payload sent during notification"},{"line_number":197,"context_line":"stage \u0027image.prepare\u0027 already contains a field backend which contains the"},{"line_number":198,"context_line":"store specified by the user when using multiple backend support."},{"line_number":199,"context_line":"In the same way, we should update the payload sent during notification stage"},{"line_number":200,"context_line":"\u0027image.upload\u0027 to add the same backend field filled with the list of stores"},{"line_number":201,"context_line":"where the data has correctly been uploaded."},{"line_number":202,"context_line":""},{"line_number":203,"context_line":".. note:: Example"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3fa7e38b_969c8d0d","line":201,"range":{"start_line":196,"start_character":0,"end_line":201,"end_character":43},"updated":"2019-12-12 20:32:35.000000000","message":"I\u0027m wondering if this is still relevant regarding the implementation we have chosen. As the _ImportToStore task is called for each backend, a notification is already sent for each store we upload data to. Maybe we should just modify this notification in case of failure and allow_failure is True?\nMoreover, as the notification process is called for each store (as set_data doesn\u0027t take a list of backends as a parameter), we don\u0027t have access to the original request and the list of stores asked by the user.","commit_id":"c369e52559a2c9997e3d4599f74df7f665ad9f07"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3c71f00ee0abb81ff1aaf7fecf73faeea172069a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"Notifications impact"},{"line_number":194,"context_line":"--------------------"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"When entering the image import workflow, the payload sent during notification"},{"line_number":197,"context_line":"stage \u0027image.prepare\u0027 already contains a field backend which contains the"},{"line_number":198,"context_line":"store specified by the user when using multiple backend support."},{"line_number":199,"context_line":"In the same way, we should update the payload sent during notification stage"},{"line_number":200,"context_line":"\u0027image.upload\u0027 to add the same backend field filled with the list of stores"},{"line_number":201,"context_line":"where the data has correctly been uploaded."},{"line_number":202,"context_line":""},{"line_number":203,"context_line":".. note:: Example"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3fa7e38b_bb616daa","line":201,"range":{"start_line":196,"start_character":0,"end_line":201,"end_character":43},"in_reply_to":"3fa7e38b_969c8d0d","updated":"2019-12-13 05:23:39.000000000","message":"IMO, we should modify this notification in case of failure and allow_failure is True.","commit_id":"c369e52559a2c9997e3d4599f74df7f665ad9f07"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"74e7758a5c94c886517bbcba6f34fa481f75b659","unresolved":false,"context_lines":[{"line_number":193,"context_line":"Notifications impact"},{"line_number":194,"context_line":"--------------------"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"When entering the image import workflow, the payload sent during notification"},{"line_number":197,"context_line":"stage \u0027image.prepare\u0027 already contains a field backend which contains the"},{"line_number":198,"context_line":"store specified by the user when using multiple backend support."},{"line_number":199,"context_line":"In the same way, we should update the payload sent during notification stage"},{"line_number":200,"context_line":"\u0027image.upload\u0027 to add the same backend field filled with the list of stores"},{"line_number":201,"context_line":"where the data has correctly been uploaded."},{"line_number":202,"context_line":""},{"line_number":203,"context_line":".. note:: Example"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3fa7e38b_fc959888","line":201,"range":{"start_line":196,"start_character":0,"end_line":201,"end_character":43},"in_reply_to":"3fa7e38b_bb616daa","updated":"2019-12-13 13:54:52.000000000","message":"I\u0027ll modify the specs to change this. Thanks.","commit_id":"c369e52559a2c9997e3d4599f74df7f665ad9f07"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3e88251ac808cce945601e2772796773d01676e7","unresolved":false,"context_lines":[{"line_number":52,"context_line":"  image bits."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"The idea is to provide a new \u0027stores\u0027 array field in the json payload where"},{"line_number":55,"context_line":"the user will list all stores he wants to import its data in (example:"},{"line_number":56,"context_line":"[\u0027ceph_fast\u0027, \u0027ceph_cheap\u0027])."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"If an unavailable store is submitted, the Api should reject the request."},{"line_number":59,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_c2dc5119","line":56,"range":{"start_line":55,"start_character":61,"end_line":56,"end_character":29},"updated":"2019-12-17 04:46:34.000000000","message":"Sorry for late but we should make provision to mention all stores, like if user or operator wants to upload the image to all the enabled backends then it might be difficult or overhead to specify all the stores in the list.\n\nSo IMO if user or operator specifies --stores all then we should import that image in all stores for that particular glance-api node.\n\nOr\n\nAnother option is we should include one more import parameter --all-stores and if both --stores or --all-stores is specified then we should reject the request.","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dd77ffba773f4bef8dcfd3f578e7a3002000b1ab","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"If an unavailable store is submitted, the Api should reject the request."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Another boolean field, \u0027allow_failure\u0027, will be added in the payload to"},{"line_number":61,"context_line":"specify which error behavior the user wants to be applied:"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* If this field is set to \u0027false\u0027 (default behavior) and an error occurs"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_67b7ccd9","line":60,"range":{"start_line":60,"start_character":24,"end_line":60,"end_character":37},"updated":"2019-12-13 21:52:45.000000000","message":"I think this name is too vague.  Take a look at the sample import json you give below:\n\n  {\"method\": {\"name\":\"glance-direct\"},\n   \"stores\": [\"ceph1\", \"ceph2\"],\n   \"allow_failure\": true }\n\nThe \"allow_failure\" isn\u0027t part of the \"stores\" value, so it\u0027s not obvious that it applies only to the stores.  I suggest using \"all_stores_must_succeed\" with a default value of true.\n\nI know that reverses the logic of your design, and I apologize for that.  But the advantage of doing it this way is that it covers the case that should definitely fail, that is, when all stores fail.  When a user has \"allow_failure\" : true and all stores fail, the call is going to fail, even though we\u0027ve said it\u0027s OK to allow failure.  Saying \"all_stores_must_succeed\" is more clear.\n\nJust to be clear, I agree with you that the default should be the entire call fails if any of its parts fail.  It\u0027s just a matter of how we express this in the API.","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"0074c851836d4646e53770aa1e8e4e1955824e00","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"If an unavailable store is submitted, the Api should reject the request."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Another boolean field, \u0027allow_failure\u0027, will be added in the payload to"},{"line_number":61,"context_line":"specify which error behavior the user wants to be applied:"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* If this field is set to \u0027false\u0027 (default behavior) and an error occurs"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_00a3cc00","line":60,"range":{"start_line":60,"start_character":24,"end_line":60,"end_character":37},"in_reply_to":"3fa7e38b_3d78ee2a","updated":"2020-01-02 14:17:17.000000000","message":"I do like that longer, more verbose name. That makes it easier to understand what the intent is and doesn\u0027t require that the caller understand the larger context behind the call.","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"7728e7d18c29bb1fcfd08aec5136d58fc6c6b60c","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"If an unavailable store is submitted, the Api should reject the request."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Another boolean field, \u0027allow_failure\u0027, will be added in the payload to"},{"line_number":61,"context_line":"specify which error behavior the user wants to be applied:"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* If this field is set to \u0027false\u0027 (default behavior) and an error occurs"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_3d78ee2a","line":60,"range":{"start_line":60,"start_character":24,"end_line":60,"end_character":37},"in_reply_to":"3fa7e38b_67b7ccd9","updated":"2019-12-16 18:21:52.000000000","message":"I proposed \"allow_failure\" because I thought it was concise and I couldn\u0027t find a better name at that time.\nThe use case you describe is indeed confusing. \nMaybe we should talk of the name change during glance meeting to ensure everyone agrees and I don\u0027t need to rollback the specs?","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dd77ffba773f4bef8dcfd3f578e7a3002000b1ab","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Image locations will be updated each time an upload in a store succeed (with"},{"line_number":78,"context_line":"informations from this store)."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Users will be able to follow task progress by looking at 2 reserved image"},{"line_number":81,"context_line":"properties:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"* os_glance_importing_to_stores: This property contains the list of stores"},{"line_number":84,"context_line":"  that has not yet been processed. At the beginning of the import flow, it"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_67134cb9","line":81,"range":{"start_line":80,"start_character":0,"end_line":81,"end_character":11},"updated":"2019-12-13 21:52:45.000000000","message":"I really didn\u0027t like this on the first reading, but I think there are some advantages to this.\n(1) no DB change for a \u0027messages\u0027 element on the image\n(2) we don\u0027t have to include these in the image schema, so they aren\u0027t required on a normal image response\n(3) the image owner has full CRUD on these, so they can be deleted by the end user after their usefulness is over\n\nBut (3) brings up a point, namely, what if some joker does an image update and changes the value of this property?  Hopefully glance isn\u0027t actually using it to keep track of the stores, so it could be just overwritten with the correct list when the next store being processed succeeds.\n\nWhat is your intent for os_glance_importing_to_stores at the end of the import flow?  I think it should be deleted when empty.  Same with os_glance_failed_import -- there\u0027s no reason for an empty one of these to be on an image.","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"7728e7d18c29bb1fcfd08aec5136d58fc6c6b60c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Image locations will be updated each time an upload in a store succeed (with"},{"line_number":78,"context_line":"informations from this store)."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Users will be able to follow task progress by looking at 2 reserved image"},{"line_number":81,"context_line":"properties:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"* os_glance_importing_to_stores: This property contains the list of stores"},{"line_number":84,"context_line":"  that has not yet been processed. At the beginning of the import flow, it"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_1df5f251","line":81,"range":{"start_line":80,"start_character":0,"end_line":81,"end_character":11},"in_reply_to":"3fa7e38b_2a0d1b8f","updated":"2019-12-16 18:21:52.000000000","message":"Stores can be built on the fly becaused it\u0027s based on locations as you said. If we don\u0027t store the list in the database we won\u0027t be able to rebuild it.\n\nMaybe there is another solution, we could use the \"status\" in the locations of the image. When we begin to import in a new store, we add it in the locations with a status of \"importing\". If it fails, we set status to \"fail\" or \"active\" in case of success.","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"7728e7d18c29bb1fcfd08aec5136d58fc6c6b60c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Image locations will be updated each time an upload in a store succeed (with"},{"line_number":78,"context_line":"informations from this store)."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Users will be able to follow task progress by looking at 2 reserved image"},{"line_number":81,"context_line":"properties:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"* os_glance_importing_to_stores: This property contains the list of stores"},{"line_number":84,"context_line":"  that has not yet been processed. At the beginning of the import flow, it"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_1d6e522c","line":81,"range":{"start_line":80,"start_character":0,"end_line":81,"end_character":11},"in_reply_to":"3fa7e38b_67134cb9","updated":"2019-12-16 18:21:52.000000000","message":"I added these properties after a suggestion in a weekly meeting, but I\u0027m not sure we really need them as a standard to follow progress already exist: users can subscribe to notifications as we send a status for each store we want to upload data to (before and after doing it).\nFor your point (3), if a user updates a property, we won\u0027t be able (in the current implementation) to overwrite it with the correct list as we don\u0027t store it. After the import workflow is created, we don\u0027t have access to the list anymore as each _ImportToStore task only knows it store.\nWe can delete the properties at the end of the process, but if I remember correctly, I think Erno suggested to keep \"os_glance_failed_import\" so that the user can investigate on why the upload failed in the stores contained in this list.","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"5a60c0fd8d6d323ce451a5b278bfdfdde16f4aeb","unresolved":false,"context_lines":[{"line_number":77,"context_line":"Image locations will be updated each time an upload in a store succeed (with"},{"line_number":78,"context_line":"informations from this store)."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Users will be able to follow task progress by looking at 2 reserved image"},{"line_number":81,"context_line":"properties:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"* os_glance_importing_to_stores: This property contains the list of stores"},{"line_number":84,"context_line":"  that has not yet been processed. At the beginning of the import flow, it"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3fa7e38b_2a0d1b8f","line":81,"range":{"start_line":80,"start_character":0,"end_line":81,"end_character":11},"in_reply_to":"3fa7e38b_67134cb9","updated":"2019-12-13 22:45:40.000000000","message":"I just looked back at how we populate the \u0027stores\u0027 element on an image.  It\u0027s defined in the schema, but the description specifically says \u0027Store in which image data resides.  Only present when the operator has enabled multiple stores.  May be a comma-separated list of store identifiers.\u0027 and it\u0027s specified in the schema as read-only.  It doesn\u0027t correspond to anything in the database (it\u0027s populated by glance reading the store_ids from the image locations), so it\u0027s very lightweight.  I think we could do something like that here, although if we make it read-only, the end user won\u0027t be able to delete it, which I think would be bad (we want the user to be able to make the failure list disappear).  Anyway, something to think about.","commit_id":"117279ada04cd5ca0cb40ca70c77de5c137e6320"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"f219401338bc76df2c6b35f7ac0c7ecd0f6d80a2","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"If user or operator wants to import the image to all the enabled stores then"},{"line_number":61,"context_line":"it might be difficult or overhead to specify all the stores in the list."},{"line_number":62,"context_line":"For that purpose a boolean field \u0027all-stores\u0027 will be provided."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* If set to false (default behavior), we use the logic previously described."},{"line_number":65,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_aebdf4b2","line":62,"range":{"start_line":62,"start_character":33,"end_line":62,"end_character":45},"updated":"2020-01-06 12:53:03.000000000","message":"Lets be consistent on the key naming and use \u0027all_stores\u0027.\n(Also :%s/all-stores/all_stores/g :P )","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"33ea29f6b3c9fd3ef4c812192c20bd8771686b97","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"If user or operator wants to import the image to all the enabled stores then"},{"line_number":61,"context_line":"it might be difficult or overhead to specify all the stores in the list."},{"line_number":62,"context_line":"For that purpose a boolean field \u0027all-stores\u0027 will be provided."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* If set to false (default behavior), we use the logic previously described."},{"line_number":65,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_04d66754","line":62,"range":{"start_line":62,"start_character":33,"end_line":62,"end_character":45},"in_reply_to":"3fa7e38b_aebdf4b2","updated":"2020-01-06 15:05:21.000000000","message":"Typo, thanks.","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"f219401338bc76df2c6b35f7ac0c7ecd0f6d80a2","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* If set to false (default behavior), we use the logic previously described."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* If set to true, the data will be imported to all enabled stores in the"},{"line_number":67,"context_line":"  configuration. This can\u0027t be used simultaneously with the \u0027stores\u0027 parameter."},{"line_number":68,"context_line":"  If user submits both, the Api should reject the request."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Another boolean field, \u0027all_stores_must_succeed\u0027, will be added in the payload"},{"line_number":71,"context_line":"to specify which error behavior the user wants to be applied:"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_aee894df","line":68,"range":{"start_line":66,"start_character":0,"end_line":68,"end_character":58},"updated":"2020-01-06 12:53:03.000000000","message":"As it is atm. this applies only to the scope of configured stores of the glance-api the request hits, not necessarily to all the stores that has configured deployment wide.\n\nIn short this would import the image to the same set of stores that the info call returns from the same glance-api. We might need to explain this behaviour in detail in the documentation.","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"33ea29f6b3c9fd3ef4c812192c20bd8771686b97","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* If set to false (default behavior), we use the logic previously described."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* If set to true, the data will be imported to all enabled stores in the"},{"line_number":67,"context_line":"  configuration. This can\u0027t be used simultaneously with the \u0027stores\u0027 parameter."},{"line_number":68,"context_line":"  If user submits both, the Api should reject the request."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Another boolean field, \u0027all_stores_must_succeed\u0027, will be added in the payload"},{"line_number":71,"context_line":"to specify which error behavior the user wants to be applied:"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_645e3b7a","line":68,"range":{"start_line":66,"start_character":0,"end_line":68,"end_character":58},"in_reply_to":"3fa7e38b_aee894df","updated":"2020-01-06 15:05:21.000000000","message":"Done","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"f219401338bc76df2c6b35f7ac0c7ecd0f6d80a2","unresolved":false,"context_lines":[{"line_number":174,"context_line":"  If present contains the list of store id to import the image binary data to."},{"line_number":175,"context_line":"* all-stores -- (Boolean, default to false)"},{"line_number":176,"context_line":"  If set to true, the data will be imported in all configured stores."},{"line_number":177,"context_line":"  If set to false, \u0027stores\u0027 is evaluated."},{"line_number":178,"context_line":"* all_stores_must_succeed -- (Boolean, default to true)"},{"line_number":179,"context_line":"  If set to false, the task will fail only if import fails in all specified"},{"line_number":180,"context_line":"  stores."}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_6e9dbc6a","line":177,"range":{"start_line":177,"start_character":19,"end_line":177,"end_character":27},"updated":"2020-01-06 12:53:03.000000000","message":"NIT: and/or \u0027X-Image-Meta-Store\u0027","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"33ea29f6b3c9fd3ef4c812192c20bd8771686b97","unresolved":false,"context_lines":[{"line_number":174,"context_line":"  If present contains the list of store id to import the image binary data to."},{"line_number":175,"context_line":"* all-stores -- (Boolean, default to false)"},{"line_number":176,"context_line":"  If set to true, the data will be imported in all configured stores."},{"line_number":177,"context_line":"  If set to false, \u0027stores\u0027 is evaluated."},{"line_number":178,"context_line":"* all_stores_must_succeed -- (Boolean, default to true)"},{"line_number":179,"context_line":"  If set to false, the task will fail only if import fails in all specified"},{"line_number":180,"context_line":"  stores."}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_c4b4cf1f","line":177,"range":{"start_line":177,"start_character":19,"end_line":177,"end_character":27},"in_reply_to":"3fa7e38b_6e9dbc6a","updated":"2020-01-06 15:05:21.000000000","message":"Done","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"f219401338bc76df2c6b35f7ac0c7ecd0f6d80a2","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"* 400 -- If the \u0027stores\u0027 field is present, but specifies a list of store id"},{"line_number":187,"context_line":"  with at least one id that doesn\u0027t exist or is read-only (like http)."},{"line_number":188,"context_line":"  Or, if both \u0027stores\u0027 parameters i.e. \u0027X-Image-Meta-Store\u0027 header and \u0027stores\u0027"},{"line_number":189,"context_line":"  are specified."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Example curl usage::"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_2e910446","line":189,"range":{"start_line":188,"start_character":9,"end_line":189,"end_character":16},"updated":"2020-01-06 12:53:03.000000000","message":"NIT: any two+ of the three \u0027all_stores\u0027:\u0027true\u0027, \u0027stores\u0027\u003d[..] or X-Image-Meta-Store","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"33ea29f6b3c9fd3ef4c812192c20bd8771686b97","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"* 400 -- If the \u0027stores\u0027 field is present, but specifies a list of store id"},{"line_number":187,"context_line":"  with at least one id that doesn\u0027t exist or is read-only (like http)."},{"line_number":188,"context_line":"  Or, if both \u0027stores\u0027 parameters i.e. \u0027X-Image-Meta-Store\u0027 header and \u0027stores\u0027"},{"line_number":189,"context_line":"  are specified."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Example curl usage::"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_e46f8b90","line":189,"range":{"start_line":188,"start_character":9,"end_line":189,"end_character":16},"in_reply_to":"3fa7e38b_2e910446","updated":"2020-01-06 15:05:21.000000000","message":"Done","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"f219401338bc76df2c6b35f7ac0c7ecd0f6d80a2","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            $image_url/v2/images/{image_id}/import"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    The upload fails for \u0027ceph2\u0027 but succeed on \u0027ceph1\u0027. Since the parameter"},{"line_number":227,"context_line":"    \u0027all_stores_must_succeed\u0027 has been set to \u0027false\u0027, the call ends"},{"line_number":228,"context_line":"    successfully and the image is now active."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    Notifications sent by glance should look like (payload is truncated for"},{"line_number":231,"context_line":"    clarity)::"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_0e77683d","line":228,"range":{"start_line":227,"start_character":55,"end_line":228,"end_character":45},"updated":"2020-01-06 12:53:03.000000000","message":"The call returns successfully regardless. This is why the two new properties are so important. Monitoring those and the stores field are the only way for user to know what is happening during the import.","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":30054,"name":"Grégoire Unbekandt","email":"gregoire.unbekandt@gmail.com","username":"yebinama"},"change_message_id":"33ea29f6b3c9fd3ef4c812192c20bd8771686b97","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            $image_url/v2/images/{image_id}/import"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    The upload fails for \u0027ceph2\u0027 but succeed on \u0027ceph1\u0027. Since the parameter"},{"line_number":227,"context_line":"    \u0027all_stores_must_succeed\u0027 has been set to \u0027false\u0027, the call ends"},{"line_number":228,"context_line":"    successfully and the image is now active."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    Notifications sent by glance should look like (payload is truncated for"},{"line_number":231,"context_line":"    clarity)::"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_64e5db3d","line":228,"range":{"start_line":227,"start_character":55,"end_line":228,"end_character":45},"in_reply_to":"3fa7e38b_0e77683d","updated":"2020-01-06 15:05:21.000000000","message":"I meant that the workflow ended successfully, the call indeed ends successfully regardless.","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":5202,"name":"Erno Kuvaja","email":"jokke@usr.fi","username":"jokke"},"change_message_id":"f219401338bc76df2c6b35f7ac0c7ecd0f6d80a2","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    Notifications sent by glance should look like (payload is truncated for"},{"line_number":231,"context_line":"    clarity)::"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        {"},{"line_number":234,"context_line":"            \"priority\": \"INFO\","},{"line_number":235,"context_line":"            \"event_type\": \"image.prepare\","},{"line_number":236,"context_line":"            \"timestamp\": \"2019-08-27 16:10:30.066867\","},{"line_number":237,"context_line":"            \"payload\": {\"status\": \"importing\","},{"line_number":238,"context_line":"                        \"name\": \"example\","},{"line_number":239,"context_line":"                        \"backend\": \"ceph1\","},{"line_number":240,"context_line":"                        \"os_glance_importing_to_stores\": [\"ceph1\", \"ceph2\"],"},{"line_number":241,"context_line":"                        \"os_glance_failed_import\": [],"},{"line_number":242,"context_line":"                        ...},"},{"line_number":243,"context_line":"            \"message_id\": \"1c8993ad-e47c-4af7-9f75-fa49596eeb10\","},{"line_number":244,"context_line":"            ..."},{"line_number":245,"context_line":"        }"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        {"},{"line_number":248,"context_line":"            \"priority\": \"INFO\","},{"line_number":249,"context_line":"            \"event_type\": \"image.upload\","},{"line_number":250,"context_line":"            \"timestamp\": \"2019-08-27 16:11:30.058812\","},{"line_number":251,"context_line":"            \"payload\": {\"status\": \"active\","},{"line_number":252,"context_line":"                        \"name\": \"example\","},{"line_number":253,"context_line":"                        \"backend\": \"ceph1\","},{"line_number":254,"context_line":"                        \"os_glance_importing_to_stores\": [\"ceph2\"],"},{"line_number":255,"context_line":"                        \"os_glance_failed_import\": [],"},{"line_number":256,"context_line":"                        ...},"},{"line_number":257,"context_line":"            \"message_id\": \"8b8993ad-e47c-4af7-9f75-fa49596eeb11\","},{"line_number":258,"context_line":"            ..."},{"line_number":259,"context_line":"        }"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        {"},{"line_number":262,"context_line":"            \"priority\": \"INFO\","},{"line_number":263,"context_line":"            \"event_type\": \"image.prepare\","},{"line_number":264,"context_line":"            \"timestamp\": \"2019-08-27 16:10:30.066867\","},{"line_number":265,"context_line":"            \"payload\": {\"status\": \"importing\","},{"line_number":266,"context_line":"                        \"name\": \"example\","},{"line_number":267,"context_line":"                        \"backend\": \"ceph2\","},{"line_number":268,"context_line":"                        \"os_glance_importing_to_stores\": [\"ceph2\"],"},{"line_number":269,"context_line":"                        \"os_glance_failed_import\": [],"},{"line_number":270,"context_line":"                        ...},"},{"line_number":271,"context_line":"            \"message_id\": \"1c8993ad-e47c-4af7-9f75-fa49596eeb10\","},{"line_number":272,"context_line":"            ..."},{"line_number":273,"context_line":"        }"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        {"},{"line_number":276,"context_line":"            \"priority\": \"ERROR\","},{"line_number":277,"context_line":"            \"event_type\": \"image.upload\","},{"line_number":278,"context_line":"            \"timestamp\": \"2019-08-27 16:11:30.058812\","},{"line_number":279,"context_line":"            \"payload\": {\"status\": \"active\","},{"line_number":280,"context_line":"                        \"name\": \"example\","},{"line_number":281,"context_line":"                        \"backend\": \"ceph2\","},{"line_number":282,"context_line":"                        \"os_glance_importing_to_stores\": [],"},{"line_number":283,"context_line":"                        \"os_glance_failed_import\": [\"ceph2\"],"},{"line_number":284,"context_line":"                        ...},"},{"line_number":285,"context_line":"            \"message_id\": \"8b8993ad-e47c-4af7-9f75-fa49596eeb11\","},{"line_number":286,"context_line":"            ..."},{"line_number":287,"context_line":"        }"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"Other end user impact"},{"line_number":290,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":20,"id":"3fa7e38b_6e8b7c16","line":287,"range":{"start_line":233,"start_character":1,"end_line":287,"end_character":9},"updated":"2020-01-06 12:53:03.000000000","message":"This looks great.","commit_id":"d2d18b1ab6e8c389b024fad8c61230c552bcadbf"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3c4ae642961c938eecbbc9a601a5d6ca1363a1eb","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":".. note:: Example"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    An operator provides an Openstack cloud with different sites, each"},{"line_number":30,"context_line":"    with their local stores which nova hosts are accessing directly (Ceph)."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    This operator use multiple stores support and want its images to be"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3fa7e38b_c7951596","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":37},"updated":"2020-01-16 15:12:45.000000000","message":"nit: OpenStack","commit_id":"31b189a9278e82e0db4d0e11a69843985245360a"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"3c4ae642961c938eecbbc9a601a5d6ca1363a1eb","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"* Normal http response code: 202"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    * 202: `Accepted`"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"* Expected error http response codes: 400, 401, 403, 404, 409, 410"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":22,"id":"3fa7e38b_c7cc35c0","line":141,"range":{"start_line":141,"start_character":2,"end_line":141,"end_character":4},"updated":"2020-01-16 15:12:45.000000000","message":"Overindented, so the resulting HTML output has these sub-bullets block quoted. Would be good to fix that, but that can be in a follow up.","commit_id":"31b189a9278e82e0db4d0e11a69843985245360a"}],"specs/ussuri/approved/index.rst":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"836811971c3c0935c16a846425ec6b9bbdbdc739","unresolved":false,"context_lines":[{"line_number":6,"context_line":"   :glob:"},{"line_number":7,"context_line":"   :maxdepth: 1"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Ussuri approved specs for Glance:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":".. toctree::"},{"line_number":13,"context_line":"    :glob:"},{"line_number":14,"context_line":"    :maxdepth: 1"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    glance/*"}],"source_content_type":"text/x-rst","patch_set":21,"id":"3fa7e38b_e7130301","line":16,"range":{"start_line":9,"start_character":0,"end_line":16,"end_character":12},"updated":"2020-01-07 06:26:08.000000000","message":"you need to rebase with master branch as this section is already merged.","commit_id":"a5f63129c0a7114812ae452952388a367f1f9a2d"}]}
