)]}'
{"cinder/api/v3/attachments.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a52936c2c3905a0f91bb95d5e7f5309bc54842c4","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\"Create a new attachment."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param volume_id: The ID of the volume to create attachment for."},{"line_number":90,"context_line":"        :param connector: Dictionary of connection info"},{"line_number":91,"context_line":"        :param mode: `rw` or `ro` (defaults to `rw` if omitted)."},{"line_number":92,"context_line":"        :param mountpoint: Mountpoint of remote attachment."},{"line_number":93,"context_line":"        :rtype: :class:`VolumeAttachment`"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_084d5c72","line":90,"updated":"2016-11-07 17:11:08.000000000","message":"Is this required? Can we create the attachment in nova-api (like reserve basically), and then update the attachment later with the connector (today nova gets the connector from os-brick on nova-compute prior to calling os-initialize_connection).","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"db189dab127f8e5968dd6834d5436583b0800da7","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\"Create a new attachment."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param volume_id: The ID of the volume to create attachment for."},{"line_number":90,"context_line":"        :param connector: Dictionary of connection info"},{"line_number":91,"context_line":"        :param mode: `rw` or `ro` (defaults to `rw` if omitted)."},{"line_number":92,"context_line":"        :param mountpoint: Mountpoint of remote attachment."},{"line_number":93,"context_line":"        :rtype: :class:`VolumeAttachment`"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_e88d887c","line":90,"in_reply_to":"9a629dbe_084d5c72","updated":"2016-11-07 17:14:01.000000000","message":"Nevermind, I guess nova-api would still call os-reserve to \u0027lock\u0027 the volume so we don\u0027t get competing requests trying to attach the same volume at the same time.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"5d8947ea674308b8d2f2c42d4df5aecc11a50a46","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\"Create a new attachment."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param volume_id: The ID of the volume to create attachment for."},{"line_number":90,"context_line":"        :param connector: Dictionary of connection info"},{"line_number":91,"context_line":"        :param mode: `rw` or `ro` (defaults to `rw` if omitted)."},{"line_number":92,"context_line":"        :param mountpoint: Mountpoint of remote attachment."},{"line_number":93,"context_line":"        :rtype: :class:`VolumeAttachment`"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_2670baa3","line":90,"in_reply_to":"9a629dbe_410f2fe1","updated":"2016-11-11 22:37:05.000000000","message":"I think the next update will resolve this, I moved the \"attachment_create\" to set the volume to \"reserved\" and create an empty attachment record.\n\nFrom there to finalize/connect Nova would just call \"finalize_attachment\" for that attachment-id and provide the connector info etc.  This would return the connection info just like we used to do in initialize_connection but the difference is that from Cinders perspective we would consider the operation as complete and mark the volume as in-use.\n\nIf something then goes wrong, we can either remove the attachment, or if it would be beneficial provide a way for nova to mark the attachment as in error.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2b49fb41f3b16cde4bf25f4ad0ca4a853813cb82","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\"Create a new attachment."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param volume_id: The ID of the volume to create attachment for."},{"line_number":90,"context_line":"        :param connector: Dictionary of connection info"},{"line_number":91,"context_line":"        :param mode: `rw` or `ro` (defaults to `rw` if omitted)."},{"line_number":92,"context_line":"        :param mountpoint: Mountpoint of remote attachment."},{"line_number":93,"context_line":"        :rtype: :class:`VolumeAttachment`"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_410f2fe1","line":90,"in_reply_to":"9a629dbe_615c3326","updated":"2016-11-07 18:22:02.000000000","message":"Update on the error handling in #4, I think nova would just delete the attachment. There wouldn\u0027t be any point in it hanging around if the connect_volume call to os-brick fails.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ee9c1884a75326881fcb385b1a3a5026e826c35","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\"Create a new attachment."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param volume_id: The ID of the volume to create attachment for."},{"line_number":90,"context_line":"        :param connector: Dictionary of connection info"},{"line_number":91,"context_line":"        :param mode: `rw` or `ro` (defaults to `rw` if omitted)."},{"line_number":92,"context_line":"        :param mountpoint: Mountpoint of remote attachment."},{"line_number":93,"context_line":"        :rtype: :class:`VolumeAttachment`"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_615c3326","line":90,"in_reply_to":"9a629dbe_e88d887c","updated":"2016-11-07 18:13:53.000000000","message":"Note, I\u0027d like to remove the need for nova to call os-reserve. What I\u0027d like to see is (I\u0027m thinking of the attach-volume flow here; in boot from volume we don\u0027t have the volume created yet):\n\n1. nova-api creates the attachment (doesn\u0027t have connector). This changes the state on the volume to \u0027attaching\u0027 or whatever os-reserve does today.\n\n2. nova-api does an RPC cast to nova-compute to attach the volume and returns a 202 from the REST API (nothing changes her from how it works today).\n\n3. nova-compute gets the connector dict from os-brick and calls update-attachment to store the connector in cinder. This returns the connection_info dict to nova, which includes the shared connection flag or whatever.\n\n4. nova-compute calls connect_volume in os-brick. And we\u0027re done.\n\n--\n\nIf #4 fails, nova calls update-attachment to null out the connector dict. This may or may not be necessary given whether or not cinder is going to use that connector for any business logic or state modeling.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":11637,"name":"jay.xu","email":"jay.xu@emc.com","username":"jay.xu"},"change_message_id":"f1a71ac4dd1f9f46f73192c39e5d21c9be45e585","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        vol \u003d objects.Volume.get_by_id(context, attachment.volume_id)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        self.volume_api.attachment_delete(context, vol, attachment)"},{"line_number":196,"context_line":"        shared_connections \u003d self.volume_api.connection_terminate(context,"},{"line_number":197,"context_line":"                                                                  vol,"},{"line_number":198,"context_line":"                                                                  attachment)"},{"line_number":199,"context_line":"        self.volume_api.unreserve_volume(context, vol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_c7af8592","line":196,"updated":"2016-11-09 07:24:55.000000000","message":"So the key point here is that the driver tell Cinder if it is share connection. If yes, it may be ignored by Nova (via os-brick) to detach volume. Correct?","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":11637,"name":"jay.xu","email":"jay.xu@emc.com","username":"jay.xu"},"change_message_id":"80985be189dba49671a305bf03ef27327135dc12","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        vol \u003d objects.Volume.get_by_id(context, attachment.volume_id)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        self.volume_api.attachment_delete(context, vol, attachment)"},{"line_number":196,"context_line":"        shared_connections \u003d self.volume_api.connection_terminate(context,"},{"line_number":197,"context_line":"                                                                  vol,"},{"line_number":198,"context_line":"                                                                  attachment)"},{"line_number":199,"context_line":"        self.volume_api.unreserve_volume(context, vol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_6f47cc1d","line":196,"in_reply_to":"9a629dbe_0833f862","updated":"2016-11-14 07:30:03.000000000","message":"How to handle the volume detachment which are attached into VM1 and VM2 on the same Host1? If the API connection_terminate() is invoked, the IO connection between Host1 and volume will be broken when the user tries to detach from VM1, for instance.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"a047db68c4caa3cf23ae19f8c902c8298771a977","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        vol \u003d objects.Volume.get_by_id(context, attachment.volume_id)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        self.volume_api.attachment_delete(context, vol, attachment)"},{"line_number":196,"context_line":"        shared_connections \u003d self.volume_api.connection_terminate(context,"},{"line_number":197,"context_line":"                                                                  vol,"},{"line_number":198,"context_line":"                                                                  attachment)"},{"line_number":199,"context_line":"        self.volume_api.unreserve_volume(context, vol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_0833f862","line":196,"in_reply_to":"9a629dbe_c7af8592","updated":"2016-11-10 17:59:58.000000000","message":"The current plan is to return info to Nova about the back end whether it shares volume connections or not so we can ensure it does not disconnect a volume from a host when there\u0027s still at least one active attachment remaining on it. When detaching a volume Nova will check the attachments on the host and will not call os-brick to disconnect if this wasn\u0027t the last attachment on the host and the connection is shared.\n\nDoes this clarify your question in some extent?","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"1c56665f8395a9f34066fe836d84b3683326f774","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            connector \u003d body[\u0027attachment\u0027][\u0027connector\u0027]"},{"line_number":147,"context_line":"        except KeyError:"},{"line_number":148,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":149,"context_line":"                explanation\u003d_(\"Must specify \u0027connector\u0027\"))"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        instance_uuid \u003d body[\u0027attachment\u0027].get(\u0027instance_uuid\u0027,"},{"line_number":152,"context_line":"                                               connector.get(\u0027host\u0027, \u0027na\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_b0c153e6","line":149,"range":{"start_line":149,"start_character":30,"end_line":149,"end_character":56},"updated":"2016-11-12 22:38:57.000000000","message":"Should \u0027connector\u0027 be mandatory here? If I remember correctly we talked about removing reserve from the flow at least the old legacy reserve_volume call and have Nova have a create attachment call. But when Nova calls that first create we don\u0027t have this info.","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ac28a9d92381ac1d5a40c4ce29fff9023f48aead","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            connector \u003d body[\u0027attachment\u0027][\u0027connector\u0027]"},{"line_number":147,"context_line":"        except KeyError:"},{"line_number":148,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":149,"context_line":"                explanation\u003d_(\"Must specify \u0027connector\u0027\"))"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        instance_uuid \u003d body[\u0027attachment\u0027].get(\u0027instance_uuid\u0027,"},{"line_number":152,"context_line":"                                               connector.get(\u0027host\u0027, \u0027na\u0027))"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_9780c44b","line":149,"range":{"start_line":149,"start_character":30,"end_line":149,"end_character":56},"in_reply_to":"9a629dbe_b0c153e6","updated":"2016-11-13 03:43:28.000000000","message":"Yeah, good catch.  This is out of date with the updates, somehow missed this.\n\nattachment_create as you pointed out should only require a volume and optionally an instance_uuid.\n\nThanks!","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"1c56665f8395a9f34066fe836d84b3683326f774","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":170,"context_line":"        return connection_info"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def finalize(self, req, body, id):"},{"line_number":173,"context_line":"        \"\"\"Finalizes a reserved attachment."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param attachment_id: The ID of the attachment to finalize."}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_108cbfd8","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":16},"updated":"2016-11-12 22:38:57.000000000","message":"I have a few questions just for my better understanding. :) We talked about update on the last Cinder-Nova meeting (documented here: http://docs-draft.openstack.org/03/373203/12/check/gate-nova-specs-docs-ubuntu-xenial/6e33afc//doc/build/html/specs/ocata/approved/cinder-new-attach-apis.html#proposed-change). Does this call cover the functionality we agreed on for update?\n\nAlso can we have a case when the attachment needs to be updated or we will always have a new attachment record and have the old outdated one deleted instead?","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ac28a9d92381ac1d5a40c4ce29fff9023f48aead","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":170,"context_line":"        return connection_info"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def finalize(self, req, body, id):"},{"line_number":173,"context_line":"        \"\"\"Finalizes a reserved attachment."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param attachment_id: The ID of the attachment to finalize."}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_17959487","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":16},"in_reply_to":"9a629dbe_108cbfd8","updated":"2016-11-13 03:43:28.000000000","message":"My intent was that his would in fact serve as the \"update\" cmd that we discussed.  After thinking about this my thought was that we weren\u0027t really interested in \"updating\" the attachment so much as we want to \"finalize/finish\" it.\n\nMy thought was that if we would remove/delete and create a new one if we wanted to do something like update the instance etc.\n\nI\u0027m open to feedback and other opinions on this,but also trying to keep the API AND the attachment object itself as simple as possible.","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c793f18515d4645f257c9b7b8b509cbc8b5a769f","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":170,"context_line":"        return connection_info"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def finalize(self, req, body, id):"},{"line_number":173,"context_line":"        \"\"\"Finalizes a reserved attachment."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param attachment_id: The ID of the attachment to finalize."}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_8b2b3d94","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":16},"in_reply_to":"9a629dbe_17959487","updated":"2016-11-13 16:51:12.000000000","message":"I was just wondering how much this might confuse people that we call this \u0027finalize\u0027 while we use it as part of an \"update\" cmd as well. So I\u0027m more nit picking about the name rather than trying to complicate the API.\n\nI understand the logic behind and it makes sense to have an attachment and when it has everything set up and it\u0027s \"finalized/finished\" we create a new one if something changes, like in case of live migrate. So trying to handle the attachments this way can help keep things more clear and straight forward.\n\nAlthough if the function is actually capable of updating the attachment that might lead to what happened with \u0027initialize_connection\u0027 in Nova, which is used to get the connection info too at random places. This is very misleading for those who don\u0027t know the history of the code and makes it hard to understand what\u0027s going on.\n\nThis was my thought behind the question as if the name does not cover the functionality of the function, but more our intention behind the function that can easily lead to messy situations again. Does it make sense?","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"1713fb0f9de567e28a212d5310d5b02de77ac240","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":170,"context_line":"        return connection_info"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def finalize(self, req, body, id):"},{"line_number":173,"context_line":"        \"\"\"Finalizes a reserved attachment."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param attachment_id: The ID of the attachment to finalize."}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_30c45891","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":16},"in_reply_to":"9a629dbe_5c08e828","updated":"2016-11-14 21:22:58.000000000","message":"Thanks for the explanation, I get the reason/purpose behind the name.\n\nI personally like better documenting what a function does as opposed to what we currently use it for when it comes to naming and here I feel \u0027finalize\u0027 requires some background. This way if people start to use it for other use cases it will be less confusing - I still have \u0027initialize_connection\u0027 as the best example.\n\nIt might be the case that having new attachments in every case when we want to change something solves the issue of someone using this function to update as a workaround. In which case the current name could be a good guidance to ensure that.\n\nMy preference is still on \u0027update\u0027, but I let others chime in at this point. :)","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"e8e96d10ecdcfb2737baf8b83219f715d8c350a5","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            raise webob.exc.HTTPInternalServerError(explanation\u003dmsg)"},{"line_number":170,"context_line":"        return connection_info"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def finalize(self, req, body, id):"},{"line_number":173,"context_line":"        \"\"\"Finalizes a reserved attachment."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param attachment_id: The ID of the attachment to finalize."}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_5c08e828","line":172,"range":{"start_line":172,"start_character":8,"end_line":172,"end_character":16},"in_reply_to":"9a629dbe_8b2b3d94","updated":"2016-11-14 16:48:40.000000000","message":"Yeah, I get what you\u0027re saying here I think.  I\u0027m pretty open to changing the name; in my mind this seemed like a \"good\" descriptive name, but as with any naming of things it\u0027s easily interpreted differently by the next person.\n\nIf folks think \"update\" is a better choice I don\u0027t have a strong object and can certainly change this.  The only reason I was hesitant is that we\u0027re not really \"updating\" the attachment in this case.  We\u0027re actually just finishing the incomplete attachment call that was made earlier so finalize made sense to me.  Like you said though, people will likely interpret this differently than I did; so I\u0027m certainly open to change.  Just wanted to describe my thought/choice and see what you and others think after that.","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"5e99639af5804ab5ee3bda6bb677a80df3f99a96","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                           instance_uuid)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @wsgi.response(202)"},{"line_number":125,"context_line":"    def create(self, req, body):"},{"line_number":126,"context_line":"        \"\"\"Create an attachment."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        This method completes an attachment operation on an existing reserved"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_55700aa4","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":14},"updated":"2016-11-18 19:22:33.000000000","message":"Just for my clarity.\n\nIn case of the Nova flow we would call reserve from the Nova API to see whether the volume is available to attach (not attached yet or multi-attach volume, etc.) and then reserve it as we don\u0027t have the connector at that time.\n\nWhen we have the host and the connector from os-brick we call create, which will actually fill the attachment record with information and creates the connection between the volume and the host.\n\nIs my understanding correct?","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9b931edd4f39712e5950805eaf7cbc2e57004819","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                           instance_uuid)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @wsgi.response(202)"},{"line_number":125,"context_line":"    def create(self, req, body):"},{"line_number":126,"context_line":"        \"\"\"Create an attachment."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        This method completes an attachment operation on an existing reserved"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_d5dfbad3","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":14},"in_reply_to":"7a77a97e_55700aa4","updated":"2016-11-18 19:33:55.000000000","message":"Yep, exactly, and as an added bonus; for those cases that they don\u0027t need to pre-reserve the attachment (they have the connector and everything and haven\u0027t called reserve) they can just call create with a volume-id and get everything automatically that way.","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"8b20ec88359124226171cea19b3008a0438d9278","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                                           instance_uuid)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @wsgi.response(202)"},{"line_number":125,"context_line":"    def create(self, req, body):"},{"line_number":126,"context_line":"        \"\"\"Create an attachment."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        This method completes an attachment operation on an existing reserved"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_98e5790a","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":14},"in_reply_to":"7a77a97e_d5dfbad3","updated":"2016-11-18 19:53:51.000000000","message":"Great, that sounds pretty good I think. :)\n\nThanks for confirming.","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        reserved and prevent any new attachment_create calls from being made"},{"line_number":102,"context_line":"        until the attachment is updated (completed)."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        The alternative is that the connection can be reserved an initialized"},{"line_number":105,"context_line":"        all at once with a single call if the caller has all of the required"},{"line_number":106,"context_line":"        information (connector data) at the time of the call."},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_2c4adcc5","line":104,"range":{"start_line":104,"start_character":63,"end_line":104,"end_character":65},"updated":"2016-12-09 14:16:51.000000000","message":"nit: and","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @wsgi.Controller.api_version(\u00273.16\u0027)"},{"line_number":204,"context_line":"    def delete(self, req, id):"},{"line_number":205,"context_line":"        \"\"\"Delete an attachment ."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        Disconnects/Deletes the specified attachment, returns a list of any"},{"line_number":208,"context_line":"        known shared attachment-id\u0027s for the effected backend device."}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_2c59fc5a","line":205,"range":{"start_line":205,"start_character":31,"end_line":205,"end_character":32},"updated":"2016-12-09 14:16:51.000000000","message":"nit: delete whitespace","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"}],"cinder/objects/volume_attachment.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    def get_all(cls, context, search_opts\u003dNone,"},{"line_number":125,"context_line":"                marker\u003dNone, limit\u003dNone, offset\u003dNone,"},{"line_number":126,"context_line":"                sort_keys\u003dNone, sort_direction\u003dNone):"},{"line_number":127,"context_line":"        attachments \u003d db.volume_attachments_get_all("},{"line_number":128,"context_line":"            context, search_opts, marker, limit, offset, sort_keys,"},{"line_number":129,"context_line":"            sort_direction)"},{"line_number":130,"context_line":"        return base.obj_make_list(context, cls(context),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_929f8602","side":"PARENT","line":127,"range":{"start_line":127,"start_character":42,"end_line":127,"end_character":43},"updated":"2016-12-09 14:16:51.000000000","message":"This should be corrected in the previous patch in the chain.","commit_id":"8ae5b89a29adcea3e13fda44defe77843d95c126"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    def get_all_by_project(cls, context, project_id, search_opts\u003dNone,"},{"line_number":135,"context_line":"                           marker\u003dNone, limit\u003dNone, offset\u003dNone,"},{"line_number":136,"context_line":"                           sort_keys\u003dNone, sort_direction\u003dNone):"},{"line_number":137,"context_line":"        attachments \u003d db.volume_attachments_get_all_by_project("},{"line_number":138,"context_line":"            context, project_id, search_opts, marker, limit, offset, sort_keys,"},{"line_number":139,"context_line":"            sort_direction)"},{"line_number":140,"context_line":"        return base.obj_make_list(context, cls(context),"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_129456e0","side":"PARENT","line":137,"range":{"start_line":137,"start_character":42,"end_line":137,"end_character":43},"updated":"2016-12-09 14:16:51.000000000","message":"Same here.","commit_id":"8ae5b89a29adcea3e13fda44defe77843d95c126"}],"cinder/volume/manager.py":[{"author":{"_account_id":11637,"name":"jay.xu","email":"jay.xu@emc.com","username":"jay.xu"},"change_message_id":"f1a71ac4dd1f9f46f73192c39e5d21c9be45e585","unresolved":false,"context_lines":[{"line_number":4330,"context_line":"            attachment.id)"},{"line_number":4331,"context_line":""},{"line_number":4332,"context_line":"        try:"},{"line_number":4333,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4334,"context_line":"                                                                  connector,"},{"line_number":4335,"context_line":"                                                                  force\u003dforce)"},{"line_number":4336,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_0786ddb8","line":4333,"updated":"2016-11-09 07:24:55.000000000","message":"The driver may not have the capability to return share_connections info at all with the input parameter connector. IMHO, attach list (i.e. self.db.volume_attachment_get_all_by_volume_id(context, volume.id)) is also necessary for the driver to identify if it is share connections or not.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"5d8947ea674308b8d2f2c42d4df5aecc11a50a46","unresolved":false,"context_lines":[{"line_number":4330,"context_line":"            attachment.id)"},{"line_number":4331,"context_line":""},{"line_number":4332,"context_line":"        try:"},{"line_number":4333,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4334,"context_line":"                                                                  connector,"},{"line_number":4335,"context_line":"                                                                  force\u003dforce)"},{"line_number":4336,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_26a7da0b","line":4333,"in_reply_to":"9a629dbe_0786ddb8","updated":"2016-11-11 22:37:05.000000000","message":"Most drivers don\u0027t have to worry about this at all, this is something that\u0027s been raised as a concern, but I haven\u0027t worked with a driver that actually shares a single connection for multiple volumes.  The thing is that it\u0027s not something we keep any concept of today.  Your mention of \"get_all_by_volume_id\"  is I believe confusing the multi-attach case with the concept of shared connections which is different.\n\nThe shared connection example that\u0027s been raised has been \"I have volume-a and volume-b attached to different instances on the same host... and that those connections are related/shared by each other\".  I\u0027ve yet to gather an actual detail of how this works, who uses it etc; but put this here as a response to statements that it was required.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":11637,"name":"jay.xu","email":"jay.xu@emc.com","username":"jay.xu"},"change_message_id":"f1a71ac4dd1f9f46f73192c39e5d21c9be45e585","unresolved":false,"context_lines":[{"line_number":4367,"context_line":"                LOG.debug(\u0027Deleting attachment %(attachment_id)s.\u0027,"},{"line_number":4368,"context_line":"                          {\u0027attachment_id\u0027: attachment.id},"},{"line_number":4369,"context_line":"                          resource\u003dvolume)"},{"line_number":4370,"context_line":"                self.driver.detach_volume(context, volume, attachment)"},{"line_number":4371,"context_line":"                self.driver.remove_export(context.elevated(), volume)"},{"line_number":4372,"context_line":"            except Exception:"},{"line_number":4373,"context_line":"                # FIXME(jdg): Obviously our volume object is going to need some"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_873bcd9b","line":4370,"updated":"2016-11-09 07:24:55.000000000","message":"What is the purpose to call self.driver.detach_volume() again here? First time to call this function in line #4365.","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"5d8947ea674308b8d2f2c42d4df5aecc11a50a46","unresolved":false,"context_lines":[{"line_number":4367,"context_line":"                LOG.debug(\u0027Deleting attachment %(attachment_id)s.\u0027,"},{"line_number":4368,"context_line":"                          {\u0027attachment_id\u0027: attachment.id},"},{"line_number":4369,"context_line":"                          resource\u003dvolume)"},{"line_number":4370,"context_line":"                self.driver.detach_volume(context, volume, attachment)"},{"line_number":4371,"context_line":"                self.driver.remove_export(context.elevated(), volume)"},{"line_number":4372,"context_line":"            except Exception:"},{"line_number":4373,"context_line":"                # FIXME(jdg): Obviously our volume object is going to need some"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a629dbe_6694728a","line":4370,"in_reply_to":"9a629dbe_873bcd9b","updated":"2016-11-11 22:37:05.000000000","message":"4365 doesn\u0027t belong there, thanks!","commit_id":"ff51cebcb440c0a8f47221085e8e26b3ba4e6209"},{"author":{"_account_id":11637,"name":"jay.xu","email":"jay.xu@emc.com","username":"jay.xu"},"change_message_id":"c9222196a5a3000af3c13a5b76b20fe2a53734f0","unresolved":false,"context_lines":[{"line_number":4388,"context_line":"            attachment.id)"},{"line_number":4389,"context_line":""},{"line_number":4390,"context_line":"        try:"},{"line_number":4391,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4392,"context_line":"                                                                  connector,"},{"line_number":4393,"context_line":"                                                                  force\u003dforce)"},{"line_number":4394,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_8fe420ad","line":4391,"updated":"2016-11-14 07:45:29.000000000","message":"Is the following user case considered:\nVolA is attached to VM1 and VM2 in the same host `Host1`, and the user wants to detach VolA from VM1. \n\nHere the driver has no way to differentiate these two VMs. \n\nOnce the API teminate_connection() is invoked, the IO connection between Host1 and backend storage may be broken.","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"75f83e45f7c5a071d4207069808fce92d2815ebb","unresolved":false,"context_lines":[{"line_number":4388,"context_line":"            attachment.id)"},{"line_number":4389,"context_line":""},{"line_number":4390,"context_line":"        try:"},{"line_number":4391,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4392,"context_line":"                                                                  connector,"},{"line_number":4393,"context_line":"                                                                  force\u003dforce)"},{"line_number":4394,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_ab89b2cc","line":4391,"in_reply_to":"7a77a97e_ea73c1b2","updated":"2016-11-15 15:31:49.000000000","message":"@jay.xu\nYeah, for now we don\u0027t support that and this particular change does not intend to start allowing it.  It does lay a foundation for us to move int hat direction but it is not the focus of the changes here.","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"e8e96d10ecdcfb2737baf8b83219f715d8c350a5","unresolved":false,"context_lines":[{"line_number":4388,"context_line":"            attachment.id)"},{"line_number":4389,"context_line":""},{"line_number":4390,"context_line":"        try:"},{"line_number":4391,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4392,"context_line":"                                                                  connector,"},{"line_number":4393,"context_line":"                                                                  force\u003dforce)"},{"line_number":4394,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_a8a3834e","line":4391,"in_reply_to":"9a629dbe_8fe420ad","updated":"2016-11-14 16:48:40.000000000","message":"It\u0027s considered, yes; but we\u0027re not attempting to support it yet.  This work is intended to make things like the multi-attach easier as a follow up.\n\nThe strategy has been that we would use unique attachments for multi-attach and indicate if they are shared or not (particularly in the case of multi-attach).","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":11637,"name":"jay.xu","email":"jay.xu@emc.com","username":"jay.xu"},"change_message_id":"97525f21fd5ade9f0f1fdd8878a3c8ead96fb805","unresolved":false,"context_lines":[{"line_number":4388,"context_line":"            attachment.id)"},{"line_number":4389,"context_line":""},{"line_number":4390,"context_line":"        try:"},{"line_number":4391,"context_line":"            shared_connections \u003d self.driver.terminate_connection(volume,"},{"line_number":4392,"context_line":"                                                                  connector,"},{"line_number":4393,"context_line":"                                                                  force\u003dforce)"},{"line_number":4394,"context_line":"            if shared_connections is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_ea73c1b2","line":4391,"in_reply_to":"9a629dbe_a8a3834e","updated":"2016-11-15 03:13:03.000000000","message":"Thanks, John. \nWill the following use case be blocked?\n* Volume attachment would fail when trying to attach the same volume to multiple VMs which are in the same host.\n\nOtherwise it would make the problem when the user tries to detach the volume from one VM.","commit_id":"a989ee80de60ba7364de8e925e28494e78edf45f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1d15ec79d3b78e14c2242ddc220a91648c550ef0","unresolved":false,"context_lines":[{"line_number":4273,"context_line":""},{"line_number":4274,"context_line":"        # Don\u0027t forget to add the attachment_id"},{"line_number":4275,"context_line":"        conn_info[\u0027attachment_id\u0027] \u003d attachment.id"},{"line_number":4276,"context_line":"        return conn_info"},{"line_number":4277,"context_line":""},{"line_number":4278,"context_line":"    def _connection_create(self, ctxt, volume, attachment, connector):"},{"line_number":4279,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a74a57a_71dddd6f","line":4276,"range":{"start_line":4276,"start_character":15,"end_line":4276,"end_character":24},"updated":"2016-11-23 13:40:02.000000000","message":"Can we model this as o.vo? Would be better to have this strongly structured instead of using dict. I can help with modeling, just ping me on IRC and I\u0027ll get you the code. ;)","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"05614c8faea2921cbc00481462c3fcca32a977bf","unresolved":false,"context_lines":[{"line_number":4273,"context_line":""},{"line_number":4274,"context_line":"        # Don\u0027t forget to add the attachment_id"},{"line_number":4275,"context_line":"        conn_info[\u0027attachment_id\u0027] \u003d attachment.id"},{"line_number":4276,"context_line":"        return conn_info"},{"line_number":4277,"context_line":""},{"line_number":4278,"context_line":"    def _connection_create(self, ctxt, volume, attachment, connector):"},{"line_number":4279,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a74a57a_9b41aa3c","line":4276,"range":{"start_line":4276,"start_character":15,"end_line":4276,"end_character":24},"in_reply_to":"5a74a57a_71dddd6f","updated":"2016-11-23 17:15:57.000000000","message":"Yeah, probably a good idea; I think that currently there are a number of backend types that have some unique fields here so we\u0027ll have to make sure to hammer that out but certainly seems like it might be better to do that from the start.","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"53426782f53cc50a5d081b708627e06e4261dc3b","unresolved":false,"context_lines":[{"line_number":4273,"context_line":""},{"line_number":4274,"context_line":"        # Don\u0027t forget to add the attachment_id"},{"line_number":4275,"context_line":"        conn_info[\u0027attachment_id\u0027] \u003d attachment.id"},{"line_number":4276,"context_line":"        return conn_info"},{"line_number":4277,"context_line":""},{"line_number":4278,"context_line":"    def _connection_create(self, ctxt, volume, attachment, connector):"},{"line_number":4279,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a74a57a_cb940ce4","line":4276,"range":{"start_line":4276,"start_character":15,"end_line":4276,"end_character":24},"in_reply_to":"5a74a57a_9b41aa3c","updated":"2016-11-24 10:42:50.000000000","message":"Aw, I was hoping we don\u0027t have special snowflakes here, this always makes things harder. Anyway it\u0027s another argument that structurizing is worth it as right now we don\u0027t really know what\u0027s flying here.\n\nI\u0027ll try looking into it.","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1d15ec79d3b78e14c2242ddc220a91648c550ef0","unresolved":false,"context_lines":[{"line_number":4380,"context_line":"        self._notify_about_volume_usage(context, volume, \"attach.end\")"},{"line_number":4381,"context_line":"        LOG.info(_LI(\"Attach volume completed successfully.\"),"},{"line_number":4382,"context_line":"                 resource\u003dvolume)"},{"line_number":4383,"context_line":"        return connection_info"},{"line_number":4384,"context_line":""},{"line_number":4385,"context_line":"    def _connection_terminate(self, context, volume,"},{"line_number":4386,"context_line":"                              attachment, force\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a74a57a_96cb4f72","line":4383,"range":{"start_line":4383,"start_character":15,"end_line":4383,"end_character":30},"updated":"2016-11-23 13:40:02.000000000","message":"And same here.","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1d15ec79d3b78e14c2242ddc220a91648c550ef0","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        version \u003d self._compat_ver(\u00273.2\u0027)"},{"line_number":359,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, version\u003dversion)"},{"line_number":360,"context_line":"        return cctxt.call(ctxt,"},{"line_number":361,"context_line":"                          \u0027attachment_details\u0027,"},{"line_number":362,"context_line":"                          attachment\u003dattachment)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def attachment_remove(self, ctxt, attachment, volume):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a74a57a_56d617c6","line":361,"range":{"start_line":361,"start_character":27,"end_line":361,"end_character":45},"updated":"2016-11-23 13:40:02.000000000","message":"This is missing from VolumeManager, I think","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"05614c8faea2921cbc00481462c3fcca32a977bf","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        version \u003d self._compat_ver(\u00273.2\u0027)"},{"line_number":359,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, version\u003dversion)"},{"line_number":360,"context_line":"        return cctxt.call(ctxt,"},{"line_number":361,"context_line":"                          \u0027attachment_details\u0027,"},{"line_number":362,"context_line":"                          attachment\u003dattachment)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def attachment_remove(self, ctxt, attachment, volume):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a74a57a_bbaca6ee","line":361,"range":{"start_line":361,"start_character":27,"end_line":361,"end_character":45},"in_reply_to":"5a74a57a_56d617c6","updated":"2016-11-23 17:15:57.000000000","message":"Yup, you noticed :)","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1d15ec79d3b78e14c2242ddc220a91648c550ef0","unresolved":false,"context_lines":[{"line_number":368,"context_line":"                          \u0027attachment_remove\u0027,"},{"line_number":369,"context_line":"                          attachment\u003dattachment)"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    def attachment_remove_all(self, ctxt, volume):"},{"line_number":372,"context_line":"        version \u003d self._compat_ver(\u00273.2\u0027)"},{"line_number":373,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, version\u003dversion)"},{"line_number":374,"context_line":"        return cctxt.call(ctxt,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a74a57a_b14bf558","line":371,"range":{"start_line":371,"start_character":8,"end_line":371,"end_character":29},"updated":"2016-11-23 13:40:02.000000000","message":"Same here.","commit_id":"0893946186baec581e78eab27a1e004b2ed01451"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        cctxt.cast(ctxt, \u0027delete_group_snapshot\u0027,"},{"line_number":365,"context_line":"                   group_snapshot\u003dgroup_snapshot)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def attachment_finalize(self, ctxt, attachment, volume, connector):"},{"line_number":368,"context_line":"        version \u003d self._compat_ver(\u00273.3\u0027)"},{"line_number":369,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, version\u003dversion)"},{"line_number":370,"context_line":"        return cctxt.call(ctxt,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_b5854c08","line":367,"range":{"start_line":367,"start_character":8,"end_line":367,"end_character":27},"updated":"2016-12-09 14:16:51.000000000","message":"Shouldn\u0027t this be \u0027attachment_update\u0027?","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        version \u003d self._compat_ver(\u00273.3\u0027)"},{"line_number":369,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, version\u003dversion)"},{"line_number":370,"context_line":"        return cctxt.call(ctxt,"},{"line_number":371,"context_line":"                          \u0027attachment_finalize\u0027,"},{"line_number":372,"context_line":"                          attachment\u003dattachment,"},{"line_number":373,"context_line":"                          connector\u003dconnector)"},{"line_number":374,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_1577e03a","line":371,"range":{"start_line":371,"start_character":27,"end_line":371,"end_character":46},"updated":"2016-12-09 14:16:51.000000000","message":"Same here.","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"}],"doc/source/devref/attach_detach_conventions_v2.rst":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"We actually already had a VolumeAttachment Table in the db, however we"},{"line_number":36,"context_line":"weren\u0027t really using it, or it at least using it efficiently. For V2 of attach"},{"line_number":37,"context_line":"flow we\u0027ll use the Attachment Table (object) as the primary handle for managing"},{"line_number":38,"context_line":"attachment(s) for a volume."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a71b18c_d5d1e8fc","line":36,"range":{"start_line":36,"start_character":28,"end_line":36,"end_character":30},"updated":"2016-12-09 14:16:51.000000000","message":"Delete this \u0027it\u0027?","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"lost connector info, or trying to reassemble it."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"New API and Flow"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"```"},{"line_number":48,"context_line":"attachment_reserve \u003cinstance_uuid\u003e \u003cvolume_id\u003e"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a71b18c_752e54fb","line":45,"range":{"start_line":45,"start_character":16,"end_line":45,"end_character":17},"updated":"2016-12-09 14:16:51.000000000","message":"You can delete the last \u0027\u003d\u0027.","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"```"},{"line_number":48,"context_line":"attachment_reserve \u003cinstance_uuid\u003e \u003cvolume_id\u003e"},{"line_number":49,"context_line":"```"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"The attachment_reserve call simply creates an empty Attachment record for the"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a71b18c_75157499","line":48,"range":{"start_line":48,"start_character":0,"end_line":48,"end_character":18},"updated":"2016-12-09 14:16:51.000000000","message":"s/attachment_reserve/attachment_create/","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":48,"context_line":"attachment_reserve \u003cinstance_uuid\u003e \u003cvolume_id\u003e"},{"line_number":49,"context_line":"```"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"The attachment_reserve call simply creates an empty Attachment record for the"},{"line_number":52,"context_line":"specified Volume with an optional Instance UUID field set.  This is"},{"line_number":53,"context_line":"particularly useful for cases like Nova Boot from Volume where Nova hasn\u0027t sent"},{"line_number":54,"context_line":"the job to the actual Compute host yet, but needs to make initial preparations"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a71b18c_b50f0c87","line":51,"range":{"start_line":51,"start_character":4,"end_line":51,"end_character":22},"updated":"2016-12-09 14:16:51.000000000","message":"Ditto.","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":64,"context_line":"monitor that status changes themeselves."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"The attachment_create call can be used in one of two ways:"},{"line_number":67,"context_line":"1. Complete the Attach process on an Attachment object from an"},{"line_number":68,"context_line":"   attachment_reserve call.  In this case the attachment_create call requires"},{"line_number":69,"context_line":"   a valid AttachmentID to update.  The VolumeID is stored in the Attachment"},{"line_number":70,"context_line":"   record from the earlier reserve and is used to direct the call to the proper"},{"line_number":71,"context_line":"   backend and make the needed connection object."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"2. Create and Complete the Attachment process in one call.  The Reserve process"},{"line_number":74,"context_line":"   is only needed in certain cases, in many cases Nova actually has enough"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a71b18c_f568a423","line":71,"range":{"start_line":67,"start_character":3,"end_line":71,"end_character":49},"updated":"2016-12-09 14:16:51.000000000","message":"This is now attachment_update.","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"param instance-uuid: The ID of the Instance we\u0027ll be attaching to"},{"line_number":84,"context_line":"param volume-id: The ID of the volume to reserve an Attachment record for"},{"line_number":85,"context_line":"rtyp: string:`VolumeAttachmentID`"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"```"},{"line_number":88,"context_line":"cinder --os-volume-api-version 3 attachment-reserve --instance \u003cinstance-uuid\u003e  \u003cvolume-id\u003e"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a71b18c_354a1cad","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":4},"updated":"2016-12-09 14:16:51.000000000","message":"type","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"56eedd2df5afb306ca2241a103c75b49fa0caaf1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"param connector: Dictionary of connection info"},{"line_number":95,"context_line":"param mode: `rw` or `ro` (defaults to `rw` if omitted)."},{"line_number":96,"context_line":"param mountpoint: Mountpoint of remote attachment."},{"line_number":97,"context_line":"rtype: :class:`VolumeAttachment`"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"Example connector:"},{"line_number":100,"context_line":"    {\u0027initiator\u0027: \u0027iqn.1993-08.org.debian:01:cad181614cec\u0027,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3a71b18c_95d130d0","line":97,"range":{"start_line":97,"start_character":0,"end_line":97,"end_character":5},"updated":"2016-12-09 14:16:51.000000000","message":"type","commit_id":"ef89cf20d7cc56752ec4796e11b526a43c471e1c"}]}
