)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement new attach Cinder flow"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add implementation of the standard secondary volume"},{"line_number":10,"context_line":"attachment using Cinder\u0027s new Attach API."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The patch bumps the compute service version to"},{"line_number":13,"context_line":"check whether all the compute nodes are upgraded to the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":88,"id":"3f1d235d_c3e220a1","line":10,"range":{"start_line":9,"start_character":26,"end_line":10,"end_character":10},"updated":"2017-07-07 15:13:04.000000000","message":"I\u0027m not sure what \"standard secondary volume attachment\" means. That makes me think of multiattach, i.e. I\u0027ve got one attachment, and then there is a second attachment, which isn\u0027t the case here.\n\nThis is probably more clear written as something like, \"This change integrates support of the Cinder 3.27 volume attachments API.\"","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement new attach Cinder flow"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add implementation of the standard secondary volume"},{"line_number":10,"context_line":"attachment using Cinder\u0027s new Attach API."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The patch bumps the compute service version to"},{"line_number":13,"context_line":"check whether all the compute nodes are upgraded to the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":88,"id":"3f1d235d_fecb6e47","line":10,"range":{"start_line":9,"start_character":26,"end_line":10,"end_character":10},"in_reply_to":"3f1d235d_c3e220a1","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"34a69535f4bf408beb7a00ce74a71fa144d5dab3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"Co-Authored-By: Ildiko Vancsa \u003cildiko.vancsa@gmail.com\u003e"},{"line_number":23,"context_line":"Depends-On: Ia84f4325ddb0080521241ace26f89d1161db9dca"},{"line_number":24,"context_line":"Depends-On: Ib448f0548739cd42edf03eab07f305b3ac184d8f"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: Ifc01dbf98545104c998ab96f65ff8623a6db0f28"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":93,"id":"1f1a1f67_8eeafca9","line":25,"updated":"2017-07-20 16:03:34.000000000","message":"Let\u0027s also depend on the grenade patch for testing:\n\nI880157c72d40024f9a4aa4f288d583d1f1468641","commit_id":"5cd8af5f20727cf6573f94a5fc3eaf1db74d8f93"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4bc83ba987e739fb083b762b370f356da25101be","unresolved":false,"context_lines":[{"line_number":22,"context_line":"Co-Authored-By: Ildiko Vancsa \u003cildiko.vancsa@gmail.com\u003e"},{"line_number":23,"context_line":"Depends-On: Ia84f4325ddb0080521241ace26f89d1161db9dca"},{"line_number":24,"context_line":"Depends-On: Ib448f0548739cd42edf03eab07f305b3ac184d8f"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: Ifc01dbf98545104c998ab96f65ff8623a6db0f28"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":93,"id":"1f1a1f67_ae125861","line":25,"in_reply_to":"1f1a1f67_8eeafca9","updated":"2017-07-20 16:14:21.000000000","message":"We also need Ica4d718b3de31c31da047f07c5154b242e122596 or the global-requirements minimum version bump that will include it\u0027s released version.","commit_id":"5cd8af5f20727cf6573f94a5fc3eaf1db74d8f93"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Depends-On: I0bfb11296430dfffe9b091ae7c3a793617bd9d0d"},{"line_number":25,"context_line":"Depends-On: Ibe5dbdc4644ec812f0435f59319666fc336c195a"},{"line_number":26,"context_line":"Depends-On: I5545d0807626b353ca723ab1f125fd1f94bcef2e"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: Ifc01dbf98545104c998ab96f65ff8623a6db0f28"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":153,"id":"ff82abbf_e821194f","line":26,"updated":"2017-11-22 15:30:04.000000000","message":"Nit: these have all merged now I think, so we can probably drop them?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Depends-On: I0bfb11296430dfffe9b091ae7c3a793617bd9d0d"},{"line_number":25,"context_line":"Depends-On: Ibe5dbdc4644ec812f0435f59319666fc336c195a"},{"line_number":26,"context_line":"Depends-On: I5545d0807626b353ca723ab1f125fd1f94bcef2e"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: Ifc01dbf98545104c998ab96f65ff8623a6db0f28"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":153,"id":"ff82abbf_e3f84f4a","line":26,"in_reply_to":"ff82abbf_e821194f","updated":"2017-11-23 02:34:54.000000000","message":"Done","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"}],"doc/notification_samples/service-update.json":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":13,"context_line":"            \"disabled_reason\": null,"},{"line_number":14,"context_line":"            \"report_count\": 1,"},{"line_number":15,"context_line":"            \"forced_down\": false,"},{"line_number":16,"context_line":"            \"version\": 23,"},{"line_number":17,"context_line":"            \"availability_zone\": null,"},{"line_number":18,"context_line":"            \"uuid\": \"fa69c544-906b-4a6a-a9c6-c1f7a8078c73\""},{"line_number":19,"context_line":"        }"}],"source_content_type":"application/json","patch_set":136,"id":"5f2577a7_15bfafb0","line":16,"updated":"2017-09-14 19:55:19.000000000","message":"It is not needed any more as https://review.openstack.org/#/c/499957/ is being merged.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"}],"nova/api/openstack/compute/volumes.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":485,"context_line":"                    \u0027detach_volume\u0027, server_id)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        if not found:"},{"line_number":488,"context_line":"            msg \u003d _(\"volume_id not found in current bdms: %s\") % volume_id"},{"line_number":489,"context_line":"            raise exc.HTTPNotFound(explanation\u003dmsg)"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":""}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_23ed548b","line":488,"updated":"2017-07-07 15:13:04.000000000","message":"I think we can remove this, I\u0027m not sure why it was added or necessary here. Also, bdms is an internal term for the most part.","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":485,"context_line":"                    \u0027detach_volume\u0027, server_id)"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        if not found:"},{"line_number":488,"context_line":"            msg \u003d _(\"volume_id not found in current bdms: %s\") % volume_id"},{"line_number":489,"context_line":"            raise exc.HTTPNotFound(explanation\u003dmsg)"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":""}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_1ba19c96","line":488,"in_reply_to":"3f1d235d_23ed548b","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":1783,"context_line":"                #             connector. This can be improved when we"},{"line_number":1784,"context_line":"                #             expose get_volume_connector to rpc."},{"line_number":1785,"context_line":""},{"line_number":1786,"context_line":"                # NOTE(jdg): Uh-Oh.. isn\u0027t this somethign that should\u0027ve been"},{"line_number":1787,"context_line":"                # fixed up by os-brick?"},{"line_number":1788,"context_line":"                connector \u003d {\u0027ip\u0027: \u0027127.0.0.1\u0027, \u0027initiator\u0027: \u0027iqn.fake\u0027}"},{"line_number":1789,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_2ea03af4","line":1786,"updated":"2016-06-20 16:58:02.000000000","message":"Yeah, but this is the wonky local-delete (local delete for the API service, not the compute). The compute service that was hosting the instance is down, so local-delete is just cleaning up the database since we can\u0027t RPC to the compute node to do cleanup work on the compute host.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":1783,"context_line":"                #             connector. This can be improved when we"},{"line_number":1784,"context_line":"                #             expose get_volume_connector to rpc."},{"line_number":1785,"context_line":""},{"line_number":1786,"context_line":"                # NOTE(jdg): Uh-Oh.. isn\u0027t this somethign that should\u0027ve been"},{"line_number":1787,"context_line":"                # fixed up by os-brick?"},{"line_number":1788,"context_line":"                connector \u003d {\u0027ip\u0027: \u0027127.0.0.1\u0027, \u0027initiator\u0027: \u0027iqn.fake\u0027}"},{"line_number":1789,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_df48425e","line":1786,"in_reply_to":"5a9d85d2_2ea03af4","updated":"2016-06-20 17:45:52.000000000","message":"Done","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"7a0f61badf02e81c0223c81dd29832a7468eab4c","unresolved":false,"context_lines":[{"line_number":3699,"context_line":"    def _do_volume_attach_shelved(self, context, volume_id,"},{"line_number":3700,"context_line":"                                  instance, device, volume_bdm):"},{"line_number":3701,"context_line":"        try:"},{"line_number":3702,"context_line":"            self._check_attach_and_reserve_volume(context, volume_id, instance)"},{"line_number":3703,"context_line":"            attachment \u003d self.volume_api.create_attachment(context,"},{"line_number":3704,"context_line":"                                                           volume_id,"},{"line_number":3705,"context_line":"                                                           instance.uuid)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a430d35_23a975e0","line":3702,"updated":"2017-02-09 20:54:23.000000000","message":"Shouldn\u0027t the volume_bdm be included in this call to avoid a throw on volume_bdm.connection_info \u003d ?","commit_id":"172fe5c0ca0d77ff70a9722478971c5f048b6a59"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"733d6270939e402bca40847462d80d666c98652c","unresolved":false,"context_lines":[{"line_number":3699,"context_line":"    def _do_volume_attach_shelved(self, context, volume_id,"},{"line_number":3700,"context_line":"                                  instance, device, volume_bdm):"},{"line_number":3701,"context_line":"        try:"},{"line_number":3702,"context_line":"            self._check_attach_and_reserve_volume(context, volume_id, instance)"},{"line_number":3703,"context_line":"            attachment \u003d self.volume_api.create_attachment(context,"},{"line_number":3704,"context_line":"                                                           volume_id,"},{"line_number":3705,"context_line":"                                                           instance.uuid)"}],"source_content_type":"text/x-python","patch_set":25,"id":"da36d5c6_ea8ebf2c","line":3702,"in_reply_to":"1a430d35_23a975e0","updated":"2017-02-23 16:15:31.000000000","message":"Correct, left out by mistake.","commit_id":"172fe5c0ca0d77ff70a9722478971c5f048b6a59"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"63abce4faf6337957ae3b17e6098181507f38469","unresolved":false,"context_lines":[{"line_number":2077,"context_line":"            if bdm.delete_on_termination:"},{"line_number":2078,"context_line":"                self.volume_api.delete(context, bdm.volume_id)"},{"line_number":2079,"context_line":"        except Exception as exc:"},{"line_number":2080,"context_line":"            err_str \u003d (_LW(\"Ignoring volume cleanup failure due to %s(error)\"),"},{"line_number":2081,"context_line":"                       {\u0027error\u0027: exc})"},{"line_number":2082,"context_line":"            LOG.warning(err_str, instance\u003dinstance)"},{"line_number":2083,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba2be162_d9919848","line":2080,"range":{"start_line":2080,"start_character":67,"end_line":2080,"end_character":76},"updated":"2017-03-06 08:54:03.000000000","message":"It should be \u0027%(error)s\u0027.","commit_id":"d5b9bd8c34bd785652db7d2425c0aaf63483fd3c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":3712,"context_line":"            attachment \u003d self.volume_api.attachment_create(context,"},{"line_number":3713,"context_line":"                                                           volume_id,"},{"line_number":3714,"context_line":"                                                           instance.uuid)"},{"line_number":3715,"context_line":"            volume_bdm.connection_info \u003d ("},{"line_number":3716,"context_line":"                jsonutils.dumps({\u0027attachment_id\u0027: attachment[\u0027id\u0027]}))"},{"line_number":3717,"context_line":"            volume_bdm.save()"},{"line_number":3718,"context_line":""},{"line_number":3719,"context_line":"        return volume"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_a4ee271f","line":3716,"range":{"start_line":3715,"start_character":12,"end_line":3716,"end_character":69},"updated":"2017-05-25 03:14:21.000000000","message":"We shouldn\u0027t be doing this, we have the bdm.attachmend_id field for storing the id of the attachment we created.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":3712,"context_line":"            attachment \u003d self.volume_api.attachment_create(context,"},{"line_number":3713,"context_line":"                                                           volume_id,"},{"line_number":3714,"context_line":"                                                           instance.uuid)"},{"line_number":3715,"context_line":"            volume_bdm.connection_info \u003d ("},{"line_number":3716,"context_line":"                jsonutils.dumps({\u0027attachment_id\u0027: attachment[\u0027id\u0027]}))"},{"line_number":3717,"context_line":"            volume_bdm.save()"},{"line_number":3718,"context_line":""},{"line_number":3719,"context_line":"        return volume"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_28b41af1","line":3716,"range":{"start_line":3715,"start_character":12,"end_line":3716,"end_character":69},"in_reply_to":"ff0f0b1f_a4ee271f","updated":"2017-05-25 23:43:14.000000000","message":"Yeah, this is super old and was part of the original series before we had the bdm field.  I\u0027ll get it updated.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":3740,"context_line":""},{"line_number":3741,"context_line":"    def _do_legacy_volume_attach_shelved(self, context, volume_id,"},{"line_number":3742,"context_line":"                                         volume_bdm, device, instance):"},{"line_number":3743,"context_line":"        LOG.warning(_LW(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":3744,"context_line":"                        \u0027shelved Instance.  Please update your cinder \u0027"},{"line_number":3745,"context_line":"                        \u0027installation, or your configured API version.\u0027),"},{"line_number":3746,"context_line":"                    volume_id, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_e4df7f63","line":3743,"range":{"start_line":3743,"start_character":20,"end_line":3743,"end_character":23},"updated":"2017-05-25 03:14:21.000000000","message":"We don\u0027t translate logs anymore so don\u0027t need this.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":3758,"context_line":"                                  instance, device, volume_bdm):"},{"line_number":3759,"context_line":"        try:"},{"line_number":3760,"context_line":"            self._check_attach_and_reserve_volume(context, volume_id, instance)"},{"line_number":3761,"context_line":"            attachment \u003d self.volume_api.attachment_create(context,"},{"line_number":3762,"context_line":"                                                           volume_id,"},{"line_number":3763,"context_line":"                                                           instance.uuid)"},{"line_number":3764,"context_line":"            volume_bdm.connection_info \u003d ("},{"line_number":3765,"context_line":"                jsonutils.dumps({\u0027attachment_id\u0027: attachment[\u0027id\u0027]}))"},{"line_number":3766,"context_line":"            volume_bdm.save()"},{"line_number":3767,"context_line":"        except Exception:"},{"line_number":3768,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3769,"context_line":"                volume_bdm.destroy()"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_e4b89f11","line":3766,"range":{"start_line":3761,"start_character":12,"end_line":3766,"end_character":29},"updated":"2017-05-25 03:14:21.000000000","message":"This is already all done in _check_attach_and_reserve_volume, plus you need to pass the bdm to _check_attach_and_reserve_volume.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"44e382ed5a46b10ddb471a13b1d6c9dba5d39850","unresolved":false,"context_lines":[{"line_number":3720,"context_line":"            attachment \u003d self.volume_api.attachment_create(context,"},{"line_number":3721,"context_line":"                                                           volume_id,"},{"line_number":3722,"context_line":"                                                           instance.uuid)"},{"line_number":3723,"context_line":"            volume_bdm.attachment_id \u003d attachment[\u0027id\u0027]"},{"line_number":3724,"context_line":"            volume_bdm.save()"},{"line_number":3725,"context_line":""},{"line_number":3726,"context_line":"        return volume"}],"source_content_type":"text/x-python","patch_set":42,"id":"df140735_039ea855","line":3723,"updated":"2017-05-30 14:10:39.000000000","message":"this makes an assumption that when the volume_attach_version is not 0, a non-null volume_bdm must be provided to this method. It would be good to put a comment on the method to highlight that.","commit_id":"5d1fbae5d2caac463a42f26b4fef9569722afbfc"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9550d5bf02a40fefc3ee01cdea7a2c5a447c87f4","unresolved":false,"context_lines":[{"line_number":3720,"context_line":"            attachment \u003d self.volume_api.attachment_create(context,"},{"line_number":3721,"context_line":"                                                           volume_id,"},{"line_number":3722,"context_line":"                                                           instance.uuid)"},{"line_number":3723,"context_line":"            volume_bdm.attachment_id \u003d attachment[\u0027id\u0027]"},{"line_number":3724,"context_line":"            volume_bdm.save()"},{"line_number":3725,"context_line":""},{"line_number":3726,"context_line":"        return volume"}],"source_content_type":"text/x-python","patch_set":42,"id":"df140735_9780b28d","line":3723,"in_reply_to":"df140735_039ea855","updated":"2017-05-30 16:00:04.000000000","message":"Good point, actually maybe we should check for that situation and raise?  I\u0027ll add it and see what you think.","commit_id":"5d1fbae5d2caac463a42f26b4fef9569722afbfc"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"b45c18dee612b97fa4476e52b3d839e79a1cef39","unresolved":false,"context_lines":[{"line_number":3720,"context_line":"            if bdm:"},{"line_number":3721,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3722,"context_line":"                bdm.save()"},{"line_number":3723,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3724,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3725,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3726,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"df140735_7a90f14a","line":3723,"updated":"2017-06-02 17:42:23.000000000","message":"I don\u0027t think this exception is defined anywhere?","commit_id":"0a9465d2c8d42390c10e2de61c34e5d6480eb2cd"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"55572e7fba51791f0d102aee9181ba7ed74e6e79","unresolved":false,"context_lines":[{"line_number":3720,"context_line":"            if bdm:"},{"line_number":3721,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3722,"context_line":"                bdm.save()"},{"line_number":3723,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3724,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3725,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3726,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"df140735_91160b49","line":3723,"in_reply_to":"df140735_7a90f14a","updated":"2017-06-02 18:28:00.000000000","message":"It\u0027s defined in the first patch of the chain here: https://review.openstack.org/#/c/469579/2/nova/exception.py","commit_id":"0a9465d2c8d42390c10e2de61c34e5d6480eb2cd"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"40f5d7d9c50640705e499324b8c0c07d311be1b5","unresolved":false,"context_lines":[{"line_number":3745,"context_line":"                volume_bdm.destroy()"},{"line_number":3746,"context_line":""},{"line_number":3747,"context_line":"        return volume_bdm.device_name"},{"line_number":3748,"context_line":""},{"line_number":3749,"context_line":"    def _do_legacy_volume_attach_shelved(self, context, volume_id,"},{"line_number":3750,"context_line":"                                         volume_bdm, device, instance):"},{"line_number":3751,"context_line":"        LOG.warning(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":3752,"context_line":"                    \u0027shelved Instance.  Please update your cinder \u0027"},{"line_number":3753,"context_line":"                    \u0027installation, or your configured API version.\u0027,"},{"line_number":3754,"context_line":"                    volume_id, instance\u003dinstance)"},{"line_number":3755,"context_line":"        try:"},{"line_number":3756,"context_line":"            self._check_attach_and_reserve_volume(context, volume_id, instance)"},{"line_number":3757,"context_line":"            self.volume_api.attach(context,"},{"line_number":3758,"context_line":"                                   volume_id,"},{"line_number":3759,"context_line":"                                   instance.uuid,"},{"line_number":3760,"context_line":"                                   device)"},{"line_number":3761,"context_line":"        except Exception:"},{"line_number":3762,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3763,"context_line":"                volume_bdm.destroy()"},{"line_number":3764,"context_line":""},{"line_number":3765,"context_line":"    def _do_volume_attach_shelved(self, context, volume_id,"},{"line_number":3766,"context_line":"                                  instance, device, volume_bdm):"},{"line_number":3767,"context_line":"        try:"},{"line_number":3768,"context_line":"            self._check_attach_and_reserve_volume(context, volume_id, instance,"},{"line_number":3769,"context_line":"                                                  volume_bdm)"},{"line_number":3770,"context_line":"        except Exception:"},{"line_number":3771,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3772,"context_line":"                volume_bdm.destroy()"},{"line_number":3773,"context_line":""},{"line_number":3774,"context_line":"    def _attach_volume_shelved_offloaded(self, context, instance, volume_id,"},{"line_number":3775,"context_line":"                                         device, disk_bus, device_type):"}],"source_content_type":"text/x-python","patch_set":46,"id":"df140735_a51552e7","line":3772,"range":{"start_line":3748,"start_character":0,"end_line":3772,"end_character":36},"updated":"2017-06-02 13:46:34.000000000","message":"It is now sorted out below by the attachment_id check in the BDM. This block can be deleted.","commit_id":"0a9465d2c8d42390c10e2de61c34e5d6480eb2cd"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"e26a29f80bfff8668be4bd63bd552e151f796df4","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                    if (min_compute_version \u003e\u003d"},{"line_number":1411,"context_line":"                        BFV_RESERVE_MIN_COMPUTE_VERSION):"},{"line_number":1412,"context_line":"                        volume \u003d self._check_attach_and_reserve_volume("},{"line_number":1413,"context_line":"                            context, volume_id, instance)"},{"line_number":1414,"context_line":"                    else:"},{"line_number":1415,"context_line":"                        # NOTE(ildikov): This call is here only for backward"},{"line_number":1416,"context_line":"                        # compatibility can be removed after Ocata EOL."}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_c87331e7","line":1413,"updated":"2017-06-12 17:48:38.000000000","message":"bfv debug - bdm seems to be missing on this call. this should be...\n\ncontext, volume_id, instance, bdm)\n\nSince this is in already checked in code, this should probably be done as a separate change.","commit_id":"ebe267929bc92e2b4f211ba3c838cd62feab24db"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"409b2561bc61f62363dc10684a248e65fa23efd8","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                    if (min_compute_version \u003e\u003d"},{"line_number":1411,"context_line":"                        BFV_RESERVE_MIN_COMPUTE_VERSION):"},{"line_number":1412,"context_line":"                        volume \u003d self._check_attach_and_reserve_volume("},{"line_number":1413,"context_line":"                            context, volume_id, instance)"},{"line_number":1414,"context_line":"                    else:"},{"line_number":1415,"context_line":"                        # NOTE(ildikov): This call is here only for backward"},{"line_number":1416,"context_line":"                        # compatibility can be removed after Ocata EOL."}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_f4ffdb64","line":1413,"in_reply_to":"7f231b9d_c87331e7","updated":"2017-06-12 20:58:45.000000000","message":"This is specific to the POC. The check_attach_and_reserve_volume method in master has no bdm arg so the change needs to be made in the POC.","commit_id":"ebe267929bc92e2b4f211ba3c838cd62feab24db"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"e26a29f80bfff8668be4bd63bd552e151f796df4","unresolved":false,"context_lines":[{"line_number":3735,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3736,"context_line":"            if bdm:"},{"line_number":3737,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3738,"context_line":"                bdm.save()"},{"line_number":3739,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3740,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3741,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_724c03c7","line":3738,"updated":"2017-06-12 17:48:38.000000000","message":"bfv debug - This bdm.save() is failing as the bdm is not yet present in the db when the save is executed. Since it\u0027s not yet created (bdm.create(), the save here is not needed and the create happens subsequent to this.","commit_id":"ebe267929bc92e2b4f211ba3c838cd62feab24db"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"643ca78ee74b82467a1d3c1bca4864a70f6de27d","unresolved":false,"context_lines":[{"line_number":3735,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3736,"context_line":"            if bdm:"},{"line_number":3737,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3738,"context_line":"                bdm.save()"},{"line_number":3739,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3740,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3741,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_f328e034","line":3738,"in_reply_to":"7f231b9d_724c03c7","updated":"2017-06-14 03:55:19.000000000","message":"see note in #50","commit_id":"ebe267929bc92e2b4f211ba3c838cd62feab24db"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"fbe6eb9dc45d620c86b72f827c6aa29c28c5bd7f","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                    if (min_compute_version \u003e\u003d"},{"line_number":1411,"context_line":"                        BFV_RESERVE_MIN_COMPUTE_VERSION):"},{"line_number":1412,"context_line":"                        volume \u003d self._check_attach_and_reserve_volume("},{"line_number":1413,"context_line":"                            context, volume_id, instance)"},{"line_number":1414,"context_line":"                    else:"},{"line_number":1415,"context_line":"                        # NOTE(ildikov): This call is here only for backward"},{"line_number":1416,"context_line":"                        # compatibility can be removed after Ocata EOL."}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_060e943a","line":1413,"updated":"2017-06-13 13:05:00.000000000","message":"This still needs the bdm to be in this call for bfv to work:\n\ncontext, volume_id, instance, bdm)","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"fbe6eb9dc45d620c86b72f827c6aa29c28c5bd7f","unresolved":false,"context_lines":[{"line_number":3747,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3748,"context_line":"            if bdm:"},{"line_number":3749,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3750,"context_line":"                bdm.save()"},{"line_number":3751,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3752,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3753,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_61f3f274","line":3750,"updated":"2017-06-13 13:05:00.000000000","message":"in the case of an instance creation with bfv, this save will throw an exception because the bdm has not yet been created (saved to the db). But it is needed in the attach volume case where the bdm is already created and in the db.\n\nThe exception thrown by a save on an uncreated bdm is:\n\n*** ObjectActionError: Object action obj_load_attr failed because: attribute id not lazy-loadable\n\nThe error happens because the id field is not read-able:\n\n(Pdb) self.id  # self \u003d BlockDeviceMapping object\n*** ObjectActionError: Object action obj_load_attr failed because: attribute id not lazy-loadable\n\nI\u0027m not sure the best way to test for this. Catching the ObjectActionError and then passing seems pretty ugly. I\u0027ll look if there\u0027s some other way to tell.","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"66277ad00b7782191cee91687fe1e191c7650014","unresolved":false,"context_lines":[{"line_number":3747,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3748,"context_line":"            if bdm:"},{"line_number":3749,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3750,"context_line":"                bdm.save()"},{"line_number":3751,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3752,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3753,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_acce772a","line":3750,"in_reply_to":"7f231b9d_133b5c9c","updated":"2017-06-14 14:47:20.000000000","message":"We have the attachment_id in the BDM now, I think this was the version before that got added.\n\nAlso the BDM object exists, but the DB record hasn\u0027t been created at this point. That\u0027s why we are hitting the issue with .save() as it tries to update the non existing record.\n\nBy checking the code I think we will not have a case when we don\u0027t pass the BDM to this call, so we can make it mandatory and remove that if or well, change the if to what Steve is suggesting or smth very similar that addresses the BFV case.","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"f61fe50a9a94a8e2c050607f0d15924e70864303","unresolved":false,"context_lines":[{"line_number":3747,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3748,"context_line":"            if bdm:"},{"line_number":3749,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3750,"context_line":"                bdm.save()"},{"line_number":3751,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3752,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3753,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_a27905fd","line":3750,"in_reply_to":"7f231b9d_61f3f274","updated":"2017-06-13 15:22:06.000000000","message":"I think this will work:\n\nif bdm.obj_attr_is_set(\u0027id\u0027):\n    bdm.save()","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"5895181a24e672e2337b1cf5bf860235ca5a23c1","unresolved":false,"context_lines":[{"line_number":3747,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3748,"context_line":"            if bdm:"},{"line_number":3749,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3750,"context_line":"                bdm.save()"},{"line_number":3751,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3752,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3753,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_133b5c9c","line":3750,"in_reply_to":"7f231b9d_61f3f274","updated":"2017-06-14 14:13:49.000000000","message":"So this has been changed somewhere along the way in our journey.  Originally the bfv case was handled by something like this:\n\n            attachment \u003d self.volume_api.create_attachment(context,\n                                                           volume_id,\n                                                           instance.uuid)\n            volume_bdm.connection_info \u003d (\n                jsonutils.dumps({\u0027attachment_id\u0027: attachment[\u0027id\u0027]}))\n            volume_bdm.save()\n\nThe \"if bdm\" check should keep us from getting in there, but that\u0027s a problem because we need to capture/save the attachment ID in the new flow so that\u0027s where that minimal bdm came from.  Make sense?","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"9d033b905ac1d39c19e78c172f2b28f720691f02","unresolved":false,"context_lines":[{"line_number":3747,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3748,"context_line":"            if bdm:"},{"line_number":3749,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3750,"context_line":"                bdm.save()"},{"line_number":3751,"context_line":"        except exception.CinderAPIVersionNotAvailable:"},{"line_number":3752,"context_line":"            LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3753,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_b0a12549","line":3750,"in_reply_to":"7f231b9d_acce772a","updated":"2017-06-14 17:54:51.000000000","message":"if the id is set to something, that means the bdm has been created in the db and thus it is safe to save it. If not (the bfv create instance case), the db create will happen up api._create_instance during self.compute_task_api.build_instances(...) and it will have the attachment id in it.","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"9db66e542a266bcfe553893a1aeb01c95a092505","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                    if (min_compute_version \u003e\u003d"},{"line_number":1411,"context_line":"                        BFV_RESERVE_MIN_COMPUTE_VERSION):"},{"line_number":1412,"context_line":"                        volume \u003d self._check_attach_and_reserve_volume("},{"line_number":1413,"context_line":"                            context, volume_id, instance)"},{"line_number":1414,"context_line":"                    else:"},{"line_number":1415,"context_line":"                        # NOTE(ildikov): This call is here only for backward"},{"line_number":1416,"context_line":"                        # compatibility can be removed after Ocata EOL."}],"source_content_type":"text/x-python","patch_set":51,"id":"7f231b9d_dd21eab5","line":1413,"updated":"2017-06-19 15:19:49.000000000","message":"This will fail without a bdm as an arg:\n\nvolume \u003d self._check_attach_and_reserve_volume(\n    context, volume_id, instance, bdm)","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fef775cd69dd682ced954cb3675d3ef858a5dcc9","unresolved":false,"context_lines":[{"line_number":1410,"context_line":"                    if (min_compute_version \u003e\u003d"},{"line_number":1411,"context_line":"                        BFV_RESERVE_MIN_COMPUTE_VERSION):"},{"line_number":1412,"context_line":"                        volume \u003d self._check_attach_and_reserve_volume("},{"line_number":1413,"context_line":"                            context, volume_id, instance)"},{"line_number":1414,"context_line":"                    else:"},{"line_number":1415,"context_line":"                        # NOTE(ildikov): This call is here only for backward"},{"line_number":1416,"context_line":"                        # compatibility can be removed after Ocata EOL."}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_60ae6499","line":1413,"in_reply_to":"7f231b9d_dd21eab5","updated":"2017-09-27 09:47:09.000000000","message":"Done","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"9db66e542a266bcfe553893a1aeb01c95a092505","unresolved":false,"context_lines":[{"line_number":3745,"context_line":"        try:"},{"line_number":3746,"context_line":"            attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3747,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3748,"context_line":"            if bdm:"},{"line_number":3749,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3750,"context_line":"                bdm.save()"},{"line_number":3751,"context_line":"        except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":51,"id":"7f231b9d_1d476279","line":3748,"updated":"2017-06-19 15:19:49.000000000","message":"bfv instance creation is still going to fail here when you have a bdm, but it has not yet been instantiated in the db (via bdm,create()). The check before the save needs to be:\n\nif bdm.obj_attr_is_set(\u0027id\u0027):\n    bdm.save()\n\nThe bdm exists, but has not yet been created. It is confusing...","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fef775cd69dd682ced954cb3675d3ef858a5dcc9","unresolved":false,"context_lines":[{"line_number":3745,"context_line":"        try:"},{"line_number":3746,"context_line":"            attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3747,"context_line":"                context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3748,"context_line":"            if bdm:"},{"line_number":3749,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3750,"context_line":"                bdm.save()"},{"line_number":3751,"context_line":"        except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_80abc087","line":3748,"in_reply_to":"7f231b9d_1d476279","updated":"2017-09-27 09:47:09.000000000","message":"Done","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":1409,"context_line":"                        \"destination_type \u0027volume\u0027 need to have a non-zero \""},{"line_number":1410,"context_line":"                        \"size specified\"))"},{"line_number":1411,"context_line":"            elif volume_id is not None:"},{"line_number":1412,"context_line":"                min_compute_version \u003d objects.Service.get_minimum_version("},{"line_number":1413,"context_line":"                    context, \u0027nova-compute\u0027)"},{"line_number":1414,"context_line":"                try:"},{"line_number":1415,"context_line":"                    # NOTE(ildikov): The boot from volume operation did not"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_8e120fb4","line":1412,"range":{"start_line":1412,"start_character":16,"end_line":1412,"end_character":35},"updated":"2017-07-07 15:13:04.000000000","message":"We could optimize _check_attach_and_reserve_volume a bit by having a min_compute_version\u003dNone kwarg in _check_attach_and_reserve_volume and then pass that in here, so we don\u0027t need to check it again - it would save some lookups since we\u0027re looping over BDMs and have already checked this once. For that matter, we\u0027re already looking up the min compute version for each iteration in this loop and that could be optimized. The get_minimum_version call result should be cached though, so maybe it would be a premature optimization. So I guess ignore for now.","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":2182,"context_line":"            if bdm.is_volume:"},{"line_number":2183,"context_line":"                try:"},{"line_number":2184,"context_line":"                    if bdm.attachment_id:"},{"line_number":2185,"context_line":"                        # FIXME(jdg): This call fails here, for shelved"},{"line_number":2186,"context_line":"                        # instances for some reason the context isn\u0027t correct"},{"line_number":2187,"context_line":"                        # it seems, Cinder returns a \"User does not have"},{"line_number":2188,"context_line":"                        # privileges, default policy in Cinder is"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_eecaa36c","line":2185,"updated":"2017-07-07 15:13:04.000000000","message":"Is this still an issue that needs to be addressed? If so, we must not have a tempest test for this case? I\u0027m thinking in the case of detach volume from a shelved offloaded instance. Tempest test class AttachVolumeShelveTestJSON tests attach/detach with shelved offloaded instances, and test_detach_volume_shelved_or_offload_server should be testing this, and that passed:\n\nhttp://logs.openstack.org/85/330285/88/check/gate-tempest-dsvm-neutron-full-ubuntu-xenial/0a1cd1d/console.html#_2017-07-07_07_50_43_986069\n\nOr is the issue that we have to use the elevated context? Looking at the default cinder policy, it should be fine:\n\n\"volume:attachment_delete\": \"rule:admin_or_owner\"\n\nUnless the volume attachment was created under a different project so we\u0027re not the owner here?","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":2182,"context_line":"            if bdm.is_volume:"},{"line_number":2183,"context_line":"                try:"},{"line_number":2184,"context_line":"                    if bdm.attachment_id:"},{"line_number":2185,"context_line":"                        # FIXME(jdg): This call fails here, for shelved"},{"line_number":2186,"context_line":"                        # instances for some reason the context isn\u0027t correct"},{"line_number":2187,"context_line":"                        # it seems, Cinder returns a \"User does not have"},{"line_number":2188,"context_line":"                        # privileges, default policy in Cinder is"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_1b3d1c2c","line":2185,"in_reply_to":"3f1d235d_eecaa36c","updated":"2017-07-07 16:55:40.000000000","message":"sorry, yes; this is fixed and I missed the comment.  I\u0027ll get it removed.  It was an issue on the Cinder side trying to take a shortcut and access the db object directly; fixed here:\n    https://review.openstack.org/#/c/480657/","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":3770,"context_line":"                attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3771,"context_line":"                    context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3772,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3773,"context_line":"                # Note(ildikov): In case of boot from volume the BDM at this"},{"line_number":3774,"context_line":"                # stage is created but haven\u0027t stored in the DB yet, therefore"},{"line_number":3775,"context_line":"                # we cannot call .save() blindly."},{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_03b0188b","line":3773,"range":{"start_line":3773,"start_character":18,"end_line":3773,"end_character":22},"updated":"2017-07-07 15:13:04.000000000","message":"NOTE","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":3770,"context_line":"                attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3771,"context_line":"                    context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3772,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3773,"context_line":"                # Note(ildikov): In case of boot from volume the BDM at this"},{"line_number":3774,"context_line":"                # stage is created but haven\u0027t stored in the DB yet, therefore"},{"line_number":3775,"context_line":"                # we cannot call .save() blindly."},{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_fb670051","line":3773,"range":{"start_line":3773,"start_character":18,"end_line":3773,"end_character":22},"in_reply_to":"3f1d235d_03b0188b","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":3771,"context_line":"                    context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3772,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3773,"context_line":"                # Note(ildikov): In case of boot from volume the BDM at this"},{"line_number":3774,"context_line":"                # stage is created but haven\u0027t stored in the DB yet, therefore"},{"line_number":3775,"context_line":"                # we cannot call .save() blindly."},{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3777,"context_line":"                    bdm.save()"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_c32c60ae","line":3774,"range":{"start_line":3774,"start_character":27,"end_line":3774,"end_character":34},"updated":"2017-07-07 15:13:04.000000000","message":"\u0027created\u0027 is a bit confusing here, since created usually means it\u0027s stored in the DB.\n\nAnother way to say this is, \"In the case of boot from volume, the BDM at this point is not yet created in a cell database, so we can\u0027t call save(). When attaching a volume to an existing instance, the instance is already in a cell and the BDM is created in that same cell so updating it here is OK.\"","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":3771,"context_line":"                    context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3772,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3773,"context_line":"                # Note(ildikov): In case of boot from volume the BDM at this"},{"line_number":3774,"context_line":"                # stage is created but haven\u0027t stored in the DB yet, therefore"},{"line_number":3775,"context_line":"                # we cannot call .save() blindly."},{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3777,"context_line":"                    bdm.save()"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_0375b8cc","line":3774,"range":{"start_line":3774,"start_character":39,"end_line":3774,"end_character":46},"updated":"2017-07-07 15:13:04.000000000","message":"hasn\u0027t been","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":3771,"context_line":"                    context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3772,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3773,"context_line":"                # Note(ildikov): In case of boot from volume the BDM at this"},{"line_number":3774,"context_line":"                # stage is created but haven\u0027t stored in the DB yet, therefore"},{"line_number":3775,"context_line":"                # we cannot call .save() blindly."},{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3777,"context_line":"                    bdm.save()"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_db744401","line":3774,"range":{"start_line":3774,"start_character":39,"end_line":3774,"end_character":46},"in_reply_to":"3f1d235d_0375b8cc","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":3771,"context_line":"                    context, volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3772,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3773,"context_line":"                # Note(ildikov): In case of boot from volume the BDM at this"},{"line_number":3774,"context_line":"                # stage is created but haven\u0027t stored in the DB yet, therefore"},{"line_number":3775,"context_line":"                # we cannot call .save() blindly."},{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3777,"context_line":"                    bdm.save()"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_bb71880f","line":3774,"range":{"start_line":3774,"start_character":27,"end_line":3774,"end_character":34},"in_reply_to":"3f1d235d_c32c60ae","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3777,"context_line":"                    bdm.save()"},{"line_number":3778,"context_line":"            except exception.CinderAPIVersionNotAvailable:"},{"line_number":3779,"context_line":"                LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3780,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3781,"context_line":"        else:"},{"line_number":3782,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_8361c814","line":3779,"range":{"start_line":3779,"start_character":20,"end_line":3779,"end_character":29},"updated":"2017-07-07 15:13:04.000000000","message":"This shouldn\u0027t be an error with a traceback, just log it as debug. The reason we check the min compute service version and the cinder API is because we\u0027re supporting downlevel cinder and downlevel computes so operators have time to do rolling upgrades.","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":3776,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3777,"context_line":"                    bdm.save()"},{"line_number":3778,"context_line":"            except exception.CinderAPIVersionNotAvailable:"},{"line_number":3779,"context_line":"                LOG.exception(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3780,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3781,"context_line":"        else:"},{"line_number":3782,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_1b54fc53","line":3779,"range":{"start_line":3779,"start_character":20,"end_line":3779,"end_character":29},"in_reply_to":"3f1d235d_8361c814","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":3898,"context_line":"        \"\"\""},{"line_number":3899,"context_line":"        bdms \u003d [objects.BlockDeviceMapping.get_by_volume_id("},{"line_number":3900,"context_line":"                context, volume[\u0027id\u0027], instance.uuid)]"},{"line_number":3901,"context_line":"        for bdm in bdms:"},{"line_number":3902,"context_line":"            if bdm.attachment_id is None:"},{"line_number":3903,"context_line":"                try:"},{"line_number":3904,"context_line":"                    self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_ceeec7ec","line":3901,"updated":"2017-07-07 15:13:04.000000000","message":"Why don\u0027t we do this before getting the bdms? We only have one, so we don\u0027t need a loop. The bdms list is just there for the _local_cleanup_bdm_volumes method signature.","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"422e990e56d362a705d6219ce7bbec0b18eeffbf","unresolved":false,"context_lines":[{"line_number":3898,"context_line":"        \"\"\""},{"line_number":3899,"context_line":"        bdms \u003d [objects.BlockDeviceMapping.get_by_volume_id("},{"line_number":3900,"context_line":"                context, volume[\u0027id\u0027], instance.uuid)]"},{"line_number":3901,"context_line":"        for bdm in bdms:"},{"line_number":3902,"context_line":"            if bdm.attachment_id is None:"},{"line_number":3903,"context_line":"                try:"},{"line_number":3904,"context_line":"                    self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_ca4a2cab","line":3901,"in_reply_to":"3f1d235d_5b3954f0","updated":"2017-07-07 19:11:18.000000000","message":"\u003e We need the bdm to check for attachment_id so we know whether or not to ignore the begin_detaching call. \n\nYeah I get that, we just don\u0027t need to have the for loop here.\n\n\u003e I did notice that get_by_volume_id is deprecated; what about just using the new get_by_volume_and_instance\n\nYeah we should use get_by_volume_and_instance.\n\nWhat I am thinking is more like this:\n\nbdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance(context, volume[\u0027id\u0027], instance.uuid)\nif bdm.attachment_id is None:\n   ... do begin_detaching stuff\nself._local_cleanup_bdm_volumes([bdm], instance, context)","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":3898,"context_line":"        \"\"\""},{"line_number":3899,"context_line":"        bdms \u003d [objects.BlockDeviceMapping.get_by_volume_id("},{"line_number":3900,"context_line":"                context, volume[\u0027id\u0027], instance.uuid)]"},{"line_number":3901,"context_line":"        for bdm in bdms:"},{"line_number":3902,"context_line":"            if bdm.attachment_id is None:"},{"line_number":3903,"context_line":"                try:"},{"line_number":3904,"context_line":"                    self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_5b3954f0","line":3901,"in_reply_to":"3f1d235d_ceeec7ec","updated":"2017-07-07 16:55:40.000000000","message":"We need the bdm to check for attachment_id so we know whether or not to ignore the begin_detaching call.  I did notice that get_by_volume_id is deprecated; what about just using the new get_by_volume_and_instance, using that and then passing it into the cleanup?","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":3904,"context_line":"                    self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"},{"line_number":3905,"context_line":"                except exception.InvalidInput as exc:"},{"line_number":3906,"context_line":"                    raise exception.InvalidVolume(reason\u003dexc.format_message())"},{"line_number":3907,"context_line":"        self._local_cleanup_bdm_volumes("},{"line_number":3908,"context_line":"            bdms, instance,"},{"line_number":3909,"context_line":"            context)"},{"line_number":3910,"context_line":""},{"line_number":3911,"context_line":"    @check_instance_lock"},{"line_number":3912,"context_line":"    @check_instance_state(vm_state\u003d[vm_states.ACTIVE, vm_states.PAUSED,"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_0e203f49","line":3909,"range":{"start_line":3907,"start_character":8,"end_line":3909,"end_character":20},"updated":"2017-07-07 15:13:04.000000000","message":"nit: this can all be on the same line as before","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":3904,"context_line":"                    self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"},{"line_number":3905,"context_line":"                except exception.InvalidInput as exc:"},{"line_number":3906,"context_line":"                    raise exception.InvalidVolume(reason\u003dexc.format_message())"},{"line_number":3907,"context_line":"        self._local_cleanup_bdm_volumes("},{"line_number":3908,"context_line":"            bdms, instance,"},{"line_number":3909,"context_line":"            context)"},{"line_number":3910,"context_line":""},{"line_number":3911,"context_line":"    @check_instance_lock"},{"line_number":3912,"context_line":"    @check_instance_state(vm_state\u003d[vm_states.ACTIVE, vm_states.PAUSED,"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_1b02bc3f","line":3909,"range":{"start_line":3907,"start_character":8,"end_line":3909,"end_character":20},"in_reply_to":"3f1d235d_0e203f49","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2dc8daf1ce17d8eb715622968f664c49da34f54a","unresolved":false,"context_lines":[{"line_number":3894,"context_line":"        If the volume has delete_on_termination option set then we call the"},{"line_number":3895,"context_line":"        volume api delete as well."},{"line_number":3896,"context_line":"        \"\"\""},{"line_number":3897,"context_line":"        bdm \u003d get_by_volume_and_instance(context, volume_id, instance.uuid)"},{"line_number":3898,"context_line":"        if bdm.attachment_id is None:"},{"line_number":3899,"context_line":"            try:"},{"line_number":3900,"context_line":"                self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":89,"id":"3f1d235d_ea7e08ae","line":3897,"range":{"start_line":3897,"start_character":50,"end_line":3897,"end_character":59},"updated":"2017-07-07 19:14:48.000000000","message":"This needs to be volume[\u0027id\u0027].","commit_id":"4ff098303c45d7376131e080a884912b177f20ad"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"021b33e5389b95a2986b830a521502c8129ba243","unresolved":false,"context_lines":[{"line_number":3894,"context_line":"        If the volume has delete_on_termination option set then we call the"},{"line_number":3895,"context_line":"        volume api delete as well."},{"line_number":3896,"context_line":"        \"\"\""},{"line_number":3897,"context_line":"        bdm \u003d get_by_volume_and_instance(context, volume_id, instance.uuid)"},{"line_number":3898,"context_line":"        if bdm.attachment_id is None:"},{"line_number":3899,"context_line":"            try:"},{"line_number":3900,"context_line":"                self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":89,"id":"3f1d235d_09d94f21","line":3897,"range":{"start_line":3897,"start_character":14,"end_line":3897,"end_character":40},"updated":"2017-07-07 21:39:46.000000000","message":"objects.BlockDeviceMapping.get_by_volume_and_instance","commit_id":"4ff098303c45d7376131e080a884912b177f20ad"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"eafd2565906667c961a64ed4003ece0d400f7f82","unresolved":false,"context_lines":[{"line_number":3768,"context_line":"                # NOTE(ildikov): In case of boot from volume the BDM at this"},{"line_number":3769,"context_line":"                # point is not yet created in a cell database, so we can\u0027t"},{"line_number":3770,"context_line":"                # call save().  When attaching a volume to an existing"},{"line_number":3771,"context_line":"                # instance, the instance is already in a call and the BDM has"},{"line_number":3772,"context_line":"                # been created in that same cell so updating here in that case"},{"line_number":3773,"context_line":"                # is \"ok\"."},{"line_number":3774,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":90,"id":"3f1d235d_db1675f2","line":3771,"range":{"start_line":3771,"start_character":57,"end_line":3771,"end_character":61},"updated":"2017-07-08 10:03:33.000000000","message":"s/call/cell/","commit_id":"a04ca7881a24cb0762f93b73fe079b8cb19588b8"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"029ef02e289b38a3917a93d7c2b9b02204edc2fe","unresolved":false,"context_lines":[{"line_number":3768,"context_line":"                # NOTE(ildikov): In case of boot from volume the BDM at this"},{"line_number":3769,"context_line":"                # point is not yet created in a cell database, so we can\u0027t"},{"line_number":3770,"context_line":"                # call save().  When attaching a volume to an existing"},{"line_number":3771,"context_line":"                # instance, the instance is already in a call and the BDM has"},{"line_number":3772,"context_line":"                # been created in that same cell so updating here in that case"},{"line_number":3773,"context_line":"                # is \"ok\"."},{"line_number":3774,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"}],"source_content_type":"text/x-python","patch_set":90,"id":"3f1d235d_103167ed","line":3771,"range":{"start_line":3771,"start_character":57,"end_line":3771,"end_character":61},"in_reply_to":"3f1d235d_db1675f2","updated":"2017-07-08 16:16:51.000000000","message":"Done","commit_id":"a04ca7881a24cb0762f93b73fe079b8cb19588b8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":2004,"context_line":"            if bdm.is_volume:"},{"line_number":2005,"context_line":"                try:"},{"line_number":2006,"context_line":"                    if bdm.attachment_id:"},{"line_number":2007,"context_line":"                        self.volume_api.attachment_delete(elevated,"},{"line_number":2008,"context_line":"                                                          bdm.attachment_id)"},{"line_number":2009,"context_line":"                    else:"},{"line_number":2010,"context_line":"                        connector \u003d self._get_stashed_volume_connector("}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_c0db134d","line":2007,"range":{"start_line":2007,"start_character":58,"end_line":2007,"end_character":66},"updated":"2017-07-21 02:24:43.000000000","message":"nit: remind me why we need this again? Maybe good to have a comment here about why we need elevated here, but for example, not terminate_connection below.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":2004,"context_line":"            if bdm.is_volume:"},{"line_number":2005,"context_line":"                try:"},{"line_number":2006,"context_line":"                    if bdm.attachment_id:"},{"line_number":2007,"context_line":"                        self.volume_api.attachment_delete(elevated,"},{"line_number":2008,"context_line":"                                                          bdm.attachment_id)"},{"line_number":2009,"context_line":"                    else:"},{"line_number":2010,"context_line":"                        connector \u003d self._get_stashed_volume_connector("}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_acbec9fc","line":2007,"range":{"start_line":2007,"start_character":58,"end_line":2007,"end_character":66},"in_reply_to":"1f1a1f67_c0db134d","updated":"2017-07-21 08:14:39.000000000","message":"This one is needed a Cinder side fix to work, so it should be ok without elevated, I will remove it.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":3585,"context_line":"                bdm.attachment_id \u003d attachment_id"},{"line_number":3586,"context_line":"                # NOTE(ildikov): In case of boot from volume the BDM at this"},{"line_number":3587,"context_line":"                # point is not yet created in a cell database, so we can\u0027t"},{"line_number":3588,"context_line":"                # call save().  When attaching a volume to an existing"},{"line_number":3589,"context_line":"                # instance, the instance is already in a cell and the BDM has"},{"line_number":3590,"context_line":"                # been created in that same cell so updating here in that case"},{"line_number":3591,"context_line":"                # is \"ok\"."},{"line_number":3592,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3593,"context_line":"                    bdm.save()"},{"line_number":3594,"context_line":"            except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_8093db5c","line":3591,"range":{"start_line":3588,"start_character":32,"end_line":3591,"end_character":26},"updated":"2017-07-21 02:24:43.000000000","message":"For others that are interested, this is OK for an existing BDM because when we lookup the instance in the _get_instance method, we target the context to the cell that we pulled the instance out of. So after that everything that we do with the context is targeted to the cell database and not the API DB. It\u0027s MAGIC!","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e89125ac3574b64a57b281712392367e7d46cb41","unresolved":false,"context_lines":[{"line_number":102,"context_line":"AGGREGATE_ACTION_DELETE \u003d \u0027Delete\u0027"},{"line_number":103,"context_line":"AGGREGATE_ACTION_ADD \u003d \u0027Add\u0027"},{"line_number":104,"context_line":"BFV_RESERVE_MIN_COMPUTE_VERSION \u003d 17"},{"line_number":105,"context_line":"CINDER_V3_ATTACH_MIN_COMPUTE_VERSION \u003d 23"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"# FIXME(danms): Keep a global cache of the cells we find the"},{"line_number":108,"context_line":"# first time we look. This needs to be refreshed on a timer or"}],"source_content_type":"text/x-python","patch_set":133,"id":"7f287b81_a56094a6","line":105,"range":{"start_line":105,"start_character":39,"end_line":105,"end_character":41},"updated":"2017-09-07 16:07:40.000000000","message":"You mean 44 right?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"83e6d30fe835d269053a9b17ec514f3ef3b8463c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"AGGREGATE_ACTION_DELETE \u003d \u0027Delete\u0027"},{"line_number":103,"context_line":"AGGREGATE_ACTION_ADD \u003d \u0027Add\u0027"},{"line_number":104,"context_line":"BFV_RESERVE_MIN_COMPUTE_VERSION \u003d 17"},{"line_number":105,"context_line":"CINDER_V3_ATTACH_MIN_COMPUTE_VERSION \u003d 23"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"# FIXME(danms): Keep a global cache of the cells we find the"},{"line_number":108,"context_line":"# first time we look. This needs to be refreshed on a timer or"}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_95518365","line":105,"range":{"start_line":105,"start_character":39,"end_line":105,"end_character":41},"in_reply_to":"7f287b81_a56094a6","updated":"2017-09-13 17:28:08.000000000","message":"This is the compute version and not the Cinder API microversion here and I bump it every time I get into conflict. I hope I don\u0027t have to do this many more times. ;)","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e89125ac3574b64a57b281712392367e7d46cb41","unresolved":false,"context_lines":[{"line_number":3571,"context_line":"                device_type\u003ddevice_type, tag\u003dtag)"},{"line_number":3572,"context_line":"        return volume_bdm"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"    def _check_attach_and_reserve_volume(self, context, volume_id, instance,"},{"line_number":3575,"context_line":"                                         bdm):"},{"line_number":3576,"context_line":"        volume \u003d self.volume_api.get(context, volume_id)"},{"line_number":3577,"context_line":"        self.volume_api.check_availability_zone(context, volume,"}],"source_content_type":"text/x-python","patch_set":133,"id":"7f287b81_4510d000","line":3574,"updated":"2017-09-07 16:07:40.000000000","message":"Could we split this method change (and related tests) out from all the other changes in this patch?\n\nI think this is the final \"turn it on\" bit, or am I missing lots of dependencies here?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"83e6d30fe835d269053a9b17ec514f3ef3b8463c","unresolved":false,"context_lines":[{"line_number":3571,"context_line":"                device_type\u003ddevice_type, tag\u003dtag)"},{"line_number":3572,"context_line":"        return volume_bdm"},{"line_number":3573,"context_line":""},{"line_number":3574,"context_line":"    def _check_attach_and_reserve_volume(self, context, volume_id, instance,"},{"line_number":3575,"context_line":"                                         bdm):"},{"line_number":3576,"context_line":"        volume \u003d self.volume_api.get(context, volume_id)"},{"line_number":3577,"context_line":"        self.volume_api.check_availability_zone(context, volume,"}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_28295289","line":3574,"in_reply_to":"7f287b81_4510d000","updated":"2017-09-13 17:28:08.000000000","message":"What would be the benefit of splitting this out?\n\nWe would just make the chain longer and testing more difficult. Many of the test changes would move with this too, so I don\u0027t think it would make things more readable either.","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e89125ac3574b64a57b281712392367e7d46cb41","unresolved":false,"context_lines":[{"line_number":3578,"context_line":"                                                instance\u003dinstance)"},{"line_number":3579,"context_line":"        min_compute_version \u003d objects.Service.get_minimum_version("},{"line_number":3580,"context_line":"            context, \u0027nova-compute\u0027)"},{"line_number":3581,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3582,"context_line":"            # Attempt a new style volume attachment, but fallback to old-style"},{"line_number":3583,"context_line":"            # in case Cinder API 3.44 isn\u0027t available."},{"line_number":3584,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":133,"id":"7f287b81_4529f034","line":3581,"range":{"start_line":3581,"start_character":34,"end_line":3581,"end_character":70},"updated":"2017-09-07 16:07:40.000000000","message":"I assume this needs to be higher than 17, probably need to bump the version in this patch?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"83e6d30fe835d269053a9b17ec514f3ef3b8463c","unresolved":false,"context_lines":[{"line_number":3578,"context_line":"                                                instance\u003dinstance)"},{"line_number":3579,"context_line":"        min_compute_version \u003d objects.Service.get_minimum_version("},{"line_number":3580,"context_line":"            context, \u0027nova-compute\u0027)"},{"line_number":3581,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3582,"context_line":"            # Attempt a new style volume attachment, but fallback to old-style"},{"line_number":3583,"context_line":"            # in case Cinder API 3.44 isn\u0027t available."},{"line_number":3584,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_55031b10","line":3581,"range":{"start_line":3581,"start_character":34,"end_line":3581,"end_character":70},"in_reply_to":"7f287b81_4529f034","updated":"2017-09-13 17:28:08.000000000","message":"We require 17 for the BFV case where we added reserve later. This is a separate case.","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"ce78393c15998a8bae9decc76f77b21ae57d0ca4","unresolved":false,"context_lines":[{"line_number":3597,"context_line":"                LOG.debug(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3598,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3599,"context_line":"        else:"},{"line_number":3600,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3601,"context_line":"        return volume"},{"line_number":3602,"context_line":""},{"line_number":3603,"context_line":"    def _attach_volume(self, context, instance, volume_id, device,"}],"source_content_type":"text/x-python","patch_set":141,"id":"7f515b1d_7a5f81e5","line":3600,"updated":"2017-09-21 21:16:24.000000000","message":"We should add a debug log message if reserve is called here- as it is no longer the usual path.","commit_id":"f0c79fa0018c1094a4e9e875f774424795f641f0"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"cedaa7f20030545c20838bedc60f7d5917cb41bc","unresolved":false,"context_lines":[{"line_number":3597,"context_line":"                LOG.debug(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3598,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3599,"context_line":"        else:"},{"line_number":3600,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3601,"context_line":"        return volume"},{"line_number":3602,"context_line":""},{"line_number":3603,"context_line":"    def _attach_volume(self, context, instance, volume_id, device,"}],"source_content_type":"text/x-python","patch_set":141,"id":"5f4e5783_5a35e1f6","line":3600,"in_reply_to":"7f515b1d_11abbd1d","updated":"2017-10-10 07:39:46.000000000","message":"Done","commit_id":"f0c79fa0018c1094a4e9e875f774424795f641f0"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"93ae824f2372787b9553d9188db1e777a2c6c3bc","unresolved":false,"context_lines":[{"line_number":3597,"context_line":"                LOG.debug(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3598,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3599,"context_line":"        else:"},{"line_number":3600,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3601,"context_line":"        return volume"},{"line_number":3602,"context_line":""},{"line_number":3603,"context_line":"    def _attach_volume(self, context, instance, volume_id, device,"}],"source_content_type":"text/x-python","patch_set":141,"id":"7f515b1d_11abbd1d","line":3600,"in_reply_to":"7f515b1d_7a5f81e5","updated":"2017-09-22 14:02:26.000000000","message":"The reason for this is I\u0027ve found it hard to tell from the logs if we\u0027re using the new or old flow when the above compute version check failed.","commit_id":"f0c79fa0018c1094a4e9e875f774424795f641f0"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"fe772cac74b781813940f181b110f6407c17dc21","unresolved":false,"context_lines":[{"line_number":3554,"context_line":"                # call save().  When attaching a volume to an existing"},{"line_number":3555,"context_line":"                # instance, the instance is already in a cell and the BDM has"},{"line_number":3556,"context_line":"                # been created in that same cell so updating here in that case"},{"line_number":3557,"context_line":"                # is \"ok\"."},{"line_number":3558,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3559,"context_line":"                    bdm.save()"},{"line_number":3560,"context_line":"            except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_3e1cd8bf","line":3557,"updated":"2017-10-13 17:57:36.000000000","message":"It is a worry we could fail and leave the attachment_created, but not persist the attachment_id anywhere. I don\u0027t really know how we solve that... Its not a new bug, I guess we ignore it.","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":3554,"context_line":"                # call save().  When attaching a volume to an existing"},{"line_number":3555,"context_line":"                # instance, the instance is already in a cell and the BDM has"},{"line_number":3556,"context_line":"                # been created in that same cell so updating here in that case"},{"line_number":3557,"context_line":"                # is \"ok\"."},{"line_number":3558,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3559,"context_line":"                    bdm.save()"},{"line_number":3560,"context_line":"            except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_d46e7cc7","line":3557,"in_reply_to":"5f4e5783_3e1cd8bf","updated":"2017-10-20 16:55:20.000000000","message":"I don\u0027t know how long is the window to fail, but definitely not introducing anything new here.\n\nWe can look into the case if it\u0027s problematic later, but I guess it would\u0027ve been solved already if caused problems all the time.","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"fe772cac74b781813940f181b110f6407c17dc21","unresolved":false,"context_lines":[{"line_number":3607,"context_line":"                                                  volume_bdm)"},{"line_number":3608,"context_line":"            # NOTE(jdg): For new style attach the above call will create an"},{"line_number":3609,"context_line":"            # attachment record without a connector, which will set the volume"},{"line_number":3610,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3611,"context_line":"            if volume_bdm.attachment_id is None:"},{"line_number":3612,"context_line":"                # Old style attachment for the volume and instance."},{"line_number":3613,"context_line":"                self.volume_api.attach(context,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_3ef85847","line":3610,"updated":"2017-10-13 17:57:36.000000000","message":"Are we worried the volume is attaching and not in the in-use state here? I guess not?\n\nIt would be nice if were were in the same state as existing volumes of an offloaded instance, where it is in-use but has just one attachment that needs its connector setting on it (after having deleted the old attachment that already had a connector set on it).\n\nEewww...","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":3607,"context_line":"                                                  volume_bdm)"},{"line_number":3608,"context_line":"            # NOTE(jdg): For new style attach the above call will create an"},{"line_number":3609,"context_line":"            # attachment record without a connector, which will set the volume"},{"line_number":3610,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3611,"context_line":"            if volume_bdm.attachment_id is None:"},{"line_number":3612,"context_line":"                # Old style attachment for the volume and instance."},{"line_number":3613,"context_line":"                self.volume_api.attach(context,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_14877464","line":3610,"in_reply_to":"5f4e5783_3ef85847","updated":"2017-10-20 16:55:20.000000000","message":"I actually think that having it in \u0027reserved\u0027 state makes more sense here and just stop lying about the actual volume state. As we are implementing a new flow and not trying to fully copy the existing one we should use the opportunity to improve things.","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0bb510710f6c7ed0fb8827f70dccba2b42c19b91","unresolved":false,"context_lines":[{"line_number":3523,"context_line":"                device_type\u003ddevice_type, tag\u003dtag)"},{"line_number":3524,"context_line":"        return volume_bdm"},{"line_number":3525,"context_line":""},{"line_number":3526,"context_line":"    def _check_volume_already_attached_to_instance(self, context, instance,"},{"line_number":3527,"context_line":"                                                   volume_id):"},{"line_number":3528,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3529,"context_line":"            context, volume_id, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":149,"id":"ff82abbf_90b1cbe4","line":3526,"updated":"2017-11-20 23:14:30.000000000","message":"We should only call this if we\u0027re doing the new flow, because otherwise Cinder will handle this check for us and raise an error when we call reserve().","commit_id":"5b5940c34aaebeab683c5db9dcea0598b111f269"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"870182d89c315e6c784d32975bb35f32d9995101","unresolved":false,"context_lines":[{"line_number":3523,"context_line":"                device_type\u003ddevice_type, tag\u003dtag)"},{"line_number":3524,"context_line":"        return volume_bdm"},{"line_number":3525,"context_line":""},{"line_number":3526,"context_line":"    def _check_volume_already_attached_to_instance(self, context, instance,"},{"line_number":3527,"context_line":"                                                   volume_id):"},{"line_number":3528,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3529,"context_line":"            context, volume_id, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":149,"id":"ff82abbf_90ff8b66","line":3526,"range":{"start_line":3526,"start_character":8,"end_line":3526,"end_character":50},"updated":"2017-11-20 23:16:07.000000000","message":"add a docstring","commit_id":"5b5940c34aaebeab683c5db9dcea0598b111f269"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"870182d89c315e6c784d32975bb35f32d9995101","unresolved":false,"context_lines":[{"line_number":3525,"context_line":""},{"line_number":3526,"context_line":"    def _check_volume_already_attached_to_instance(self, context, instance,"},{"line_number":3527,"context_line":"                                                   volume_id):"},{"line_number":3528,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3529,"context_line":"            context, volume_id, instance.uuid)"},{"line_number":3530,"context_line":"        if bdm:"},{"line_number":3531,"context_line":"            msg \u003d _(\"volume %s already attached\") % volume_id"}],"source_content_type":"text/x-python","patch_set":149,"id":"ff82abbf_70cd275c","line":3528,"updated":"2017-11-20 23:16:07.000000000","message":"You will need to handle VolumeBDMNotFound from this. If we get VolumeBDMNotFound we just noop because that\u0027s what we want.","commit_id":"5b5940c34aaebeab683c5db9dcea0598b111f269"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":3561,"context_line":"        try:"},{"line_number":3562,"context_line":"            bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3563,"context_line":"                context, volume_id, instance.uuid)"},{"line_number":3564,"context_line":"            if bdm:"},{"line_number":3565,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"},{"line_number":3566,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":3567,"context_line":"        except exception.VolumeBDMNotFound:"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_a84f91bb","line":3564,"updated":"2017-11-22 15:30:04.000000000","message":"Nit: not sure you need this if statement, it either raises or returns something useful.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3561,"context_line":"        try:"},{"line_number":3562,"context_line":"            bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3563,"context_line":"                context, volume_id, instance.uuid)"},{"line_number":3564,"context_line":"            if bdm:"},{"line_number":3565,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"},{"line_number":3566,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":3567,"context_line":"        except exception.VolumeBDMNotFound:"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_c3598b5a","line":3564,"in_reply_to":"ff82abbf_a84f91bb","updated":"2017-11-23 02:34:54.000000000","message":"Yeah, the exception handling came later and I was focusing purely on making this work first. :)","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":3561,"context_line":"        try:"},{"line_number":3562,"context_line":"            bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3563,"context_line":"                context, volume_id, instance.uuid)"},{"line_number":3564,"context_line":"            if bdm:"},{"line_number":3565,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"},{"line_number":3566,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":3567,"context_line":"        except exception.VolumeBDMNotFound:"},{"line_number":3568,"context_line":"            pass"},{"line_number":3569,"context_line":""},{"line_number":3570,"context_line":"    def _check_attach_and_reserve_volume(self, context, volume_id, instance,"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_86287f34","line":3567,"range":{"start_line":3564,"start_character":0,"end_line":3567,"end_character":43},"updated":"2017-11-22 13:18:53.000000000","message":"I think the get_by_volume_and_instance is either returns a bdm where bool(bdm) \u003d\u003d True or raises the VolumBDMNotFound exception. Therefore the \u0027if bmd:\u0027 check is unnecessary.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3561,"context_line":"        try:"},{"line_number":3562,"context_line":"            bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3563,"context_line":"                context, volume_id, instance.uuid)"},{"line_number":3564,"context_line":"            if bdm:"},{"line_number":3565,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"},{"line_number":3566,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":3567,"context_line":"        except exception.VolumeBDMNotFound:"},{"line_number":3568,"context_line":"            pass"},{"line_number":3569,"context_line":""},{"line_number":3570,"context_line":"    def _check_attach_and_reserve_volume(self, context, volume_id, instance,"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_8331430e","line":3567,"range":{"start_line":3564,"start_character":0,"end_line":3567,"end_character":43},"in_reply_to":"ff82abbf_86287f34","updated":"2017-11-23 02:34:54.000000000","message":"Makes sense, thanks.\n\nDone","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":3590,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3591,"context_line":"                    bdm.save()"},{"line_number":3592,"context_line":"            except exception.CinderAPIVersionNotAvailable:"},{"line_number":3593,"context_line":"                LOG.debug(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3594,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3595,"context_line":"        else:"},{"line_number":3596,"context_line":"            LOG.debug(\u0027The compute service version is not high enough to \u0027"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_c899b579","line":3593,"updated":"2017-11-22 15:30:04.000000000","message":"Nit/Idea...\n\nJust thinking about a future cycle, we could remove the support for creating old style attachments.\n\nTo do that we will need warnings here, like please upgrade your Cinder now, and please complete your Nova upgrade, etc.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":3590,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3591,"context_line":"                    bdm.save()"},{"line_number":3592,"context_line":"            except exception.CinderAPIVersionNotAvailable:"},{"line_number":3593,"context_line":"                LOG.debug(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3594,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3595,"context_line":"        else:"},{"line_number":3596,"context_line":"            LOG.debug(\u0027The compute service version is not high enough to \u0027"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_2669738a","line":3593,"updated":"2017-11-22 13:18:53.000000000","message":"This message could be more specific about why we cannot create the attachment. Similarly as below in L3596 we are specific about the service version","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3590,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3591,"context_line":"                    bdm.save()"},{"line_number":3592,"context_line":"            except exception.CinderAPIVersionNotAvailable:"},{"line_number":3593,"context_line":"                LOG.debug(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3594,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3595,"context_line":"        else:"},{"line_number":3596,"context_line":"            LOG.debug(\u0027The compute service version is not high enough to \u0027"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_3e7090a5","line":3593,"in_reply_to":"ff82abbf_2669738a","updated":"2017-11-23 02:34:54.000000000","message":"Done","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3590,"context_line":"                if bdm.obj_attr_is_set(\u0027id\u0027):"},{"line_number":3591,"context_line":"                    bdm.save()"},{"line_number":3592,"context_line":"            except exception.CinderAPIVersionNotAvailable:"},{"line_number":3593,"context_line":"                LOG.debug(\u0027Unable to create new style volume attachment.\u0027)"},{"line_number":3594,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3595,"context_line":"        else:"},{"line_number":3596,"context_line":"            LOG.debug(\u0027The compute service version is not high enough to \u0027"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_c3074b1c","line":3593,"in_reply_to":"ff82abbf_c899b579","updated":"2017-11-23 02:34:54.000000000","message":"I would do the warnings in a follow-up patch when we feel ready for the deprecation warnings. :)","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":3614,"context_line":"            self.compute_rpcapi.attach_volume(context, instance, volume_bdm)"},{"line_number":3615,"context_line":"        except Exception:"},{"line_number":3616,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3617,"context_line":"                volume_bdm.destroy()"},{"line_number":3618,"context_line":""},{"line_number":3619,"context_line":"        return volume_bdm.device_name"},{"line_number":3620,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_abbf8bf9","line":3617,"updated":"2017-11-22 15:30:04.000000000","message":"Worried about cleaning up attachments here.\n\nMight actually make the most sense to just pull the attach_volume call out of the try/except, because that is a cast.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"341f22c47602149bb70ffe5452d3b56c93d57432","unresolved":false,"context_lines":[{"line_number":3614,"context_line":"            self.compute_rpcapi.attach_volume(context, instance, volume_bdm)"},{"line_number":3615,"context_line":"        except Exception:"},{"line_number":3616,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3617,"context_line":"                volume_bdm.destroy()"},{"line_number":3618,"context_line":""},{"line_number":3619,"context_line":"        return volume_bdm.device_name"},{"line_number":3620,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_ec0ef08b","line":3617,"in_reply_to":"ff82abbf_31bf5362","updated":"2017-12-01 12:24:03.000000000","message":"We can report a bug and fix it as a follow up. I agree it would be better handled separately.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3614,"context_line":"            self.compute_rpcapi.attach_volume(context, instance, volume_bdm)"},{"line_number":3615,"context_line":"        except Exception:"},{"line_number":3616,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3617,"context_line":"                volume_bdm.destroy()"},{"line_number":3618,"context_line":""},{"line_number":3619,"context_line":"        return volume_bdm.device_name"},{"line_number":3620,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_dee1642c","line":3617,"in_reply_to":"ff82abbf_abbf8bf9","updated":"2017-11-23 02:34:54.000000000","message":"I don\u0027t see how this is different from the old flow here. It\u0027s like if we miss the unreserve call somewhere the volume will be stuck in \u0027attaching\u0027 state. Am I missing something?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a956196f2948556a8c736ee466ec0da70f0544fb","unresolved":false,"context_lines":[{"line_number":3614,"context_line":"            self.compute_rpcapi.attach_volume(context, instance, volume_bdm)"},{"line_number":3615,"context_line":"        except Exception:"},{"line_number":3616,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3617,"context_line":"                volume_bdm.destroy()"},{"line_number":3618,"context_line":""},{"line_number":3619,"context_line":"        return volume_bdm.device_name"},{"line_number":3620,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_31bf5362","line":3617,"in_reply_to":"ff82abbf_dee1642c","updated":"2017-11-23 10:20:50.000000000","message":"I think you are right, I just suspect we have a bug here. Can be a follow up patch.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":3639,"context_line":"                                                  volume_bdm)"},{"line_number":3640,"context_line":"            # NOTE(jdg): For new style attach the above call will create an"},{"line_number":3641,"context_line":"            # attachment record without a connector, which will set the volume"},{"line_number":3642,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3643,"context_line":"            if volume_bdm.attachment_id is None:"},{"line_number":3644,"context_line":"                # Old style attachment for the volume and instance."},{"line_number":3645,"context_line":"                self.volume_api.attach(context,"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_ab354bdc","line":3642,"updated":"2017-11-22 15:30:04.000000000","message":"Hmm, this kinda changes the API contract. But it does feel like the new state is more accurate, and needed to avoid any confusion.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3639,"context_line":"                                                  volume_bdm)"},{"line_number":3640,"context_line":"            # NOTE(jdg): For new style attach the above call will create an"},{"line_number":3641,"context_line":"            # attachment record without a connector, which will set the volume"},{"line_number":3642,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3643,"context_line":"            if volume_bdm.attachment_id is None:"},{"line_number":3644,"context_line":"                # Old style attachment for the volume and instance."},{"line_number":3645,"context_line":"                self.volume_api.attach(context,"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_debac408","line":3642,"in_reply_to":"ff82abbf_ab354bdc","updated":"2017-11-23 02:34:54.000000000","message":"Yeah, that\u0027s my thinking as well that it\u0027s a chance for us to make things a bit more rational and the \u0027reserved\u0027 state is a pretty good match here.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":3648,"context_line":"                                       device)"},{"line_number":3649,"context_line":"        except Exception:"},{"line_number":3650,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3651,"context_line":"                volume_bdm.destroy()"},{"line_number":3652,"context_line":""},{"line_number":3653,"context_line":"        return volume_bdm.device_name"},{"line_number":3654,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_e8b11991","line":3651,"updated":"2017-11-22 15:30:04.000000000","message":"Why is there no unreserve volume? Probably a bug?\n\nI think we might actually be OK, as we only call attach when we haven\u0027t created an attachment... unsure.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3648,"context_line":"                                       device)"},{"line_number":3649,"context_line":"        except Exception:"},{"line_number":3650,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":3651,"context_line":"                volume_bdm.destroy()"},{"line_number":3652,"context_line":""},{"line_number":3653,"context_line":"        return volume_bdm.device_name"},{"line_number":3654,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_1e46ec22","line":3651,"in_reply_to":"ff82abbf_e8b11991","updated":"2017-11-23 02:34:54.000000000","message":"Yep, we fall back to the old style attachment here.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":3672,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3673,"context_line":"            try:"},{"line_number":3674,"context_line":"                cinder.is_microversion_supported(context, \u00273.44\u0027)"},{"line_number":3675,"context_line":"                self._check_volume_already_attached_to_instance(context,"},{"line_number":3676,"context_line":"                                                                instance,"},{"line_number":3677,"context_line":"                                                                volume_id)"},{"line_number":3678,"context_line":"            except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_a821d1fd","line":3675,"updated":"2017-11-22 15:30:04.000000000","message":"While this is all technically correct, I think you can just call this method all the time, because it should always pass. \n\nIts only required in the new flow, but I would rather we keep it simple here.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a956196f2948556a8c736ee466ec0da70f0544fb","unresolved":false,"context_lines":[{"line_number":3672,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3673,"context_line":"            try:"},{"line_number":3674,"context_line":"                cinder.is_microversion_supported(context, \u00273.44\u0027)"},{"line_number":3675,"context_line":"                self._check_volume_already_attached_to_instance(context,"},{"line_number":3676,"context_line":"                                                                instance,"},{"line_number":3677,"context_line":"                                                                volume_id)"},{"line_number":3678,"context_line":"            except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_9155ff1f","line":3675,"in_reply_to":"ff82abbf_3e5ad0f2","updated":"2017-11-23 10:20:50.000000000","message":"OK... seems a bit over defensive, but I get why now.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3672,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3673,"context_line":"            try:"},{"line_number":3674,"context_line":"                cinder.is_microversion_supported(context, \u00273.44\u0027)"},{"line_number":3675,"context_line":"                self._check_volume_already_attached_to_instance(context,"},{"line_number":3676,"context_line":"                                                                instance,"},{"line_number":3677,"context_line":"                                                                volume_id)"},{"line_number":3678,"context_line":"            except exception.CinderAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_3e5ad0f2","line":3675,"in_reply_to":"ff82abbf_a821d1fd","updated":"2017-11-23 02:34:54.000000000","message":"If for some reason it doesn\u0027t pass it\u0027s a different behavior for the error case then previously. That\u0027s why I call it only here; we talked about this with Matt earlier.\n\nAnd it might actually fails on the BDM as we said we would have issues with the unique BDM direction, so I would rather keep it seemingly complicated and fix the problem in the flow where it occurs. Otherwise it would be confusing why we do it all the time.\n\nAnd one less call to the DB for the old flow case, which also sounds nice. :)","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3622,"context_line":"        volume \u003d self.volume_api.get(context, volume_id)"},{"line_number":3623,"context_line":"        self.volume_api.check_availability_zone(context, volume,"},{"line_number":3624,"context_line":"                                                instance\u003dinstance)"},{"line_number":3625,"context_line":"        min_compute_version \u003d objects.Service.get_minimum_version("},{"line_number":3626,"context_line":"            context, \u0027nova-compute\u0027)"},{"line_number":3627,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3628,"context_line":"            # Attempt a new style volume attachment, but fallback to old-style"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_23c20987","line":3625,"range":{"start_line":3625,"start_character":46,"end_line":3625,"end_character":65},"updated":"2017-12-01 21:44:51.000000000","message":"This likely needs to be get_minimum_version_all_cells at this point if we\u0027re going a server create (boot from volume) because we don\u0027t know which cell we\u0027d land in.\n\nIf we\u0027re attaching a volume to an instance, then we only care if the cell that the instance is in is fully upgraded to the point of supporting this, so get_minimum_version is fine in that case.\n\nSo the logic is this:\n\nif \u0027id\u0027 in instance:\n    # This is a volume attach to an existing instance, so\n    # we only care about the cell the instance is in.\n    min_compute_version \u003d objects.Service.get_minimum_version\nelse:\n    # The instance is being created and we don\u0027t know which\n    # cell it\u0027s going to land in, so check all cells.\n    min_compute_version \u003d objects.Service.get_minimum_version_all_cells\n\nWe have to check on \u0027id\u0027 because instance.host won\u0027t be set for a shelved-offloaded instance, and we can attach volumes to those.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3622,"context_line":"        volume \u003d self.volume_api.get(context, volume_id)"},{"line_number":3623,"context_line":"        self.volume_api.check_availability_zone(context, volume,"},{"line_number":3624,"context_line":"                                                instance\u003dinstance)"},{"line_number":3625,"context_line":"        min_compute_version \u003d objects.Service.get_minimum_version("},{"line_number":3626,"context_line":"            context, \u0027nova-compute\u0027)"},{"line_number":3627,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3628,"context_line":"            # Attempt a new style volume attachment, but fallback to old-style"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_553d7eb9","line":3625,"range":{"start_line":3625,"start_character":46,"end_line":3625,"end_character":65},"in_reply_to":"df87a7cf_23c20987","updated":"2017-12-02 15:34:30.000000000","message":"Done\n\nBTW, should all the version checks be like this? I mean the one below in attach_volume and also the one I added earlier for the BFV case when we didn\u0027t have the unreserve call?","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"732864ba689333fe44dce6190c494ad7c2e744f7","unresolved":false,"context_lines":[{"line_number":3622,"context_line":"        volume \u003d self.volume_api.get(context, volume_id)"},{"line_number":3623,"context_line":"        self.volume_api.check_availability_zone(context, volume,"},{"line_number":3624,"context_line":"                                                instance\u003dinstance)"},{"line_number":3625,"context_line":"        min_compute_version \u003d objects.Service.get_minimum_version("},{"line_number":3626,"context_line":"            context, \u0027nova-compute\u0027)"},{"line_number":3627,"context_line":"        if min_compute_version \u003e\u003d CINDER_V3_ATTACH_MIN_COMPUTE_VERSION:"},{"line_number":3628,"context_line":"            # Attempt a new style volume attachment, but fallback to old-style"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_1499186d","line":3625,"range":{"start_line":3625,"start_character":46,"end_line":3625,"end_character":65},"in_reply_to":"df87a7cf_553d7eb9","updated":"2017-12-04 16:33:25.000000000","message":"It depends on if we have an existing instance in a cell. If so, then the context variable is targeted to the cell that the instance is pulled from in the _get_instance method. In that case, we just care about the min service version in that cell since you can\u0027t migrate instances across cells.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3645,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3646,"context_line":"        else:"},{"line_number":3647,"context_line":"            LOG.debug(\u0027The compute service version is not high enough to \u0027"},{"line_number":3648,"context_line":"                      \u0027create a new style attachment.\u0027)"},{"line_number":3649,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3650,"context_line":"        return volume"},{"line_number":3651,"context_line":""}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_83d2f533","line":3648,"range":{"start_line":3648,"start_character":42,"end_line":3648,"end_character":52},"updated":"2017-12-01 21:44:51.000000000","message":"volume attachment (for context, because we have port attachments too)","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3645,"context_line":"                self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3646,"context_line":"        else:"},{"line_number":3647,"context_line":"            LOG.debug(\u0027The compute service version is not high enough to \u0027"},{"line_number":3648,"context_line":"                      \u0027create a new style attachment.\u0027)"},{"line_number":3649,"context_line":"            self.volume_api.reserve_volume(context, volume_id)"},{"line_number":3650,"context_line":"        return volume"},{"line_number":3651,"context_line":""}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_f5493260","line":3648,"range":{"start_line":3648,"start_character":42,"end_line":3648,"end_character":52},"in_reply_to":"df87a7cf_83d2f533","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3700,"context_line":"                context, instance,"},{"line_number":3701,"context_line":"                instance_actions.ATTACH_VOLUME)"},{"line_number":3702,"context_line":""},{"line_number":3703,"context_line":"            # NOTE(jdg): For new style attach the above call will create an"},{"line_number":3704,"context_line":"            # attachment record without a connector, which will set the volume"},{"line_number":3705,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3706,"context_line":"            if volume_bdm.attachment_id is None:"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_e3ec21f5","line":3703,"range":{"start_line":3703,"start_character":50,"end_line":3703,"end_character":60},"updated":"2017-12-01 21:44:51.000000000","message":"nit: would be good to be clear and say _check_attach_and_reserve_volume explicitly since these types of comments tend to drift over time with refactors.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3700,"context_line":"                context, instance,"},{"line_number":3701,"context_line":"                instance_actions.ATTACH_VOLUME)"},{"line_number":3702,"context_line":""},{"line_number":3703,"context_line":"            # NOTE(jdg): For new style attach the above call will create an"},{"line_number":3704,"context_line":"            # attachment record without a connector, which will set the volume"},{"line_number":3705,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3706,"context_line":"            if volume_bdm.attachment_id is None:"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_b575ea9a","line":3703,"range":{"start_line":3703,"start_character":50,"end_line":3703,"end_character":60},"in_reply_to":"df87a7cf_e3ec21f5","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3705,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3706,"context_line":"            if volume_bdm.attachment_id is None:"},{"line_number":3707,"context_line":"                # Old style attachment for the volume and instance."},{"line_number":3708,"context_line":"                attach_volume(self,"},{"line_number":3709,"context_line":"                              context,"},{"line_number":3710,"context_line":"                              volume_id,"},{"line_number":3711,"context_line":"                              instance,"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_e32ae18e","line":3708,"range":{"start_line":3708,"start_character":16,"end_line":3708,"end_character":29},"updated":"2017-12-01 21:44:51.000000000","message":"Hmm, if we don\u0027t call attach_volume above, we don\u0027t record the instance action start/finish events for this action for attaching the volume (see _record_action_start)...so I\u0027m thinking we should always call attach_volume here, but pass a flag to that inner method to tell it if it should actually call self.volume_api.attach. That way we always record the instance action and event records but won\u0027t call self.volume_api.attach for the new flow.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3705,"context_line":"            # status to reserved, the next call is just for old-style attach"},{"line_number":3706,"context_line":"            if volume_bdm.attachment_id is None:"},{"line_number":3707,"context_line":"                # Old style attachment for the volume and instance."},{"line_number":3708,"context_line":"                attach_volume(self,"},{"line_number":3709,"context_line":"                              context,"},{"line_number":3710,"context_line":"                              volume_id,"},{"line_number":3711,"context_line":"                              instance,"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_354a3a27","line":3708,"range":{"start_line":3708,"start_character":16,"end_line":3708,"end_character":29},"in_reply_to":"df87a7cf_e32ae18e","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3768,"context_line":"        to override."},{"line_number":3769,"context_line":"        \"\"\""},{"line_number":3770,"context_line":"        try:"},{"line_number":3771,"context_line":"            self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"},{"line_number":3772,"context_line":"        except exception.InvalidInput as exc:"},{"line_number":3773,"context_line":"            raise exception.InvalidVolume(reason\u003dexc.format_message())"},{"line_number":3774,"context_line":"        attachments \u003d volume.get(\u0027attachments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_7ea988dd","line":3771,"updated":"2017-12-01 21:44:51.000000000","message":"So why do we avoid this in _detach_volume_shelved_offloaded but not in this case? We should have a comment in _detach_volume_shelved_offloaded probably.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3768,"context_line":"        to override."},{"line_number":3769,"context_line":"        \"\"\""},{"line_number":3770,"context_line":"        try:"},{"line_number":3771,"context_line":"            self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"},{"line_number":3772,"context_line":"        except exception.InvalidInput as exc:"},{"line_number":3773,"context_line":"            raise exception.InvalidVolume(reason\u003dexc.format_message())"},{"line_number":3774,"context_line":"        attachments \u003d volume.get(\u0027attachments\u0027, {})"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_955ea6e4","line":3771,"in_reply_to":"df87a7cf_7ea988dd","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3838,"context_line":"        self.volume_api.check_availability_zone(context, new_volume,"},{"line_number":3839,"context_line":"                                                instance\u003dinstance)"},{"line_number":3840,"context_line":"        try:"},{"line_number":3841,"context_line":"            self.volume_api.begin_detaching(context, old_volume[\u0027id\u0027])"},{"line_number":3842,"context_line":"        except exception.InvalidInput as exc:"},{"line_number":3843,"context_line":"            raise exception.InvalidVolume(reason\u003dexc.format_message())"},{"line_number":3844,"context_line":""}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_e3a8a178","line":3841,"range":{"start_line":3841,"start_character":12,"end_line":3841,"end_character":70},"updated":"2017-12-01 21:44:51.000000000","message":"If we fail below because the new_volume is already attached to the instance, then we need to call roll_detaching for the old_volume.\n\nself.volume_api.roll_detaching(context, old_volume[\u0027id\u0027])","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3838,"context_line":"        self.volume_api.check_availability_zone(context, new_volume,"},{"line_number":3839,"context_line":"                                                instance\u003dinstance)"},{"line_number":3840,"context_line":"        try:"},{"line_number":3841,"context_line":"            self.volume_api.begin_detaching(context, old_volume[\u0027id\u0027])"},{"line_number":3842,"context_line":"        except exception.InvalidInput as exc:"},{"line_number":3843,"context_line":"            raise exception.InvalidVolume(reason\u003dexc.format_message())"},{"line_number":3844,"context_line":""}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_b5d2ca33","line":3841,"range":{"start_line":3841,"start_character":12,"end_line":3841,"end_character":70},"in_reply_to":"df87a7cf_e3a8a178","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3854,"context_line":"        else:"},{"line_number":3855,"context_line":"            # This is a new-style attachment so for the volume that we are"},{"line_number":3856,"context_line":"            # going to swap to, create a new volume attachment."},{"line_number":3857,"context_line":"            self._check_volume_already_attached_to_instance(context, instance,"},{"line_number":3858,"context_line":"                                                            new_volume[\u0027id\u0027])"},{"line_number":3859,"context_line":"            new_attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3860,"context_line":"                context, new_volume[\u0027id\u0027], instance.uuid)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_63eb31b0","line":3857,"updated":"2017-12-01 21:44:51.000000000","message":"nit: if we wanted to, as an option, which you probably don\u0027t want to, but we could split this new validation method out and it\u0027s check here (along with tests) into a separate patch before this one if you wanted to try and keep things a bit more sane, but I realize at this point you probably don\u0027t want to do that. It just gets hard to review and make sure we have sufficient test coverage for so many changes in a single patch.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3854,"context_line":"        else:"},{"line_number":3855,"context_line":"            # This is a new-style attachment so for the volume that we are"},{"line_number":3856,"context_line":"            # going to swap to, create a new volume attachment."},{"line_number":3857,"context_line":"            self._check_volume_already_attached_to_instance(context, instance,"},{"line_number":3858,"context_line":"                                                            new_volume[\u0027id\u0027])"},{"line_number":3859,"context_line":"            new_attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3860,"context_line":"                context, new_volume[\u0027id\u0027], instance.uuid)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_b5040ac8","line":3857,"in_reply_to":"df87a7cf_63eb31b0","updated":"2017-12-02 15:34:30.000000000","message":"I think I even asked earlier and we said I shouldn\u0027t make a new patch for this. And as it\u0027s only a couple more mocks I\u0027m not sure it would be a significant improvement. I will fix the comments here first, upload a new patch and then see how it looks if I try to split.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"10a77b83e2c55b37d6d4bd1dc8ade4f5edceb484","unresolved":false,"context_lines":[{"line_number":3695,"context_line":"        \"\"\""},{"line_number":3696,"context_line":"        @wrap_instance_event(prefix\u003d\u0027api\u0027)"},{"line_number":3697,"context_line":"        def attach_volume(self, context, v_id, instance, dev, do_attach):"},{"line_number":3698,"context_line":"            if do_attach:"},{"line_number":3699,"context_line":"                self.volume_api.attach(context,"},{"line_number":3700,"context_line":"                                       v_id,"},{"line_number":3701,"context_line":"                                       instance.uuid,"},{"line_number":3702,"context_line":"                                       dev)"},{"line_number":3703,"context_line":""},{"line_number":3704,"context_line":"        volume_bdm \u003d self._create_volume_bdm("},{"line_number":3705,"context_line":"            context, instance, device, volume_id, disk_bus\u003ddisk_bus,"}],"source_content_type":"text/x-python","patch_set":166,"id":"df87a7cf_9f8ea176","line":3702,"range":{"start_line":3698,"start_character":12,"end_line":3702,"end_character":43},"updated":"2017-12-04 16:37:03.000000000","message":"So for the old flow, this marks the attached volume as \u0027in-use\u0027 even though it\u0027s not connected on a host.\n\nWith the new flow, we\u0027d call attachment_complete here for the same logic, correct? Are there problems with doing that once we unshelve? In other words, can we update an attachment that is considered \u0027complete\u0027 with a host connector when it didn\u0027t already have a host connector?","commit_id":"725cd1c4e923f6d86b486edf31fae8e65d827c3a"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e4899b3a17a52a6917c4a95b94c8a39f251452c3","unresolved":false,"context_lines":[{"line_number":3695,"context_line":"        \"\"\""},{"line_number":3696,"context_line":"        @wrap_instance_event(prefix\u003d\u0027api\u0027)"},{"line_number":3697,"context_line":"        def attach_volume(self, context, v_id, instance, dev, do_attach):"},{"line_number":3698,"context_line":"            if do_attach:"},{"line_number":3699,"context_line":"                self.volume_api.attach(context,"},{"line_number":3700,"context_line":"                                       v_id,"},{"line_number":3701,"context_line":"                                       instance.uuid,"},{"line_number":3702,"context_line":"                                       dev)"},{"line_number":3703,"context_line":""},{"line_number":3704,"context_line":"        volume_bdm \u003d self._create_volume_bdm("},{"line_number":3705,"context_line":"            context, instance, device, volume_id, disk_bus\u003ddisk_bus,"}],"source_content_type":"text/x-python","patch_set":166,"id":"df87a7cf_2eddd36f","line":3702,"range":{"start_line":3698,"start_character":12,"end_line":3702,"end_character":43},"in_reply_to":"df87a7cf_9928f386","updated":"2017-12-05 08:40:13.000000000","message":"So as a note here, having the volume in \u0027reserved\u0027 state as it\u0027s not connected to the host anyway would be more sane even if it costs an API microversion. I think e should give it a try to clean it up in Rocky, however I guess we need to maintain the code we introduce here now as a workaround for a very long time anyway. Sadness...\n\nSo on the workaround. We can call attachment_complete on an empty (not connected) attachment. As we designed the new attach API in Cinder to handle attachments as disposable items and create and delete them as we please I would do that here as well. We can create and connect an attachment in one call, so that shouldn\u0027t be any different from an attachment_update call.\n\nThe question is though that I\u0027ll need to check that what does attachment_delete do with a seemingly completed attachment that has no connector. I would think it doesn\u0027t freak out, but I don\u0027t know for sure right now.","commit_id":"725cd1c4e923f6d86b486edf31fae8e65d827c3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"29d9c7149025a69a9ab3b11574beb3bba2ca4d1f","unresolved":false,"context_lines":[{"line_number":3695,"context_line":"        \"\"\""},{"line_number":3696,"context_line":"        @wrap_instance_event(prefix\u003d\u0027api\u0027)"},{"line_number":3697,"context_line":"        def attach_volume(self, context, v_id, instance, dev, do_attach):"},{"line_number":3698,"context_line":"            if do_attach:"},{"line_number":3699,"context_line":"                self.volume_api.attach(context,"},{"line_number":3700,"context_line":"                                       v_id,"},{"line_number":3701,"context_line":"                                       instance.uuid,"},{"line_number":3702,"context_line":"                                       dev)"},{"line_number":3703,"context_line":""},{"line_number":3704,"context_line":"        volume_bdm \u003d self._create_volume_bdm("},{"line_number":3705,"context_line":"            context, instance, device, volume_id, disk_bus\u003ddisk_bus,"}],"source_content_type":"text/x-python","patch_set":166,"id":"df87a7cf_9928f386","line":3702,"range":{"start_line":3698,"start_character":12,"end_line":3702,"end_character":43},"in_reply_to":"df87a7cf_9f8ea176","updated":"2017-12-05 01:56:44.000000000","message":"To recap IRC discussion from today, unless we introduce a new compute API microversion so the API user can opt into this behavior change, we need to maintain the existing old flow behavior here, which means completing the attachment in the shelved offloaded case so that the volume status goes to in-use. The question is (1) can you complete an attachment that doesn\u0027t have a host connector? And if you can, (2) can we update that attachment on the compute during unshelve to add the host connector? Or will the compute need to create a new attachment with the host connector and then delete this \"placeholder\" attachment?\n\nNote that we also need to depend on this change (if not merged by the time you update this) so that we can be sure things are working for attaching a volume to a shelved offloaded instance with the new flow:\n\nhttps://review.openstack.org/#/c/525267/","commit_id":"725cd1c4e923f6d86b486edf31fae8e65d827c3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"732864ba689333fe44dce6190c494ad7c2e744f7","unresolved":false,"context_lines":[{"line_number":3812,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3813,"context_line":"            context, volume[\u0027id\u0027], instance.uuid)"},{"line_number":3814,"context_line":"        # NOTE(ildikov): We call begin_detaching only in case of the old"},{"line_number":3815,"context_line":"        # attach flow as the new attach flow keeps the volume in \u0027reserved\u0027"},{"line_number":3816,"context_line":"        # state for the shelved offloaded case as opposed to \u0027in use\u0027."},{"line_number":3817,"context_line":"        if bdm.attachment_id is None:"},{"line_number":3818,"context_line":"            try:"},{"line_number":3819,"context_line":"                self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":166,"id":"df87a7cf_34d69cc7","line":3816,"range":{"start_line":3815,"start_character":22,"end_line":3816,"end_character":70},"updated":"2017-12-04 16:33:25.000000000","message":"Hmm, this is a change in behavior for attaching a volume to a shelved offloaded instance, correct? I guess we aren\u0027t marking the attached volume as in-use for the shelved offloaded case because we can\u0027t actually attach the volume to the instance on the host until we unshelve the instance (we don\u0027t have a host connector otherwise). And calling complete_attachment from the API to mark the volume as in-use is also probably strange if the attachment doesn\u0027t have a host connector...","commit_id":"725cd1c4e923f6d86b486edf31fae8e65d827c3a"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e4899b3a17a52a6917c4a95b94c8a39f251452c3","unresolved":false,"context_lines":[{"line_number":3812,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3813,"context_line":"            context, volume[\u0027id\u0027], instance.uuid)"},{"line_number":3814,"context_line":"        # NOTE(ildikov): We call begin_detaching only in case of the old"},{"line_number":3815,"context_line":"        # attach flow as the new attach flow keeps the volume in \u0027reserved\u0027"},{"line_number":3816,"context_line":"        # state for the shelved offloaded case as opposed to \u0027in use\u0027."},{"line_number":3817,"context_line":"        if bdm.attachment_id is None:"},{"line_number":3818,"context_line":"            try:"},{"line_number":3819,"context_line":"                self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":166,"id":"df87a7cf_ced54745","line":3816,"range":{"start_line":3815,"start_character":22,"end_line":3816,"end_character":70},"in_reply_to":"df87a7cf_34d69cc7","updated":"2017-12-05 08:40:13.000000000","message":"Added my thoughts above.","commit_id":"725cd1c4e923f6d86b486edf31fae8e65d827c3a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aba44883426770f7c053d4688d40e3b67449b6ce","unresolved":false,"context_lines":[{"line_number":3716,"context_line":"        instance will be unshelved."},{"line_number":3717,"context_line":"        \"\"\""},{"line_number":3718,"context_line":"        @wrap_instance_event(prefix\u003d\u0027api\u0027)"},{"line_number":3719,"context_line":"        def attach_volume(self, context, v_id, instance, dev, do_attach):"},{"line_number":3720,"context_line":"            if do_attach:"},{"line_number":3721,"context_line":"                self.volume_api.attach(context,"},{"line_number":3722,"context_line":"                                       v_id,"}],"source_content_type":"text/x-python","patch_set":169,"id":"df87a7cf_b37cddeb","line":3719,"range":{"start_line":3719,"start_character":62,"end_line":3719,"end_character":71},"updated":"2017-12-05 19:34:08.000000000","message":"We need to remove or rename this variable, since for the new flow we need to call attachment_complete now, that\u0027s why this Tempest test is failing:\n\nhttp://logs.openstack.org/85/330285/169/check/legacy-tempest-dsvm-neutron-full/4838f9d/job-output.txt.gz#_2017-12-05_17_13_06_890713","commit_id":"71ed107f366a0025dc3a9bc2a401c2b1f65442ba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4501062f17307062b754697c1091ec67890fb32e","unresolved":false,"context_lines":[{"line_number":3852,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3853,"context_line":"            context, volume[\u0027id\u0027], instance.uuid)"},{"line_number":3854,"context_line":"        # NOTE(ildikov): We call begin_detaching only in case of the old"},{"line_number":3855,"context_line":"        # attach flow as the new attach flow keeps the volume in \u0027reserved\u0027"},{"line_number":3856,"context_line":"        # state for the shelved offloaded case as opposed to \u0027in use\u0027."},{"line_number":3857,"context_line":"        if bdm.attachment_id is None:"},{"line_number":3858,"context_line":"            try:"},{"line_number":3859,"context_line":"                self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_800ef92f","line":3856,"range":{"start_line":3855,"start_character":22,"end_line":3856,"end_character":70},"updated":"2017-12-06 21:03:37.000000000","message":"Not anymore, we now call attachment_complete when attaching a volume to a shelved offloaded instance, so the volume will be in-use, so can we undo this change? I think this comment is what spurred the whole thing about needing to revert that Tempest patch and actually call attachment_complete when attaching to a shelved offloaded instance.","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"ee42e0d837c84be7de904fd610a34713e084503c","unresolved":false,"context_lines":[{"line_number":3852,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":3853,"context_line":"            context, volume[\u0027id\u0027], instance.uuid)"},{"line_number":3854,"context_line":"        # NOTE(ildikov): We call begin_detaching only in case of the old"},{"line_number":3855,"context_line":"        # attach flow as the new attach flow keeps the volume in \u0027reserved\u0027"},{"line_number":3856,"context_line":"        # state for the shelved offloaded case as opposed to \u0027in use\u0027."},{"line_number":3857,"context_line":"        if bdm.attachment_id is None:"},{"line_number":3858,"context_line":"            try:"},{"line_number":3859,"context_line":"                self.volume_api.begin_detaching(context, volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_000ae988","line":3856,"range":{"start_line":3855,"start_character":22,"end_line":3856,"end_character":70},"in_reply_to":"df87a7cf_800ef92f","updated":"2017-12-06 21:23:21.000000000","message":"Sigh, yes, we need to undo this now.","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"}],"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":4697,"context_line":"                           \u0027schost\u0027: stashed_connector.get(\u0027host\u0027)})"},{"line_number":4698,"context_line":"                connector \u003d stashed_connector"},{"line_number":4699,"context_line":""},{"line_number":4700,"context_line":"        remaining_attachments \u003d self.volume_api.remove_attachment(context,"},{"line_number":4701,"context_line":"                                                                  volume_id,"},{"line_number":4702,"context_line":"                                                                  connector,"},{"line_number":4703,"context_line":"                                                                  instance.uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_4e5e66ea","line":4700,"range":{"start_line":4700,"start_character":8,"end_line":4700,"end_character":29},"updated":"2016-06-20 16:58:02.000000000","message":"Unused var.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":4697,"context_line":"                           \u0027schost\u0027: stashed_connector.get(\u0027host\u0027)})"},{"line_number":4698,"context_line":"                connector \u003d stashed_connector"},{"line_number":4699,"context_line":""},{"line_number":4700,"context_line":"        remaining_attachments \u003d self.volume_api.remove_attachment(context,"},{"line_number":4701,"context_line":"                                                                  volume_id,"},{"line_number":4702,"context_line":"                                                                  connector,"},{"line_number":4703,"context_line":"                                                                  instance.uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_9f935aa3","line":4700,"range":{"start_line":4700,"start_character":8,"end_line":4700,"end_character":29},"in_reply_to":"5a9d85d2_4e5e66ea","updated":"2016-06-20 17:45:52.000000000","message":"Done","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":4702,"context_line":"                                                                  connector,"},{"line_number":4703,"context_line":"                                                                  instance.uuid,"},{"line_number":4704,"context_line":"                                                                  mp)"},{"line_number":4705,"context_line":"        if destroy_bdm:"},{"line_number":4706,"context_line":"            bdm.destroy()"},{"line_number":4707,"context_line":""},{"line_number":4708,"context_line":"        info \u003d dict(volume_id\u003dvolume_id)"},{"line_number":4709,"context_line":"        self._notify_about_instance_usage("}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_6ee24205","line":4706,"range":{"start_line":4705,"start_character":8,"end_line":4706,"end_character":25},"updated":"2016-06-20 16:58:02.000000000","message":"I\u0027m not sure if this should happen before or after remove_attachment, or if it doesn\u0027t matter. If this fails and we already removed the attachment, then it\u0027s basically useless. If we did this first and remove_attachment fails, then nova doesn\u0027t have a view back in to try again, so it\u0027s probably better to happen after we\u0027ve removed the attachment I suppose.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":4702,"context_line":"                                                                  connector,"},{"line_number":4703,"context_line":"                                                                  instance.uuid,"},{"line_number":4704,"context_line":"                                                                  mp)"},{"line_number":4705,"context_line":"        if destroy_bdm:"},{"line_number":4706,"context_line":"            bdm.destroy()"},{"line_number":4707,"context_line":""},{"line_number":4708,"context_line":"        info \u003d dict(volume_id\u003dvolume_id)"},{"line_number":4709,"context_line":"        self._notify_about_instance_usage("}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_9f1d1a12","line":4706,"range":{"start_line":4705,"start_character":8,"end_line":4706,"end_character":25},"in_reply_to":"5a9d85d2_6ee24205","updated":"2016-06-20 17:45:52.000000000","message":"yes, I\u0027ve gone back and forth on where this should be.  I\u0027m honestly not completely sure still. I came to the conclusion you did, however one thing I didn\u0027t think of.. we could certainly recreate the attachment (we have all the info here).  The only reason I don\u0027t like that is perhaps something\u0027s out of sync and the attachment just doesn\u0027t exist.  I\u0027d had to recreate it just so we can delete it.  Might need some more thought here, or a better understanding of failure scenarios for bdm.destroy","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":4705,"context_line":"        if destroy_bdm:"},{"line_number":4706,"context_line":"            bdm.destroy()"},{"line_number":4707,"context_line":""},{"line_number":4708,"context_line":"        info \u003d dict(volume_id\u003dvolume_id)"},{"line_number":4709,"context_line":"        self._notify_about_instance_usage("},{"line_number":4710,"context_line":"            context, instance, \"volume.detach\", extra_usage_info\u003dinfo)"},{"line_number":4711,"context_line":""},{"line_number":4712,"context_line":"    @wrap_exception()"},{"line_number":4713,"context_line":"    @wrap_instance_fault"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_ae48aa2e","line":4710,"range":{"start_line":4708,"start_character":8,"end_line":4710,"end_character":70},"updated":"2016-06-20 16:58:02.000000000","message":"This probably needs to happen before remove_attachment.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":4705,"context_line":"        if destroy_bdm:"},{"line_number":4706,"context_line":"            bdm.destroy()"},{"line_number":4707,"context_line":""},{"line_number":4708,"context_line":"        info \u003d dict(volume_id\u003dvolume_id)"},{"line_number":4709,"context_line":"        self._notify_about_instance_usage("},{"line_number":4710,"context_line":"            context, instance, \"volume.detach\", extra_usage_info\u003dinfo)"},{"line_number":4711,"context_line":""},{"line_number":4712,"context_line":"    @wrap_exception()"},{"line_number":4713,"context_line":"    @wrap_instance_fault"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_5fb9f2e8","line":4710,"range":{"start_line":4708,"start_character":8,"end_line":4710,"end_character":70},"in_reply_to":"5a9d85d2_ae48aa2e","updated":"2016-06-20 17:45:52.000000000","message":"I can certainly move it no problem.  I kept it in the sequence it was in mostly because I figured we shouldn\u0027t send the notification until the call is actually completed.  If you think that\u0027s not quite right I\u0027m happy to move it.  Just want to point out the logic and see what you think.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c53ff3d244eda34c32e2f840e064b83330f35255","unresolved":false,"context_lines":[{"line_number":4644,"context_line":""},{"line_number":4645,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":4646,"context_line":"                context, volume_id, instance.uuid)"},{"line_number":4647,"context_line":"        mp \u003d bdm.device_name"},{"line_number":4648,"context_line":"        # Handle bootable volumes which will not contain /dev/"},{"line_number":4649,"context_line":"        if \u0027/dev/\u0027 in mp:"},{"line_number":4650,"context_line":"            mp \u003d mp[5:]"},{"line_number":4651,"context_line":""},{"line_number":4652,"context_line":"        if CONF.volume_usage_poll_interval \u003e 0:"},{"line_number":4653,"context_line":"            vol_stats \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_72f553eb","line":4650,"range":{"start_line":4647,"start_character":8,"end_line":4650,"end_character":23},"updated":"2016-06-25 15:03:21.000000000","message":"Why did you move this out?","commit_id":"08a6d1787a18f75ba55517b579e22cd478153cdd"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c6281cda59ec0e630128c3096688ec3ec25e1d7a","unresolved":false,"context_lines":[{"line_number":4644,"context_line":""},{"line_number":4645,"context_line":"        bdm \u003d objects.BlockDeviceMapping.get_by_volume_and_instance("},{"line_number":4646,"context_line":"                context, volume_id, instance.uuid)"},{"line_number":4647,"context_line":"        mp \u003d bdm.device_name"},{"line_number":4648,"context_line":"        # Handle bootable volumes which will not contain /dev/"},{"line_number":4649,"context_line":"        if \u0027/dev/\u0027 in mp:"},{"line_number":4650,"context_line":"            mp \u003d mp[5:]"},{"line_number":4651,"context_line":""},{"line_number":4652,"context_line":"        if CONF.volume_usage_poll_interval \u003e 0:"},{"line_number":4653,"context_line":"            vol_stats \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_6d6c5108","line":4650,"range":{"start_line":4647,"start_character":8,"end_line":4650,"end_character":23},"in_reply_to":"3aaa91ec_72f553eb","updated":"2016-06-26 14:38:16.000000000","message":"Never mind, I found it. :)","commit_id":"08a6d1787a18f75ba55517b579e22cd478153cdd"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"c53ff3d244eda34c32e2f840e064b83330f35255","unresolved":false,"context_lines":[{"line_number":4715,"context_line":"                connector \u003d stashed_connector"},{"line_number":4716,"context_line":""},{"line_number":4717,"context_line":"        # TODO(jdg): remove_attachments will return a list of attachment"},{"line_number":4718,"context_line":"        # objects from Cinder, we can use these to robustify the disconnection"},{"line_number":4719,"context_line":"        # of the target on the Nova side, as well as make sure we don\u0027t remove"},{"line_number":4720,"context_line":"        # an entry that we may be sharing for multi-attach"},{"line_number":4721,"context_line":"        self.volume_api.remove_attachment(context,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_727ef36a","line":4718,"range":{"start_line":4718,"start_character":65,"end_line":4718,"end_character":78},"updated":"2016-06-25 15:03:21.000000000","message":"Do you still plan to add a \u0027safe_to_disconnect\u0027 or smth similar to the Cinder API that Nova can call to figure out whether it should call disconnect or not?","commit_id":"08a6d1787a18f75ba55517b579e22cd478153cdd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"            self._add_missing_dev_names(bdms, instance)"},{"line_number":1577,"context_line":"            block_device_info \u003d driver.get_block_device_info(instance, bdms)"},{"line_number":1578,"context_line":"            mapping \u003d driver.block_device_info_get_mapping(block_device_info)"},{"line_number":1579,"context_line":"            # FIXME(jdg):  modify this to an update attachment"},{"line_number":1580,"context_line":"            # Call above fails too :("},{"line_number":1581,"context_line":"            driver_block_device.attach_block_devices("},{"line_number":1582,"context_line":"                mapping, context, instance, self.volume_api, self.driver,"},{"line_number":1583,"context_line":"                wait_func\u003dself._await_block_device_map_created)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_8458c3f9","line":1580,"range":{"start_line":1579,"start_character":12,"end_line":1580,"end_character":37},"updated":"2017-05-25 03:14:21.000000000","message":"With boot from volume, unless we were provided a volume when the server was created, we don\u0027t have an attachment yet, because driver_block_device.attach_block_devices creates the volume if source_type is image/snapshot/blank, and then _await_block_device_map_created waits for the volume to be available, and then attaches it to the server.\n\nBFV sucks. We\u0027ve been telling you.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"            self._add_missing_dev_names(bdms, instance)"},{"line_number":1577,"context_line":"            block_device_info \u003d driver.get_block_device_info(instance, bdms)"},{"line_number":1578,"context_line":"            mapping \u003d driver.block_device_info_get_mapping(block_device_info)"},{"line_number":1579,"context_line":"            # FIXME(jdg):  modify this to an update attachment"},{"line_number":1580,"context_line":"            # Call above fails too :("},{"line_number":1581,"context_line":"            driver_block_device.attach_block_devices("},{"line_number":1582,"context_line":"                mapping, context, instance, self.volume_api, self.driver,"},{"line_number":1583,"context_line":"                wait_func\u003dself._await_block_device_map_created)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_80889a22","line":1580,"range":{"start_line":1579,"start_character":12,"end_line":1580,"end_character":37},"in_reply_to":"ff0f0b1f_8458c3f9","updated":"2017-05-25 23:43:14.000000000","message":"Ha!  Touchet, FTR BFV is AWESOME, it\u0027s just that our legacy implementation sucks :)","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"24b419dcbe0e28fdfc2988fdddc76eb42e830398","unresolved":false,"context_lines":[{"line_number":5091,"context_line":"                    # new attachment Record and that\u0027s what we want"},{"line_number":5092,"context_line":"                    ov_status \u003d self.volume_api.get(context,"},{"line_number":5093,"context_line":"                                                    old_volume_id)[\u0027status\u0027]"},{"line_number":5094,"context_line":"                    is_cinder_migration \u003d ("},{"line_number":5095,"context_line":"                        True if ov_status in [\u0027retyping\u0027,"},{"line_number":5096,"context_line":"                                              \u0027migrating\u0027] else False)"},{"line_number":5097,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_11a79f0d","line":5094,"updated":"2017-06-15 14:52:20.000000000","message":"We should probably migrate the swap volume bits of this change over to the patch dedicated to swap volume:\n\nhttps://review.openstack.org/#/c/456971/7/nova/compute/manager.py@5098","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6904e16d3ad9f4efee4679bf7737aefea7c5feab","unresolved":false,"context_lines":[{"line_number":5091,"context_line":"                    # new attachment Record and that\u0027s what we want"},{"line_number":5092,"context_line":"                    ov_status \u003d self.volume_api.get(context,"},{"line_number":5093,"context_line":"                                                    old_volume_id)[\u0027status\u0027]"},{"line_number":5094,"context_line":"                    is_cinder_migration \u003d ("},{"line_number":5095,"context_line":"                        True if ov_status in [\u0027retyping\u0027,"},{"line_number":5096,"context_line":"                                              \u0027migrating\u0027] else False)"},{"line_number":5097,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_74b921ca","line":5094,"in_reply_to":"7f231b9d_11a79f0d","updated":"2017-06-15 15:30:07.000000000","message":"I pulled these changes over to https://review.openstack.org/#/c/456971/8","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0caeab2506ace91864b81ffeb69b085b6a3e29f4","unresolved":false,"context_lines":[{"line_number":5108,"context_line":"                        # 2. new_volume_id if we are swapping two existing vols"},{"line_number":5109,"context_line":"                        # This volume id is later used to update the volume_id"},{"line_number":5110,"context_line":"                        # and connection_info[\u0027serial\u0027] of the BDM."},{"line_number":5111,"context_line":"                        comp_ret \u003d self.volume_api.migrate_volume_completion("},{"line_number":5112,"context_line":"                                context,"},{"line_number":5113,"context_line":"                                old_volume_id,"},{"line_number":5114,"context_line":"                                new_volume_id,"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_9444bd48","line":5111,"range":{"start_line":5111,"start_character":51,"end_line":5111,"end_character":76},"updated":"2017-06-15 15:27:12.000000000","message":"We are now no longer calling this in the old style attachment block above, which is wrong.","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1688fbb9c5e0a17852d2e7839b4e8dc8854bccfc","unresolved":false,"context_lines":[{"line_number":5137,"context_line":"        connector \u003d self.driver.get_volume_connector(instance)"},{"line_number":5138,"context_line":""},{"line_number":5139,"context_line":"        resize_to \u003d 0"},{"line_number":5140,"context_line":"        old_vol_size \u003d self.volume_api.get(context, old_volume_id)[\u0027size\u0027]"},{"line_number":5141,"context_line":"        new_vol_size \u003d self.volume_api.get(context, new_volume_id)[\u0027size\u0027]"},{"line_number":5142,"context_line":"        if new_vol_size \u003e old_vol_size:"},{"line_number":5143,"context_line":"            resize_to \u003d new_vol_size"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_11d31fd7","line":5140,"range":{"start_line":5140,"start_character":23,"end_line":5140,"end_character":66},"updated":"2017-06-15 15:09:05.000000000","message":"We get the old volume here so we can just pull it\u0027s status and pass that to _swap_volume.","commit_id":"729b353a33d1a9d366e8bb18833bd5c2f3afb76d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":2893,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":2894,"context_line":""},{"line_number":2895,"context_line":"        files \u003d self._decode_files(injected_files)"},{"line_number":2896,"context_line":""},{"line_number":2897,"context_line":"        kwargs \u003d dict("},{"line_number":2898,"context_line":"            context\u003dcontext,"},{"line_number":2899,"context_line":"            instance\u003dinstance,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_20c1a72f","side":"PARENT","line":2896,"updated":"2017-07-21 02:24:43.000000000","message":"good lord an unrelated whitespace change","commit_id":"363146cbcb4d9e8b0da3f7f26745579367815aac"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":2893,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":2894,"context_line":""},{"line_number":2895,"context_line":"        files \u003d self._decode_files(injected_files)"},{"line_number":2896,"context_line":""},{"line_number":2897,"context_line":"        kwargs \u003d dict("},{"line_number":2898,"context_line":"            context\u003dcontext,"},{"line_number":2899,"context_line":"            instance\u003dinstance,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_8ce0ad98","side":"PARENT","line":2896,"in_reply_to":"1f1a1f67_20c1a72f","updated":"2017-07-21 08:14:39.000000000","message":"Done :)","commit_id":"363146cbcb4d9e8b0da3f7f26745579367815aac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":4912,"context_line":"            # the host connector, which will give us back the new attachment"},{"line_number":4913,"context_line":"            # connection_info."},{"line_number":4914,"context_line":"            new_cinfo \u003d self.volume_api.attachment_update("},{"line_number":4915,"context_line":"                context, new_attachment_id, connector).connection_info"},{"line_number":4916,"context_line":""},{"line_number":4917,"context_line":"        old_cinfo \u003d jsonutils.loads(bdm[\u0027connection_info\u0027])"},{"line_number":4918,"context_line":"        if old_cinfo and \u0027serial\u0027 not in old_cinfo:"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_a017f751","side":"PARENT","line":4915,"range":{"start_line":4915,"start_character":54,"end_line":4915,"end_character":70},"updated":"2017-07-21 02:24:43.000000000","message":"Why is this removed?","commit_id":"363146cbcb4d9e8b0da3f7f26745579367815aac"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":4912,"context_line":"            # the host connector, which will give us back the new attachment"},{"line_number":4913,"context_line":"            # connection_info."},{"line_number":4914,"context_line":"            new_cinfo \u003d self.volume_api.attachment_update("},{"line_number":4915,"context_line":"                context, new_attachment_id, connector).connection_info"},{"line_number":4916,"context_line":""},{"line_number":4917,"context_line":"        old_cinfo \u003d jsonutils.loads(bdm[\u0027connection_info\u0027])"},{"line_number":4918,"context_line":"        if old_cinfo and \u0027serial\u0027 not in old_cinfo:"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_cf6577e3","side":"PARENT","line":4915,"range":{"start_line":4915,"start_character":54,"end_line":4915,"end_character":70},"in_reply_to":"1f1a1f67_a017f751","updated":"2017-07-21 08:14:39.000000000","message":"We got issues with the the \u0027data\u0027 key that got removed from connection_info, etc. therefore we reshaped the response of attachment_update to fit. This means it returns the connection_info now so it is not embedded to a bigger structure anymore.","commit_id":"363146cbcb4d9e8b0da3f7f26745579367815aac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":2891,"context_line":"                if bdm.is_volume:"},{"line_number":2892,"context_line":"                    self._detach_volume(context, bdm, instance,"},{"line_number":2893,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":2894,"context_line":"                if bdm.is_volume and bdm.attachment_id:"},{"line_number":2895,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2896,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":2897,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_40d94320","line":2894,"range":{"start_line":2894,"start_character":16,"end_line":2894,"end_character":32},"updated":"2017-07-21 02:24:43.000000000","message":"This is redundant with the check on L2891, so couldn\u0027t we just indent this and check if bdm.attachment_id is set?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":2891,"context_line":"                if bdm.is_volume:"},{"line_number":2892,"context_line":"                    self._detach_volume(context, bdm, instance,"},{"line_number":2893,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":2894,"context_line":"                if bdm.is_volume and bdm.attachment_id:"},{"line_number":2895,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2896,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":2897,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_6c78b1f7","line":2894,"range":{"start_line":2894,"start_character":16,"end_line":2894,"end_character":32},"in_reply_to":"1f1a1f67_40d94320","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":2892,"context_line":"                    self._detach_volume(context, bdm, instance,"},{"line_number":2893,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":2894,"context_line":"                if bdm.is_volume and bdm.attachment_id:"},{"line_number":2895,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2896,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":2897,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":2898,"context_line":"                    bdm.save()"},{"line_number":2899,"context_line":"        files \u003d self._decode_files(injected_files)"},{"line_number":2900,"context_line":"        kwargs \u003d dict("},{"line_number":2901,"context_line":"            context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_00134bba","line":2898,"range":{"start_line":2895,"start_character":20,"end_line":2898,"end_character":30},"updated":"2017-07-21 02:24:43.000000000","message":"Why do we need to create another attachment here since this method is called detach_block_devices? Since the _detach_volume above deletes the new style volume attachment, does that means the volume is temporarily available and we have to create another attachment without a connector to put the volume in reserved state? Or am I missing something? Either way we\u0027d need a comment here but it\u0027s fishy.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":2892,"context_line":"                    self._detach_volume(context, bdm, instance,"},{"line_number":2893,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":2894,"context_line":"                if bdm.is_volume and bdm.attachment_id:"},{"line_number":2895,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2896,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":2897,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":2898,"context_line":"                    bdm.save()"},{"line_number":2899,"context_line":"        files \u003d self._decode_files(injected_files)"},{"line_number":2900,"context_line":"        kwargs \u003d dict("},{"line_number":2901,"context_line":"            context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_2caab984","line":2898,"range":{"start_line":2895,"start_character":20,"end_line":2898,"end_character":30},"in_reply_to":"1f1a1f67_00134bba","updated":"2017-07-21 08:14:39.000000000","message":"Yes, during this flow we don\u0027t have an explicit place to reserve the volume for the time it\u0027s not attached, therefore we do it here not to create a window when things might go wrong.\n\nI will add a comment for now and we can figure it out later what to do with it.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":2905,"context_line":"            admin_password\u003dnew_pass,"},{"line_number":2906,"context_line":"            bdms\u003dbdms,"},{"line_number":2907,"context_line":"            detach_block_devices\u003ddetach_block_devices,"},{"line_number":2908,"context_line":"            attach_block_devices\u003dself._prep_block_device,"},{"line_number":2909,"context_line":"            block_device_info\u003dblock_device_info,"},{"line_number":2910,"context_line":"            network_info\u003dnetwork_info,"},{"line_number":2911,"context_line":"            preserve_ephemeral\u003dpreserve_ephemeral,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_a05ff770","line":2908,"range":{"start_line":2908,"start_character":38,"end_line":2908,"end_character":56},"updated":"2017-07-21 02:24:43.000000000","message":"This is what should create the new attachment record for the BDMs, so why are we recreating them above in detach_block_devices?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":2905,"context_line":"            admin_password\u003dnew_pass,"},{"line_number":2906,"context_line":"            bdms\u003dbdms,"},{"line_number":2907,"context_line":"            detach_block_devices\u003ddetach_block_devices,"},{"line_number":2908,"context_line":"            attach_block_devices\u003dself._prep_block_device,"},{"line_number":2909,"context_line":"            block_device_info\u003dblock_device_info,"},{"line_number":2910,"context_line":"            network_info\u003dnetwork_info,"},{"line_number":2911,"context_line":"            preserve_ephemeral\u003dpreserve_ephemeral,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_ecd961f4","line":2908,"range":{"start_line":2908,"start_character":38,"end_line":2908,"end_character":56},"in_reply_to":"1f1a1f67_a05ff770","updated":"2017-07-21 08:14:39.000000000","message":"This one is used by multiple calls and it didn\u0027t seem like a good idea to mess it up as the special cases need special care based on my experience so far.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":3900,"context_line":"                    # attach API\u0027s was to have a new code fork/path that we"},{"line_number":3901,"context_line":"                    # followed, we\u0027re not going to do that so we have to do"},{"line_number":3902,"context_line":"                    # some extra work in here to make it *behave* just like the"},{"line_number":3903,"context_line":"                    # old code.  We don\u0027t allow disconnect/reconnect (you"},{"line_number":3904,"context_line":"                    # just delete the attachment and get a new one)"},{"line_number":3905,"context_line":"                    # attachments in the new attach code so we have to do"},{"line_number":3906,"context_line":"                    # a delete and create without a connector (reserve),"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_20f9a74c","line":3903,"range":{"start_line":3903,"start_character":33,"end_line":3903,"end_character":35},"updated":"2017-07-21 02:24:43.000000000","message":"s/We don\u0027t/Cinder doesn\u0027t/ ?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":3900,"context_line":"                    # attach API\u0027s was to have a new code fork/path that we"},{"line_number":3901,"context_line":"                    # followed, we\u0027re not going to do that so we have to do"},{"line_number":3902,"context_line":"                    # some extra work in here to make it *behave* just like the"},{"line_number":3903,"context_line":"                    # old code.  We don\u0027t allow disconnect/reconnect (you"},{"line_number":3904,"context_line":"                    # just delete the attachment and get a new one)"},{"line_number":3905,"context_line":"                    # attachments in the new attach code so we have to do"},{"line_number":3906,"context_line":"                    # a delete and create without a connector (reserve),"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_cc8465b4","line":3903,"range":{"start_line":3903,"start_character":33,"end_line":3903,"end_character":35},"in_reply_to":"1f1a1f67_20f9a74c","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":3904,"context_line":"                    # just delete the attachment and get a new one)"},{"line_number":3905,"context_line":"                    # attachments in the new attach code so we have to do"},{"line_number":3906,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":3907,"context_line":"                    # in other words, beware"},{"line_number":3908,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3909,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":3910,"context_line":"                    # Need to update both the driver bdm AND the raw bdm"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_c06b13ef","line":3907,"range":{"start_line":3907,"start_character":22,"end_line":3907,"end_character":44},"updated":"2017-07-21 02:24:43.000000000","message":"What does this mean? Race window where the volume is temporarily available?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":3906,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":3907,"context_line":"                    # in other words, beware"},{"line_number":3908,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3909,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":3910,"context_line":"                    # Need to update both the driver bdm AND the raw bdm"},{"line_number":3911,"context_line":"                    # objects"},{"line_number":3912,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_e04f2f90","line":3909,"range":{"start_line":3909,"start_character":33,"end_line":3909,"end_character":50},"updated":"2017-07-21 02:24:43.000000000","message":"This is an object so please use bdm.volume_id - we want to remove the dict compat stuff over time.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":3906,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":3907,"context_line":"                    # in other words, beware"},{"line_number":3908,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3909,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":3910,"context_line":"                    # Need to update both the driver bdm AND the raw bdm"},{"line_number":3911,"context_line":"                    # objects"},{"line_number":3912,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_4c505533","line":3909,"range":{"start_line":3909,"start_character":33,"end_line":3909,"end_character":50},"in_reply_to":"1f1a1f67_e04f2f90","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":3907,"context_line":"                    # in other words, beware"},{"line_number":3908,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3909,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":3910,"context_line":"                    # Need to update both the driver bdm AND the raw bdm"},{"line_number":3911,"context_line":"                    # objects"},{"line_number":3912,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":3913,"context_line":"                    bdm.save()"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_8023dbbe","line":3910,"range":{"start_line":3910,"start_character":46,"end_line":3910,"end_character":56},"updated":"2017-07-21 02:24:43.000000000","message":"As far as I can tell, this method is only called with nova.objects.BlockDeviceMapping objects, so it wouldn\u0027t be the nova.virt.block_device.DriverBlockDevice things. This comment is kind of confusing so I\u0027d just remove it.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":3907,"context_line":"                    # in other words, beware"},{"line_number":3908,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3909,"context_line":"                        context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":3910,"context_line":"                    # Need to update both the driver bdm AND the raw bdm"},{"line_number":3911,"context_line":"                    # objects"},{"line_number":3912,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":3913,"context_line":"                    bdm.save()"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_cc5b4552","line":3910,"range":{"start_line":3910,"start_character":46,"end_line":3910,"end_character":56},"in_reply_to":"1f1a1f67_8023dbbe","updated":"2017-07-21 08:14:39.000000000","message":"Left here by mistake. Done.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":4792,"context_line":"                              {\u0027volume_id\u0027: bdm.volume_id,"},{"line_number":4793,"context_line":"                               \u0027mountpoint\u0027: bdm[\u0027mount_device\u0027]},"},{"line_number":4794,"context_line":"                              instance\u003dinstance)"},{"line_number":4795,"context_line":"                if bdm[\u0027attachment_id\u0027]:"},{"line_number":4796,"context_line":"                    self.volume_api.attachment_delete(context,"},{"line_number":4797,"context_line":"                                                      bdm[\u0027attachment_id\u0027])"},{"line_number":4798,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_402dc3a6","line":4795,"range":{"start_line":4795,"start_character":19,"end_line":4795,"end_character":39},"updated":"2017-07-21 02:24:43.000000000","message":"bdm.attachment_id so we don\u0027t need the dict compat","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":4792,"context_line":"                              {\u0027volume_id\u0027: bdm.volume_id,"},{"line_number":4793,"context_line":"                               \u0027mountpoint\u0027: bdm[\u0027mount_device\u0027]},"},{"line_number":4794,"context_line":"                              instance\u003dinstance)"},{"line_number":4795,"context_line":"                if bdm[\u0027attachment_id\u0027]:"},{"line_number":4796,"context_line":"                    self.volume_api.attachment_delete(context,"},{"line_number":4797,"context_line":"                                                      bdm[\u0027attachment_id\u0027])"},{"line_number":4798,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_4c35f5f6","line":4795,"range":{"start_line":4795,"start_character":19,"end_line":4795,"end_character":39},"in_reply_to":"1f1a1f67_402dc3a6","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"f0548f981344b43bcdb5cc9225fd88163fca3406","unresolved":false,"context_lines":[{"line_number":4792,"context_line":"                              {\u0027volume_id\u0027: bdm.volume_id,"},{"line_number":4793,"context_line":"                               \u0027mountpoint\u0027: bdm[\u0027mount_device\u0027]},"},{"line_number":4794,"context_line":"                              instance\u003dinstance)"},{"line_number":4795,"context_line":"                if bdm[\u0027attachment_id\u0027]:"},{"line_number":4796,"context_line":"                    self.volume_api.attachment_delete(context,"},{"line_number":4797,"context_line":"                                                      bdm[\u0027attachment_id\u0027])"},{"line_number":4798,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_468ee927","line":4795,"range":{"start_line":4795,"start_character":19,"end_line":4795,"end_character":39},"in_reply_to":"1f1a1f67_4c35f5f6","updated":"2017-07-21 13:34:23.000000000","message":"So if I switch to bdm.attachment_id this blows up as DriverBlockDevice is a dict:\n\n File \"nova/virt/block_device.py\", line 125, in __getattr__\n        super(DriverBlockDevice, self).__getattr__(name)\n    AttributeError: \u0027super\u0027 object has no attribute \u0027__getattr__\u0027","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":4794,"context_line":"                              instance\u003dinstance)"},{"line_number":4795,"context_line":"                if bdm[\u0027attachment_id\u0027]:"},{"line_number":4796,"context_line":"                    self.volume_api.attachment_delete(context,"},{"line_number":4797,"context_line":"                                                      bdm[\u0027attachment_id\u0027])"},{"line_number":4798,"context_line":"                else:"},{"line_number":4799,"context_line":"                    self.volume_api.unreserve_volume(context, bdm.volume_id)"},{"line_number":4800,"context_line":"                compute_utils.notify_about_volume_attach_detach("}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_202ac78f","line":4797,"range":{"start_line":4797,"start_character":54,"end_line":4797,"end_character":74},"updated":"2017-07-21 02:24:43.000000000","message":"same","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":4794,"context_line":"                              instance\u003dinstance)"},{"line_number":4795,"context_line":"                if bdm[\u0027attachment_id\u0027]:"},{"line_number":4796,"context_line":"                    self.volume_api.attachment_delete(context,"},{"line_number":4797,"context_line":"                                                      bdm[\u0027attachment_id\u0027])"},{"line_number":4798,"context_line":"                else:"},{"line_number":4799,"context_line":"                    self.volume_api.unreserve_volume(context, bdm.volume_id)"},{"line_number":4800,"context_line":"                compute_utils.notify_about_volume_attach_detach("}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_ec23a1bd","line":4797,"range":{"start_line":4797,"start_character":54,"end_line":4797,"end_character":74},"in_reply_to":"1f1a1f67_202ac78f","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"49a7bad42a5ac42a0a8c9ef117c50ebf33a31df1","unresolved":false,"context_lines":[{"line_number":4480,"context_line":"        # Delete system_metadata for a shelved instance"},{"line_number":4481,"context_line":"        compute_utils.remove_shelved_keys_from_system_metadata(instance)"},{"line_number":4482,"context_line":""},{"line_number":4483,"context_line":"        # final step is notify cinder the volumes have been reconnected"},{"line_number":4484,"context_line":"        # (V3 Attachments only)"},{"line_number":4485,"context_line":"        for bdm in bdms:"},{"line_number":4486,"context_line":"            if bdm.attachment_id:"},{"line_number":4487,"context_line":"                # NOTE(jdg): We try to keep the attachment_complete call"},{"line_number":4488,"context_line":"                # as high in the stack as possible, making it one of the"},{"line_number":4489,"context_line":"                # last things we do, and ensure that the underlying"},{"line_number":4490,"context_line":"                # connection have been made down in the guts of block-device"},{"line_number":4491,"context_line":"                # and os-brick"},{"line_number":4492,"context_line":"                self.volume_api.attachment_complete(context, bdm.attachment_id)"},{"line_number":4493,"context_line":""},{"line_number":4494,"context_line":"        instance.save(expected_task_state\u003dtask_states.SPAWNING)"},{"line_number":4495,"context_line":"        self._update_scheduler_instance_info(context, instance)"}],"source_content_type":"text/x-python","patch_set":121,"id":"9f436f4f_15c3cb8a","line":4492,"range":{"start_line":4483,"start_character":8,"end_line":4492,"end_character":79},"updated":"2017-08-16 17:47:09.000000000","message":"I think this is duplicated as _prep_block_device is called in line #4438 where you added attachment_complete already.","commit_id":"8238c7eeee230d04dbe95f2459fac1959a8dc45b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e89125ac3574b64a57b281712392367e7d46cb41","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                mapping, context, instance, self.volume_api, self.driver,"},{"line_number":1568,"context_line":"                wait_func\u003dself._await_block_device_map_created)"},{"line_number":1569,"context_line":"            for bdm in bdms:"},{"line_number":1570,"context_line":"                if bdm.attachment_id:"},{"line_number":1571,"context_line":"                    self.volume_api.attachment_complete(context,"},{"line_number":1572,"context_line":"                                                        bdm.attachment_id)"},{"line_number":1573,"context_line":""}],"source_content_type":"text/x-python","patch_set":133,"id":"7f287b81_c8a4d74d","line":1570,"updated":"2017-09-07 16:07:40.000000000","message":"Should this logic not live inside the attach_block_devices call next to the other calls to cinder?\n\nhttps://github.com/openstack/nova/blob/master/nova/virt/block_device.py#L362","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"83e6d30fe835d269053a9b17ec514f3ef3b8463c","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                mapping, context, instance, self.volume_api, self.driver,"},{"line_number":1568,"context_line":"                wait_func\u003dself._await_block_device_map_created)"},{"line_number":1569,"context_line":"            for bdm in bdms:"},{"line_number":1570,"context_line":"                if bdm.attachment_id:"},{"line_number":1571,"context_line":"                    self.volume_api.attachment_complete(context,"},{"line_number":1572,"context_line":"                                                        bdm.attachment_id)"},{"line_number":1573,"context_line":""}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_f50e878b","line":1570,"in_reply_to":"5f2577a7_4485fdac","updated":"2017-09-13 17:28:08.000000000","message":"If understand it correctly that this boils down to bdm.attach by the end of the day, then we call attachment_complete in _volume_attach in line #484 here: https://review.openstack.org/#/c/330285/136/nova/virt/block_device.py which would make this a duplicate here. Or do I miss something?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9a3d2b068966e1296eca7531ab73b6f8fee9159f","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"                mapping, context, instance, self.volume_api, self.driver,"},{"line_number":1568,"context_line":"                wait_func\u003dself._await_block_device_map_created)"},{"line_number":1569,"context_line":"            for bdm in bdms:"},{"line_number":1570,"context_line":"                if bdm.attachment_id:"},{"line_number":1571,"context_line":"                    self.volume_api.attachment_complete(context,"},{"line_number":1572,"context_line":"                                                        bdm.attachment_id)"},{"line_number":1573,"context_line":""}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_4485fdac","line":1570,"in_reply_to":"7f287b81_c8a4d74d","updated":"2017-09-10 16:39:18.000000000","message":"I believe moving this to that layer would cause a number of the special cases to miss the call to mark this as completed.  We can check it out but I seem to recall some of the old calls that did things like re-initialize etc without every doing the detach/attach would fail here.","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e89125ac3574b64a57b281712392367e7d46cb41","unresolved":false,"context_lines":[{"line_number":2948,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2949,"context_line":"                            context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":2950,"context_line":"                        bdm.attachment_id \u003d attachment_id"},{"line_number":2951,"context_line":"                        bdm.save()"},{"line_number":2952,"context_line":"        files \u003d self._decode_files(injected_files)"},{"line_number":2953,"context_line":""},{"line_number":2954,"context_line":"        kwargs \u003d dict("}],"source_content_type":"text/x-python","patch_set":133,"id":"7f287b81_a8318b0d","line":2951,"updated":"2017-09-07 16:07:40.000000000","message":"But we need to do the create before we do the delete, else there is a window where someone else might want to attach that volume.\n\nBut maybe the Cinder API doesn\u0027t allow that?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"83e6d30fe835d269053a9b17ec514f3ef3b8463c","unresolved":false,"context_lines":[{"line_number":2948,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2949,"context_line":"                            context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":2950,"context_line":"                        bdm.attachment_id \u003d attachment_id"},{"line_number":2951,"context_line":"                        bdm.save()"},{"line_number":2952,"context_line":"        files \u003d self._decode_files(injected_files)"},{"line_number":2953,"context_line":""},{"line_number":2954,"context_line":"        kwargs \u003d dict("}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_883cc6bf","line":2951,"in_reply_to":"5f2577a7_2480b18b","updated":"2017-09-13 17:28:08.000000000","message":"This shouldn\u0027t be tied to the multiattach flag IMHO. How concerned we are with the size of this window?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9a3d2b068966e1296eca7531ab73b6f8fee9159f","unresolved":false,"context_lines":[{"line_number":2948,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2949,"context_line":"                            context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":2950,"context_line":"                        bdm.attachment_id \u003d attachment_id"},{"line_number":2951,"context_line":"                        bdm.save()"},{"line_number":2952,"context_line":"        files \u003d self._decode_files(injected_files)"},{"line_number":2953,"context_line":""},{"line_number":2954,"context_line":"        kwargs \u003d dict("}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_2480b18b","line":2951,"in_reply_to":"7f287b81_a8318b0d","updated":"2017-09-10 16:39:18.000000000","message":"Currently, it\u0027s not going to let you do that (which would be multi-attach).  We\u0027ll be adding that shortly and can modify this at that time but for now we have this brief window.  Worst case scenario it fails because a user shot themselves in the foot, but I think they\u0027d have to \"try\" to beat the second call to get into this opening.","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e89125ac3574b64a57b281712392367e7d46cb41","unresolved":false,"context_lines":[{"line_number":3970,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3971,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3972,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":3973,"context_line":"                    bdm.save()"},{"line_number":3974,"context_line":""},{"line_number":3975,"context_line":"                else:"},{"line_number":3976,"context_line":"                    if connector is None:"}],"source_content_type":"text/x-python","patch_set":133,"id":"7f287b81_280ebb3a","line":3973,"updated":"2017-09-07 16:07:40.000000000","message":"As above really.\n\nThe bit I am finding it hard get my head around is which one of these actually does the final detach where we don\u0027t want to do another create again? Maybe we should add comments for each of these helpers describing the bit in the flow they are used?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"83e6d30fe835d269053a9b17ec514f3ef3b8463c","unresolved":false,"context_lines":[{"line_number":3970,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3971,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3972,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":3973,"context_line":"                    bdm.save()"},{"line_number":3974,"context_line":""},{"line_number":3975,"context_line":"                else:"},{"line_number":3976,"context_line":"                    if connector is None:"}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_abdbfcea","line":3973,"in_reply_to":"5f2577a7_3229c589","updated":"2017-09-13 17:28:08.000000000","message":"A for the first option that seems doable, I\u0027m not sure how much we would want to specialize the Cinder API.\n\nAs for the second point we would need to rewrite half of Nova to have that functionality working. We can look into this later when we have the attachment_id based flow in place to make it more efficient, but relying on something like this as a first step is not doable IMHO.","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"0fa42410ffd27bf7bf76acd18de96779287f9644","unresolved":false,"context_lines":[{"line_number":3970,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3971,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3972,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":3973,"context_line":"                    bdm.save()"},{"line_number":3974,"context_line":""},{"line_number":3975,"context_line":"                else:"},{"line_number":3976,"context_line":"                    if connector is None:"}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_3229c589","line":3973,"in_reply_to":"5f2577a7_844ac57d","updated":"2017-09-13 16:02:50.000000000","message":"Instead of doing a delete/create here, should we have a variant of attachment_update that tells cinder to put the volume back into the reserved state? That would eliminate the window here between create and delete. (and more radically, after talking with JohnG last night, should attachment_complete also be done via an attachment_update command?)","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9a3d2b068966e1296eca7531ab73b6f8fee9159f","unresolved":false,"context_lines":[{"line_number":3970,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3971,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3972,"context_line":"                    bdm.attachment_id \u003d attachment_id"},{"line_number":3973,"context_line":"                    bdm.save()"},{"line_number":3974,"context_line":""},{"line_number":3975,"context_line":"                else:"},{"line_number":3976,"context_line":"                    if connector is None:"}],"source_content_type":"text/x-python","patch_set":133,"id":"5f2577a7_844ac57d","line":3973,"in_reply_to":"7f287b81_280ebb3a","updated":"2017-09-10 16:39:18.000000000","message":"Well the thing is that terminate connection has never been a \"detach\" so to speak.  It requires the actual detach call after a terminate connection to finalize, and that\u0027s what\u0027s being emulated here.  It just uses a new attachment to do that reserve.\n\nWe had an update-attachment for this sort of thing when we started but we all (I thought) agreed that it was better to be more \"cloudy\" and ephemeral with things like attachments and throw them away and create new ones.  Sounds like maybe we need to discuss that again?","commit_id":"0bbc14e0afa640334611d1f3dbe76ac02f76b2ce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74daa5ac13597215a5cdc67f8fa54c9e6b816b06","unresolved":false,"context_lines":[{"line_number":2940,"context_line":"                    # means that it\u0027s the new Cinder attach/detach flow"},{"line_number":2941,"context_line":"                    # (available from v3.44). In that case we explicitely"},{"line_number":2942,"context_line":"                    # attach and detach the volumes through attachment level"},{"line_number":2943,"context_line":"                    # operations. In this scenario we create a new attachment"},{"line_number":2944,"context_line":"                    # here as by deleting the one above the volume became"},{"line_number":2945,"context_line":"                    # \u0027available\u0027 therefore we need to reserve it again until"},{"line_number":2946,"context_line":"                    # it gets attached later in this flow."},{"line_number":2947,"context_line":"                    if bdm.attachment_id:"},{"line_number":2948,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2949,"context_line":"                            context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_809811c0","line":2946,"range":{"start_line":2943,"start_character":34,"end_line":2946,"end_character":58},"updated":"2017-09-14 15:20:17.000000000","message":"Is there a race condition here even if it is a just a small one? I mean at L2937 made the volume available in cinder and L2948 would like to use it but somebody could grab the volume in between. Can we do the same here as was discussed on the cinder-nova cross session on the PTG regarding shelve offload[1].\n\n[1]https://etherpad.openstack.org/p/cinder-ptg-queens","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"180bb55480bfb2b7ce77854264daf76aa2cc05c8","unresolved":false,"context_lines":[{"line_number":2940,"context_line":"                    # means that it\u0027s the new Cinder attach/detach flow"},{"line_number":2941,"context_line":"                    # (available from v3.44). In that case we explicitely"},{"line_number":2942,"context_line":"                    # attach and detach the volumes through attachment level"},{"line_number":2943,"context_line":"                    # operations. In this scenario we create a new attachment"},{"line_number":2944,"context_line":"                    # here as by deleting the one above the volume became"},{"line_number":2945,"context_line":"                    # \u0027available\u0027 therefore we need to reserve it again until"},{"line_number":2946,"context_line":"                    # it gets attached later in this flow."},{"line_number":2947,"context_line":"                    if bdm.attachment_id:"},{"line_number":2948,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("},{"line_number":2949,"context_line":"                            context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_6b45ef42","line":2946,"range":{"start_line":2943,"start_character":34,"end_line":2946,"end_character":58},"in_reply_to":"5f2577a7_809811c0","updated":"2017-09-14 22:44:26.000000000","message":"Done","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74daa5ac13597215a5cdc67f8fa54c9e6b816b06","unresolved":false,"context_lines":[{"line_number":3966,"context_line":"                    # just delete the attachment and get a new one)"},{"line_number":3967,"context_line":"                    # attachments in the new attach code so we have to do"},{"line_number":3968,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":3969,"context_line":"                    # in other words, beware"},{"line_number":3970,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3971,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3972,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_31df68d7","line":3969,"updated":"2017-09-14 15:20:17.000000000","message":"Is it also racy, see my above comment.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"180bb55480bfb2b7ce77854264daf76aa2cc05c8","unresolved":false,"context_lines":[{"line_number":3966,"context_line":"                    # just delete the attachment and get a new one)"},{"line_number":3967,"context_line":"                    # attachments in the new attach code so we have to do"},{"line_number":3968,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":3969,"context_line":"                    # in other words, beware"},{"line_number":3970,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3971,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":3972,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_ab3f57b2","line":3969,"in_reply_to":"5f2577a7_31df68d7","updated":"2017-09-14 22:44:26.000000000","message":"Done","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"04f2bffb15ed1c9122b53b6794085e9e6d445d91","unresolved":false,"context_lines":[{"line_number":4397,"context_line":"        self.network_api.cleanup_instance_network_on_host(context, instance,"},{"line_number":4398,"context_line":"                                                          instance.host)"},{"line_number":4399,"context_line":"        network_info \u003d self.network_api.get_instance_nw_info(context, instance)"},{"line_number":4400,"context_line":"        block_device_info \u003d self._get_instance_block_device_info(context,"},{"line_number":4401,"context_line":"                                                                 instance)"},{"line_number":4402,"context_line":"        self.driver.destroy(context, instance, network_info,"},{"line_number":4403,"context_line":"                block_device_info)"},{"line_number":4404,"context_line":""}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_11646c49","line":4401,"range":{"start_line":4400,"start_character":8,"end_line":4401,"end_character":74},"updated":"2017-09-14 15:15:22.000000000","message":"Regarding bug 1547142, why aren\u0027t we deleting the attachment for any volumes attached to this instance on this host? Note we\u0027d also need to create a new \"empty\" attachment before we delete the old attachment for this host. We need the new \u0027empty\u0027 attachment to keep the volume in-use when the old attachment (for this host) is deleted.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"180bb55480bfb2b7ce77854264daf76aa2cc05c8","unresolved":false,"context_lines":[{"line_number":4397,"context_line":"        self.network_api.cleanup_instance_network_on_host(context, instance,"},{"line_number":4398,"context_line":"                                                          instance.host)"},{"line_number":4399,"context_line":"        network_info \u003d self.network_api.get_instance_nw_info(context, instance)"},{"line_number":4400,"context_line":"        block_device_info \u003d self._get_instance_block_device_info(context,"},{"line_number":4401,"context_line":"                                                                 instance)"},{"line_number":4402,"context_line":"        self.driver.destroy(context, instance, network_info,"},{"line_number":4403,"context_line":"                block_device_info)"},{"line_number":4404,"context_line":""}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_4b78f38e","line":4401,"range":{"start_line":4400,"start_character":8,"end_line":4401,"end_character":74},"in_reply_to":"5f2577a7_11646c49","updated":"2017-09-14 22:44:26.000000000","message":"Done","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8a4a1045c3b7e7c025a48454f189b715a8f03c1e","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"                mapping, context, instance, self.volume_api, self.driver,"},{"line_number":1570,"context_line":"                wait_func\u003dself._await_block_device_map_created)"},{"line_number":1571,"context_line":""},{"line_number":1572,"context_line":"            # NOTE (ildikov): In attach_block_devices"},{"line_number":1573,"context_line":"            # attachment_complete is only called in case the"},{"line_number":1574,"context_line":"            # do_driver_attach flag is True (it is False by default),"},{"line_number":1575,"context_line":"            # therefore we need to call attachment_complete here."},{"line_number":1576,"context_line":"            for bdm in bdms:"},{"line_number":1577,"context_line":"                if bdm.attachment_id:"},{"line_number":1578,"context_line":"                    self.volume_api.attachment_complete(context,"},{"line_number":1579,"context_line":"                                                        bdm.attachment_id)"},{"line_number":1580,"context_line":""},{"line_number":1581,"context_line":"            self._block_device_info_to_legacy(block_device_info)"},{"line_number":1582,"context_line":"            return block_device_info"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_a18ed32b","line":1579,"range":{"start_line":1572,"start_character":12,"end_line":1579,"end_character":74},"updated":"2017-10-10 19:11:27.000000000","message":"Huh? This is nasty tight coupling for something it sounds like we\u0027re going to do regardless of the do_driver_attach flag, it\u0027s just you\u0027re either doing it in DriverVolumeBlockDevice.attach or you\u0027re doing it here - why not just always do it in DriverVolumeBlockDevice.attach like we used to?","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"                mapping, context, instance, self.volume_api, self.driver,"},{"line_number":1570,"context_line":"                wait_func\u003dself._await_block_device_map_created)"},{"line_number":1571,"context_line":""},{"line_number":1572,"context_line":"            # NOTE (ildikov): In attach_block_devices"},{"line_number":1573,"context_line":"            # attachment_complete is only called in case the"},{"line_number":1574,"context_line":"            # do_driver_attach flag is True (it is False by default),"},{"line_number":1575,"context_line":"            # therefore we need to call attachment_complete here."},{"line_number":1576,"context_line":"            for bdm in bdms:"},{"line_number":1577,"context_line":"                if bdm.attachment_id:"},{"line_number":1578,"context_line":"                    self.volume_api.attachment_complete(context,"},{"line_number":1579,"context_line":"                                                        bdm.attachment_id)"},{"line_number":1580,"context_line":""},{"line_number":1581,"context_line":"            self._block_device_info_to_legacy(block_device_info)"},{"line_number":1582,"context_line":"            return block_device_info"}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_41092e2a","line":1579,"range":{"start_line":1572,"start_character":12,"end_line":1579,"end_character":74},"in_reply_to":"5f4e5783_a18ed32b","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"fe772cac74b781813940f181b110f6407c17dc21","unresolved":false,"context_lines":[{"line_number":1572,"context_line":"            # NOTE (ildikov): In attach_block_devices"},{"line_number":1573,"context_line":"            # attachment_complete is only called in case the"},{"line_number":1574,"context_line":"            # do_driver_attach flag is True (it is False by default),"},{"line_number":1575,"context_line":"            # therefore we need to call attachment_complete here."},{"line_number":1576,"context_line":"            for bdm in bdms:"},{"line_number":1577,"context_line":"                if bdm.attachment_id:"},{"line_number":1578,"context_line":"                    self.volume_api.attachment_complete(context,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_9e618c08","line":1575,"updated":"2017-10-13 17:57:36.000000000","message":"Ah, I see what the comments on the previous versions were about, we should push this back into attach_block_devices somehow.","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"060607c6846ff1f280f84421237459de50f322ff","unresolved":false,"context_lines":[{"line_number":1572,"context_line":"            # NOTE (ildikov): In attach_block_devices"},{"line_number":1573,"context_line":"            # attachment_complete is only called in case the"},{"line_number":1574,"context_line":"            # do_driver_attach flag is True (it is False by default),"},{"line_number":1575,"context_line":"            # therefore we need to call attachment_complete here."},{"line_number":1576,"context_line":"            for bdm in bdms:"},{"line_number":1577,"context_line":"                if bdm.attachment_id:"},{"line_number":1578,"context_line":"                    self.volume_api.attachment_complete(context,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_a140a9a6","line":1575,"in_reply_to":"5f4e5783_9e618c08","updated":"2017-10-13 18:03:49.000000000","message":"Yup.","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":1572,"context_line":"            # NOTE (ildikov): In attach_block_devices"},{"line_number":1573,"context_line":"            # attachment_complete is only called in case the"},{"line_number":1574,"context_line":"            # do_driver_attach flag is True (it is False by default),"},{"line_number":1575,"context_line":"            # therefore we need to call attachment_complete here."},{"line_number":1576,"context_line":"            for bdm in bdms:"},{"line_number":1577,"context_line":"                if bdm.attachment_id:"},{"line_number":1578,"context_line":"                    self.volume_api.attachment_complete(context,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_7448e82b","line":1575,"in_reply_to":"5f4e5783_a140a9a6","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"fe772cac74b781813940f181b110f6407c17dc21","unresolved":false,"context_lines":[{"line_number":4097,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":4098,"context_line":"                    # in other words, beware"},{"line_number":4099,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":4100,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":4101,"context_line":"                    self.volume_api.attachment_delete(context,"},{"line_number":4102,"context_line":"                                                      bdm.attachment_id)"},{"line_number":4103,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_81adadea","line":4100,"updated":"2017-10-13 17:57:36.000000000","message":"In the case of revert_resize where this is called, this is probably wrong, as we want to just do the attachment_delete, I think:\nhttps://github.com/openstack/nova/blob/d9212edb8fe8376c218cc40e0bee1540083b25e6/nova/compute/manager.py#L3735\n\nAm I missing something big there?","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":4097,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":4098,"context_line":"                    # in other words, beware"},{"line_number":4099,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":4100,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":4101,"context_line":"                    self.volume_api.attachment_delete(context,"},{"line_number":4102,"context_line":"                                                      bdm.attachment_id)"},{"line_number":4103,"context_line":"                    bdm.attachment_id \u003d attachment_id"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_148d3431","line":4100,"in_reply_to":"5f4e5783_81adadea","updated":"2017-10-20 16:55:20.000000000","message":"It says that it destroys the instance on the new machine and powers it on on the old one, so in that sense I don\u0027t really see the problem here. Could you please elaborate?","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":3008,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3009,"context_line":"                            context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":3010,"context_line":"                    self._detach_volume(context, bdm, instance,"},{"line_number":3011,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":3012,"context_line":"                    if attachment_id:"},{"line_number":3013,"context_line":"                        bdm.attachment_id \u003d attachment_id"},{"line_number":3014,"context_line":"                        bdm.save()"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_ee6921be","line":3011,"updated":"2017-11-22 15:30:04.000000000","message":"If this fails, do we need to delete the new attachment?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":3008,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("},{"line_number":3009,"context_line":"                            context, bdm[\u0027volume_id\u0027], instance.uuid)[\u0027id\u0027]"},{"line_number":3010,"context_line":"                    self._detach_volume(context, bdm, instance,"},{"line_number":3011,"context_line":"                                        destroy_bdm\u003dFalse)"},{"line_number":3012,"context_line":"                    if attachment_id:"},{"line_number":3013,"context_line":"                        bdm.attachment_id \u003d attachment_id"},{"line_number":3014,"context_line":"                        bdm.save()"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_193cc6bd","line":3011,"in_reply_to":"ff82abbf_ee6921be","updated":"2017-11-23 02:34:54.000000000","message":"I need to look more into the error scenarios. I would think we need to.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4501062f17307062b754697c1091ec67890fb32e","unresolved":false,"context_lines":[{"line_number":3028,"context_line":"                    # means that it\u0027s the new Cinder attach/detach flow"},{"line_number":3029,"context_line":"                    # (available from v3.44). In that case we explicitely"},{"line_number":3030,"context_line":"                    # attach and detach the volumes through attachment level"},{"line_number":3031,"context_line":"                    # operations. In this scenario we create a new attachment"},{"line_number":3032,"context_line":"                    # here as by deleting the one above the volume became"},{"line_number":3033,"context_line":"                    # \u0027available\u0027 therefore we need to reserve it again until"},{"line_number":3034,"context_line":"                    # it gets attached later in this flow."},{"line_number":3035,"context_line":"                    attachment_id \u003d None"},{"line_number":3036,"context_line":"                    if bdm.attachment_id:"},{"line_number":3037,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_e5c7d711","line":3034,"range":{"start_line":3031,"start_character":34,"end_line":3034,"end_character":58},"updated":"2017-12-06 21:03:37.000000000","message":"This is hard to understand.\n\nI think what you\u0027re saying is _detach_volume will delete the existing attachment which makes the volume status change to \u0027in-use\u0027 if we don\u0027t pre-create another attachment before deleting the old one, right?\n\nWe can re-word if we need to make any changes.","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"ee42e0d837c84be7de904fd610a34713e084503c","unresolved":false,"context_lines":[{"line_number":3028,"context_line":"                    # means that it\u0027s the new Cinder attach/detach flow"},{"line_number":3029,"context_line":"                    # (available from v3.44). In that case we explicitely"},{"line_number":3030,"context_line":"                    # attach and detach the volumes through attachment level"},{"line_number":3031,"context_line":"                    # operations. In this scenario we create a new attachment"},{"line_number":3032,"context_line":"                    # here as by deleting the one above the volume became"},{"line_number":3033,"context_line":"                    # \u0027available\u0027 therefore we need to reserve it again until"},{"line_number":3034,"context_line":"                    # it gets attached later in this flow."},{"line_number":3035,"context_line":"                    attachment_id \u003d None"},{"line_number":3036,"context_line":"                    if bdm.attachment_id:"},{"line_number":3037,"context_line":"                        attachment_id \u003d self.volume_api.attachment_create("}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_40a8f175","line":3034,"range":{"start_line":3031,"start_character":34,"end_line":3034,"end_character":58},"in_reply_to":"df87a7cf_e5c7d711","updated":"2017-12-06 21:23:21.000000000","message":"So when we delete the existing attachment the volume state will be \u0027available\u0027 which we don\u0027t want as it opens up a window while the volume could be attached to another instance in theory. So to avoid the possibility of any race conditions we create a new attachment before calling attachment_delete so the volume state will be \u0027reserved\u0027.\n\nIs what I wanted to say above. :)","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4501062f17307062b754697c1091ec67890fb32e","unresolved":false,"context_lines":[{"line_number":3064,"context_line":"        except NotImplementedError:"},{"line_number":3065,"context_line":"            # NOTE(rpodolyaka): driver doesn\u0027t provide specialized version"},{"line_number":3066,"context_line":"            # of rebuild, fall back to the default implementation"},{"line_number":3067,"context_line":"            self._rebuild_default_impl(**kwargs)"},{"line_number":3068,"context_line":"        self._update_instance_after_spawn(context, instance)"},{"line_number":3069,"context_line":"        instance.save(expected_task_state\u003d[task_states.REBUILD_SPAWNING])"},{"line_number":3070,"context_line":""}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_05f43b5a","line":3067,"range":{"start_line":3067,"start_character":17,"end_line":3067,"end_character":38},"updated":"2017-12-06 21:03:37.000000000","message":"OK so this will call detach_block_devices and we\u0027ll keep the volume reserved because we have an empty attachment created. Then it will call attach_block_devices (_prep_block_device) which will attach the bdm to the instance using the attachment we create in detach_block_devices.","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"ee42e0d837c84be7de904fd610a34713e084503c","unresolved":false,"context_lines":[{"line_number":3064,"context_line":"        except NotImplementedError:"},{"line_number":3065,"context_line":"            # NOTE(rpodolyaka): driver doesn\u0027t provide specialized version"},{"line_number":3066,"context_line":"            # of rebuild, fall back to the default implementation"},{"line_number":3067,"context_line":"            self._rebuild_default_impl(**kwargs)"},{"line_number":3068,"context_line":"        self._update_instance_after_spawn(context, instance)"},{"line_number":3069,"context_line":"        instance.save(expected_task_state\u003d[task_states.REBUILD_SPAWNING])"},{"line_number":3070,"context_line":""}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_c0b5e1ce","line":3067,"range":{"start_line":3067,"start_character":17,"end_line":3067,"end_character":38},"in_reply_to":"df87a7cf_05f43b5a","updated":"2017-12-06 21:23:21.000000000","message":"Yep, that sounds correct.","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4501062f17307062b754697c1091ec67890fb32e","unresolved":false,"context_lines":[{"line_number":4231,"context_line":"        for bdm in bdms:"},{"line_number":4232,"context_line":"            if bdm.is_volume:"},{"line_number":4233,"context_line":"                if bdm.attachment_id:"},{"line_number":4234,"context_line":"                    # NOTE(jdg): So here\u0027s the thing, the idea behind the new"},{"line_number":4235,"context_line":"                    # attach API\u0027s was to have a new code fork/path that we"},{"line_number":4236,"context_line":"                    # followed, we\u0027re not going to do that so we have to do"},{"line_number":4237,"context_line":"                    # some extra work in here to make it *behave* just like the"},{"line_number":4238,"context_line":"                    # old code. Cinder doesn\u0027t allow disconnect/reconnect (you"},{"line_number":4239,"context_line":"                    # just delete the attachment and get a new one)"},{"line_number":4240,"context_line":"                    # attachments in the new attach code so we have to do"},{"line_number":4241,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":4242,"context_line":"                    # in other words, beware"},{"line_number":4243,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":4244,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":4245,"context_line":"                    self.volume_api.attachment_delete(context,"}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_a5b8ef75","line":4242,"range":{"start_line":4234,"start_character":20,"end_line":4242,"end_character":44},"updated":"2017-12-06 21:03:37.000000000","message":"This is essentially the same thing we are doing in the evacuate/rebuild flow - we need to keep the volume reserved by the instance and we do that with a new empty attachment.","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"ee42e0d837c84be7de904fd610a34713e084503c","unresolved":false,"context_lines":[{"line_number":4231,"context_line":"        for bdm in bdms:"},{"line_number":4232,"context_line":"            if bdm.is_volume:"},{"line_number":4233,"context_line":"                if bdm.attachment_id:"},{"line_number":4234,"context_line":"                    # NOTE(jdg): So here\u0027s the thing, the idea behind the new"},{"line_number":4235,"context_line":"                    # attach API\u0027s was to have a new code fork/path that we"},{"line_number":4236,"context_line":"                    # followed, we\u0027re not going to do that so we have to do"},{"line_number":4237,"context_line":"                    # some extra work in here to make it *behave* just like the"},{"line_number":4238,"context_line":"                    # old code. Cinder doesn\u0027t allow disconnect/reconnect (you"},{"line_number":4239,"context_line":"                    # just delete the attachment and get a new one)"},{"line_number":4240,"context_line":"                    # attachments in the new attach code so we have to do"},{"line_number":4241,"context_line":"                    # a delete and create without a connector (reserve),"},{"line_number":4242,"context_line":"                    # in other words, beware"},{"line_number":4243,"context_line":"                    attachment_id \u003d self.volume_api.attachment_create("},{"line_number":4244,"context_line":"                        context, bdm.volume_id, instance.uuid)[\u0027id\u0027]"},{"line_number":4245,"context_line":"                    self.volume_api.attachment_delete(context,"}],"source_content_type":"text/x-python","patch_set":173,"id":"df87a7cf_60d175fb","line":4242,"range":{"start_line":4234,"start_character":20,"end_line":4242,"end_character":44},"in_reply_to":"df87a7cf_a5b8ef75","updated":"2017-12-06 21:23:21.000000000","message":"Yep, exactly.","commit_id":"e7130d6e9af73f0823baa9aab2e3ca9d92ceaffe"}],"nova/tests/fixtures.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"63abce4faf6337957ae3b17e6098181507f38469","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1234,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.unreserve_volume\u0027,"},{"line_number":1235,"context_line":"                           fake_unreserve_volume)"},{"line_number":1236,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.attach_version\u0027,"},{"line_number":1237,"context_line":"            fake_attach_version)"},{"line_number":1238,"context_line":""},{"line_number":1239,"context_line":""},{"line_number":1240,"context_line":"class PlacementFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba2be162_f91d7c73","line":1237,"range":{"start_line":1236,"start_character":0,"end_line":1237,"end_character":32},"updated":"2017-03-06 08:54:03.000000000","message":"It can be as follows:\n\n        self.test.stub_out(\u0027nova.volume.cinder.API.attach_version\u0027,\n            lambda *args, **kwargs: 0)","commit_id":"d5b9bd8c34bd785652db7d2425c0aaf63483fd3c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    SWAP_ERR_OLD_VOL \u003d \u0027828419fa-3efb-4533-b458-4267ca5fe9b1\u0027"},{"line_number":1226,"context_line":"    SWAP_ERR_NEW_VOL \u003d \u00279c6d9c2d-7a8f-4c80-938d-3bf062b8d489\u0027"},{"line_number":1227,"context_line":"    SWAP_ERR_ATTACH_ID \u003d \u00274a3cd440-b9c2-11e1-afa6-0800200c9a66\u0027"},{"line_number":1228,"context_line":"    connection_info \u003d {\u0027driver_volume_type\u0027: \u0027fake_type\u0027,"},{"line_number":1229,"context_line":"                       \u0027data\u0027: {\u0027foo\u0027: \u0027bar\u0027,"},{"line_number":1230,"context_line":"                                \u0027target_lun\u0027: \u00271\u0027}}"},{"line_number":1231,"context_line":""},{"line_number":1232,"context_line":"    def __init__(self, test):"},{"line_number":1233,"context_line":"        super(CinderFixture, self).__init__()"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_637c6ceb","line":1230,"range":{"start_line":1228,"start_character":4,"end_line":1230,"end_character":51},"updated":"2017-07-07 15:13:04.000000000","message":"This is not used.","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    SWAP_ERR_OLD_VOL \u003d \u0027828419fa-3efb-4533-b458-4267ca5fe9b1\u0027"},{"line_number":1226,"context_line":"    SWAP_ERR_NEW_VOL \u003d \u00279c6d9c2d-7a8f-4c80-938d-3bf062b8d489\u0027"},{"line_number":1227,"context_line":"    SWAP_ERR_ATTACH_ID \u003d \u00274a3cd440-b9c2-11e1-afa6-0800200c9a66\u0027"},{"line_number":1228,"context_line":"    connection_info \u003d {\u0027driver_volume_type\u0027: \u0027fake_type\u0027,"},{"line_number":1229,"context_line":"                       \u0027data\u0027: {\u0027foo\u0027: \u0027bar\u0027,"},{"line_number":1230,"context_line":"                                \u0027target_lun\u0027: \u00271\u0027}}"},{"line_number":1231,"context_line":""},{"line_number":1232,"context_line":"    def __init__(self, test):"},{"line_number":1233,"context_line":"        super(CinderFixture, self).__init__()"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_be1616f1","line":1230,"range":{"start_line":1228,"start_character":4,"end_line":1230,"end_character":51},"in_reply_to":"3f1d235d_637c6ceb","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"        # revisited too."},{"line_number":1350,"context_line":"        def fake_attachment_create(_self, context, volume_id, instance_uuid,"},{"line_number":1351,"context_line":"                                   connector\u003dNone):"},{"line_number":1352,"context_line":"            attachment_id \u003d \u0027fake_id\u0027"},{"line_number":1353,"context_line":"            if self.attachment_error_id is not None:"},{"line_number":1354,"context_line":"                attachment_id \u003d self.attachment_error_id"},{"line_number":1355,"context_line":"            attachment \u003d {\u0027id\u0027: attachment_id, \u0027data\u0027: {}}"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_6317cca5","line":1352,"range":{"start_line":1352,"start_character":28,"end_line":1352,"end_character":37},"updated":"2017-07-07 15:13:04.000000000","message":"If this method is called more than once, each attachment_id is going to have the same value. Wouldn\u0027t it be better to create a unique attachment_id per volume/instance combination?","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"        # revisited too."},{"line_number":1350,"context_line":"        def fake_attachment_create(_self, context, volume_id, instance_uuid,"},{"line_number":1351,"context_line":"                                   connector\u003dNone):"},{"line_number":1352,"context_line":"            attachment_id \u003d \u0027fake_id\u0027"},{"line_number":1353,"context_line":"            if self.attachment_error_id is not None:"},{"line_number":1354,"context_line":"                attachment_id \u003d self.attachment_error_id"},{"line_number":1355,"context_line":"            attachment \u003d {\u0027id\u0027: attachment_id, \u0027data\u0027: {}}"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_1e7cea1e","line":1352,"range":{"start_line":1352,"start_character":28,"end_line":1352,"end_character":37},"in_reply_to":"3f1d235d_6317cca5","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"35d1c24234c8c197257517806d613a4ba1ed2cc6","unresolved":false,"context_lines":[{"line_number":1371,"context_line":"                               \u0027data\u0027: {\u0027foo\u0027: \u0027bar\u0027,"},{"line_number":1372,"context_line":"                                        \u0027target_lun\u0027: \u00271\u0027}}"},{"line_number":1373,"context_line":"            if attachment_id \u003d\u003d CinderFixture.SWAP_ERR_ATTACH_ID:"},{"line_number":1374,"context_line":"                connection_info \u003d ()"},{"line_number":1375,"context_line":"            return connection_info"},{"line_number":1376,"context_line":""},{"line_number":1377,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_632eacfb","line":1374,"range":{"start_line":1374,"start_character":34,"end_line":1374,"end_character":36},"updated":"2017-07-07 15:13:04.000000000","message":"Shouldn\u0027t this always be a dict {} ?","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9d6e8ddf420e8f1bc5b0c991ae378d28082b64c8","unresolved":false,"context_lines":[{"line_number":1371,"context_line":"                               \u0027data\u0027: {\u0027foo\u0027: \u0027bar\u0027,"},{"line_number":1372,"context_line":"                                        \u0027target_lun\u0027: \u00271\u0027}}"},{"line_number":1373,"context_line":"            if attachment_id \u003d\u003d CinderFixture.SWAP_ERR_ATTACH_ID:"},{"line_number":1374,"context_line":"                connection_info \u003d ()"},{"line_number":1375,"context_line":"            return connection_info"},{"line_number":1376,"context_line":""},{"line_number":1377,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"}],"source_content_type":"text/x-python","patch_set":88,"id":"3f1d235d_9e8d9a2c","line":1374,"range":{"start_line":1374,"start_character":34,"end_line":1374,"end_character":36},"in_reply_to":"3f1d235d_632eacfb","updated":"2017-07-07 16:55:40.000000000","message":"Done","commit_id":"552ee3564fe9b89ec7d337426172889d1d18d29f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"eafd2565906667c961a64ed4003ece0d400f7f82","unresolved":false,"context_lines":[{"line_number":1369,"context_line":"                               \u0027data\u0027: {\u0027foo\u0027: \u0027bar\u0027,"},{"line_number":1370,"context_line":"                                        \u0027target_lun\u0027: \u00271\u0027}}"},{"line_number":1371,"context_line":"            if attachment_id \u003d\u003d CinderFixture.SWAP_ERR_ATTACH_ID:"},{"line_number":1372,"context_line":"                connection_info \u003d {}"},{"line_number":1373,"context_line":"            return connection_info"},{"line_number":1374,"context_line":""},{"line_number":1375,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"}],"source_content_type":"text/x-python","patch_set":90,"id":"3f1d235d_1b1d0d0f","line":1372,"range":{"start_line":1372,"start_character":34,"end_line":1372,"end_character":36},"updated":"2017-07-08 10:03:33.000000000","message":"We need \u0027()\u0027 here to raise an exception, like in case of fake_initialize_connection in line #1305.","commit_id":"a04ca7881a24cb0762f93b73fe079b8cb19588b8"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"029ef02e289b38a3917a93d7c2b9b02204edc2fe","unresolved":false,"context_lines":[{"line_number":1369,"context_line":"                               \u0027data\u0027: {\u0027foo\u0027: \u0027bar\u0027,"},{"line_number":1370,"context_line":"                                        \u0027target_lun\u0027: \u00271\u0027}}"},{"line_number":1371,"context_line":"            if attachment_id \u003d\u003d CinderFixture.SWAP_ERR_ATTACH_ID:"},{"line_number":1372,"context_line":"                connection_info \u003d {}"},{"line_number":1373,"context_line":"            return connection_info"},{"line_number":1374,"context_line":""},{"line_number":1375,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"}],"source_content_type":"text/x-python","patch_set":90,"id":"3f1d235d_303463de","line":1372,"range":{"start_line":1372,"start_character":34,"end_line":1372,"end_character":36},"in_reply_to":"3f1d235d_1b1d0d0f","updated":"2017-07-08 16:16:51.000000000","message":"Ha!!!  THANK YOU!!!! I was having a heck of a time figuring out why I couldn\u0027t get that functional test working, it\u0027s becuase I removed the bogus return to generate the error here!!","commit_id":"a04ca7881a24cb0762f93b73fe079b8cb19588b8"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"293287c944ad19eedf1b3153c586208cce834078","unresolved":false,"context_lines":[{"line_number":1369,"context_line":"                               \u0027data\u0027: {\u0027foo\u0027: \u0027bar\u0027,"},{"line_number":1370,"context_line":"                                        \u0027target_lun\u0027: \u00271\u0027}}"},{"line_number":1371,"context_line":"            if attachment_id \u003d\u003d CinderFixture.SWAP_ERR_ATTACH_ID:"},{"line_number":1372,"context_line":"                connection_info \u003d {}"},{"line_number":1373,"context_line":"            return connection_info"},{"line_number":1374,"context_line":""},{"line_number":1375,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.detach\u0027, fake_detach)"}],"source_content_type":"text/x-python","patch_set":90,"id":"3f1d235d_30c46340","line":1372,"range":{"start_line":1372,"start_character":34,"end_line":1372,"end_character":36},"in_reply_to":"3f1d235d_303463de","updated":"2017-07-08 17:32:22.000000000","message":":)\n\nSorry I didn\u0027t comment on it earlier, I recognized it just now you fixed this comment from Matt too and switched back to dict as output.","commit_id":"a04ca7881a24cb0762f93b73fe079b8cb19588b8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    SWAP_NEW_VOL \u003d \u0027227cc671-f30b-4488-96fd-7d0bf13648d8\u0027"},{"line_number":1226,"context_line":"    SWAP_ERR_OLD_VOL \u003d \u0027828419fa-3efb-4533-b458-4267ca5fe9b1\u0027"},{"line_number":1227,"context_line":"    SWAP_ERR_NEW_VOL \u003d \u00279c6d9c2d-7a8f-4c80-938d-3bf062b8d489\u0027"},{"line_number":1228,"context_line":"    SWAP_ERR_ATTACH_ID \u003d \u00274a3cd440-b9c2-11e1-afa6-0800200c9a66\u0027"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def __init__(self, test):"},{"line_number":1231,"context_line":"        super(CinderFixture, self).__init__()"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_63c1e980","line":1228,"range":{"start_line":1228,"start_character":4,"end_line":1228,"end_character":22},"updated":"2017-07-21 02:24:43.000000000","message":"Is this for actually testing swap volume errors or something else? Because I was pretty sure I had the swap volume tests covered already in the patch that added the new support for it. So is this some other ID for other tests? If so, and it\u0027s not related to swap volume, we should drop the SWAP_ prefix.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    SWAP_NEW_VOL \u003d \u0027227cc671-f30b-4488-96fd-7d0bf13648d8\u0027"},{"line_number":1226,"context_line":"    SWAP_ERR_OLD_VOL \u003d \u0027828419fa-3efb-4533-b458-4267ca5fe9b1\u0027"},{"line_number":1227,"context_line":"    SWAP_ERR_NEW_VOL \u003d \u00279c6d9c2d-7a8f-4c80-938d-3bf062b8d489\u0027"},{"line_number":1228,"context_line":"    SWAP_ERR_ATTACH_ID \u003d \u00274a3cd440-b9c2-11e1-afa6-0800200c9a66\u0027"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    def __init__(self, test):"},{"line_number":1231,"context_line":"        super(CinderFixture, self).__init__()"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_2f7d0b6e","line":1228,"range":{"start_line":1228,"start_character":4,"end_line":1228,"end_character":22},"in_reply_to":"1f1a1f67_63c1e980","updated":"2017-07-21 08:14:39.000000000","message":"This is the functional test for swap with the notifications, which needed the piece that actually enables the new style attachments to have the swap flow work the new way. Hence the change here and not in the earlier patch.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"a3544984df430cdffa892f0173eb0fb55653dddd","unresolved":false,"context_lines":[{"line_number":1438,"context_line":"                           fake_unreserve_volume)"},{"line_number":1439,"context_line":""},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"class CinderFixtureNewAttachFlow(fixtures.Fixture):"},{"line_number":1442,"context_line":"    \"\"\"A fixture to volume operations with the new Cinder attach/detach API\"\"\""},{"line_number":1443,"context_line":""},{"line_number":1444,"context_line":"    # the default project_id in OSAPIFixtures"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_577912fa","line":1441,"updated":"2017-10-11 06:51:50.000000000","message":"It seems that there are a lot of duplicate codes with CinderFixture.\nThe duplicate codes should be reduced.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":1438,"context_line":"                           fake_unreserve_volume)"},{"line_number":1439,"context_line":""},{"line_number":1440,"context_line":""},{"line_number":1441,"context_line":"class CinderFixtureNewAttachFlow(fixtures.Fixture):"},{"line_number":1442,"context_line":"    \"\"\"A fixture to volume operations with the new Cinder attach/detach API\"\"\""},{"line_number":1443,"context_line":""},{"line_number":1444,"context_line":"    # the default project_id in OSAPIFixtures"}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_de085b2e","line":1441,"in_reply_to":"5f4e5783_577912fa","updated":"2017-10-20 16:55:20.000000000","message":"Yes, the aim was to first see whether this is the good way forward. In case everyone is fine with it I can do a refactor here or in a follow up patch.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aba44883426770f7c053d4688d40e3b67449b6ce","unresolved":false,"context_lines":[{"line_number":1384,"context_line":"                 for attachments in self.attachments.values()])"},{"line_number":1385,"context_line":"            volume[\u0027status\u0027] \u003d \u0027attached\u0027 if has_attachment else \u0027detached\u0027"},{"line_number":1386,"context_line":""},{"line_number":1387,"context_line":"            # Check for our special image-backed volume."},{"line_number":1388,"context_line":"            if volume_id \u003d\u003d self.IMAGE_BACKED_VOL:"},{"line_number":1389,"context_line":"                # Make it a bootable volume."},{"line_number":1390,"context_line":"                volume[\u0027bootable\u0027] \u003d True"},{"line_number":1391,"context_line":"                # Add the image_id metadata."},{"line_number":1392,"context_line":"                volume[\u0027volume_image_metadata\u0027] \u003d {"},{"line_number":1393,"context_line":"                    # There would normally be more image metadata in here..."},{"line_number":1394,"context_line":"                    \u0027image_id\u0027: \u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027"},{"line_number":1395,"context_line":"                }"},{"line_number":1396,"context_line":""},{"line_number":1397,"context_line":"            return volume"},{"line_number":1398,"context_line":""}],"source_content_type":"text/x-python","patch_set":169,"id":"df87a7cf_b365bd47","line":1395,"range":{"start_line":1387,"start_character":12,"end_line":1395,"end_character":17},"updated":"2017-12-05 19:34:08.000000000","message":"This needs to be copied into the new fixture:\n\nhttp://logs.openstack.org/85/330285/169/check/openstack-tox-functional/43d518b/testr_results.html.gz","commit_id":"71ed107f366a0025dc3a9bc2a401c2b1f65442ba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a6198c8acb4ef19f263559e4e4f8a432d7734b4","unresolved":false,"context_lines":[{"line_number":1627,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.roll_detaching\u0027,"},{"line_number":1628,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1629,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.is_microversion_supported\u0027,"},{"line_number":1630,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1631,"context_line":""},{"line_number":1632,"context_line":""},{"line_number":1633,"context_line":"class PlacementApiClient(object):"}],"source_content_type":"text/x-python","patch_set":172,"id":"df87a7cf_25adbf87","line":1630,"range":{"start_line":1630,"start_character":51,"end_line":1630,"end_character":55},"updated":"2017-12-06 20:39:17.000000000","message":"Shouldn\u0027t this be True?","commit_id":"1c97e71f2b688d0649676abf5c60dc28cc5e4d8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7841dfd07c88e3353a3ff5f082023b24106e9b66","unresolved":false,"context_lines":[{"line_number":1627,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.roll_detaching\u0027,"},{"line_number":1628,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1629,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.is_microversion_supported\u0027,"},{"line_number":1630,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1631,"context_line":""},{"line_number":1632,"context_line":""},{"line_number":1633,"context_line":"class PlacementApiClient(object):"}],"source_content_type":"text/x-python","patch_set":172,"id":"df87a7cf_65cc276a","line":1630,"range":{"start_line":1630,"start_character":51,"end_line":1630,"end_character":55},"in_reply_to":"df87a7cf_25adbf87","updated":"2017-12-06 20:40:18.000000000","message":"Oh I guess that method either returns None or raises an exception.","commit_id":"1c97e71f2b688d0649676abf5c60dc28cc5e4d8b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"80b64b0ccd3dc683946bee2f6ac31539cb4379cb","unresolved":false,"context_lines":[{"line_number":1627,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.roll_detaching\u0027,"},{"line_number":1628,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1629,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.is_microversion_supported\u0027,"},{"line_number":1630,"context_line":"                           lambda *args, **kwargs: None)"},{"line_number":1631,"context_line":""},{"line_number":1632,"context_line":""},{"line_number":1633,"context_line":"class PlacementApiClient(object):"}],"source_content_type":"text/x-python","patch_set":172,"id":"df87a7cf_6095f53f","line":1630,"range":{"start_line":1630,"start_character":51,"end_line":1630,"end_character":55},"in_reply_to":"df87a7cf_65cc276a","updated":"2017-12-06 21:17:17.000000000","message":"Yep, the point is the exception in that one.","commit_id":"1c97e71f2b688d0649676abf5c60dc28cc5e4d8b"}],"nova/tests/functional/api_sample_tests/test_volumes.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def test_attach_volume_to_server(self):"},{"line_number":228,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.get\u0027, fakes.stub_volume_get)"},{"line_number":229,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.check_avaliability_zone\u0027,"},{"line_number":230,"context_line":"                      lambda *a, **k: None)"},{"line_number":231,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attachment_create\u0027,"},{"line_number":232,"context_line":"                      lambda *a, **k: {\u0027id\u0027: \u0027fake_id\u0027})"},{"line_number":233,"context_line":"        device_name \u003d \u0027/dev/vdd\u0027"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_c33f9d85","line":230,"range":{"start_line":229,"start_character":8,"end_line":230,"end_character":43},"updated":"2017-07-21 02:24:43.000000000","message":"This is obviously not needed because availability zone is spelled incorrectly.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.get\u0027, fakes.stub_volume_get)"},{"line_number":229,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.check_avaliability_zone\u0027,"},{"line_number":230,"context_line":"                      lambda *a, **k: None)"},{"line_number":231,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attachment_create\u0027,"},{"line_number":232,"context_line":"                      lambda *a, **k: {\u0027id\u0027: \u0027fake_id\u0027})"},{"line_number":233,"context_line":"        device_name \u003d \u0027/dev/vdd\u0027"},{"line_number":234,"context_line":"        bdm \u003d objects.BlockDeviceMapping()"},{"line_number":235,"context_line":"        bdm[\u0027device_name\u0027] \u003d device_name"},{"line_number":236,"context_line":"        bdm[\u0027attachment_id\u0027] \u003d None"},{"line_number":237,"context_line":"        self.stub_out("},{"line_number":238,"context_line":"            \u0027nova.compute.manager.ComputeManager.reserve_block_device_name\u0027,"},{"line_number":239,"context_line":"            lambda *a, **k: bdm)"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_a344a11c","line":236,"range":{"start_line":231,"start_character":8,"end_line":236,"end_character":35},"updated":"2017-07-21 02:24:43.000000000","message":"Why does any of this need to change? Just leave the samples working for the old style flow.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.get\u0027, fakes.stub_volume_get)"},{"line_number":272,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attachment_create\u0027,"},{"line_number":273,"context_line":"                      lambda *a, **k: {\u0027id\u0027: \u0027fake_id\u0027})"},{"line_number":274,"context_line":"        self.stub_out(\u0027nova.objects.BlockDeviceMapping.save\u0027,"},{"line_number":275,"context_line":"                      lambda *a, **k: None)"},{"line_number":276,"context_line":"        device_name \u003d \u0027/dev/vdd\u0027"},{"line_number":277,"context_line":"        bdm \u003d objects.BlockDeviceMapping()"},{"line_number":278,"context_line":"        bdm[\u0027device_name\u0027] \u003d device_name"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_6c8753b7","line":275,"range":{"start_line":274,"start_character":0,"end_line":275,"end_character":43},"updated":"2017-09-14 19:55:19.000000000","message":"It looks strange that we need to stub this out. What is the reason for this? (the test is passing for me without this line)","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.get\u0027, fakes.stub_volume_get)"},{"line_number":272,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attachment_create\u0027,"},{"line_number":273,"context_line":"                      lambda *a, **k: {\u0027id\u0027: \u0027fake_id\u0027})"},{"line_number":274,"context_line":"        self.stub_out(\u0027nova.objects.BlockDeviceMapping.save\u0027,"},{"line_number":275,"context_line":"                      lambda *a, **k: None)"},{"line_number":276,"context_line":"        device_name \u003d \u0027/dev/vdd\u0027"},{"line_number":277,"context_line":"        bdm \u003d objects.BlockDeviceMapping()"},{"line_number":278,"context_line":"        bdm[\u0027device_name\u0027] \u003d device_name"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_30d5191d","line":275,"range":{"start_line":274,"start_character":0,"end_line":275,"end_character":43},"in_reply_to":"5f2577a7_6c8753b7","updated":"2017-09-14 20:52:30.000000000","message":"It at least used to complain to me that I should not touch the DB with a unit test and .save would want to do that; hence the stub.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        device_name \u003d \u0027/dev/vdd\u0027"},{"line_number":277,"context_line":"        bdm \u003d objects.BlockDeviceMapping()"},{"line_number":278,"context_line":"        bdm[\u0027device_name\u0027] \u003d device_name"},{"line_number":279,"context_line":"        self.stub_out("},{"line_number":280,"context_line":"            \u0027nova.compute.manager.ComputeManager.reserve_block_device_name\u0027,"},{"line_number":281,"context_line":"            lambda *a, **k: bdm)"},{"line_number":282,"context_line":"        self.stub_out("},{"line_number":283,"context_line":"            \u0027nova.compute.manager.ComputeManager.attach_volume\u0027,"},{"line_number":284,"context_line":"            lambda *a, **k: None)"},{"line_number":285,"context_line":"        self.stub_out("},{"line_number":286,"context_line":"            \u0027nova.objects.BlockDeviceMapping.get_by_volume_and_instance\u0027,"},{"line_number":287,"context_line":"            classmethod(lambda *a, **k: None))"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_cc3887ef","line":284,"range":{"start_line":279,"start_character":0,"end_line":284,"end_character":33},"updated":"2017-09-14 19:55:19.000000000","message":"Do we stub these as these class would talk to the virt driver and the FakeDriver the test uses is not prepared for it? I see that this is already a pattern so I\u0027m OK with it. So I\u0027m just curious.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        device_name \u003d \u0027/dev/vdd\u0027"},{"line_number":277,"context_line":"        bdm \u003d objects.BlockDeviceMapping()"},{"line_number":278,"context_line":"        bdm[\u0027device_name\u0027] \u003d device_name"},{"line_number":279,"context_line":"        self.stub_out("},{"line_number":280,"context_line":"            \u0027nova.compute.manager.ComputeManager.reserve_block_device_name\u0027,"},{"line_number":281,"context_line":"            lambda *a, **k: bdm)"},{"line_number":282,"context_line":"        self.stub_out("},{"line_number":283,"context_line":"            \u0027nova.compute.manager.ComputeManager.attach_volume\u0027,"},{"line_number":284,"context_line":"            lambda *a, **k: None)"},{"line_number":285,"context_line":"        self.stub_out("},{"line_number":286,"context_line":"            \u0027nova.objects.BlockDeviceMapping.get_by_volume_and_instance\u0027,"},{"line_number":287,"context_line":"            classmethod(lambda *a, **k: None))"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_90cf2d55","line":284,"range":{"start_line":279,"start_character":0,"end_line":284,"end_character":33},"in_reply_to":"5f2577a7_cc3887ef","updated":"2017-09-14 20:52:30.000000000","message":"That would be my understanding here as we don\u0027t want to execute the lower level calls. I didn\u0027t want to mess with the fakeDriver if the other tests here don\u0027t do that either.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        self.stub_out("},{"line_number":283,"context_line":"            \u0027nova.compute.manager.ComputeManager.attach_volume\u0027,"},{"line_number":284,"context_line":"            lambda *a, **k: None)"},{"line_number":285,"context_line":"        self.stub_out("},{"line_number":286,"context_line":"            \u0027nova.objects.BlockDeviceMapping.get_by_volume_and_instance\u0027,"},{"line_number":287,"context_line":"            classmethod(lambda *a, **k: None))"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        volume \u003d fakes.stub_volume_get(None, context.get_admin_context(),"},{"line_number":290,"context_line":"                                       \u0027a26887c6-c47b-4654-abb5-dfadf7d3f803\u0027)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_2c7b8bbe","line":287,"range":{"start_line":285,"start_character":1,"end_line":287,"end_character":46},"updated":"2017-09-14 19:55:19.000000000","message":"ditto","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        self.stub_out("},{"line_number":283,"context_line":"            \u0027nova.compute.manager.ComputeManager.attach_volume\u0027,"},{"line_number":284,"context_line":"            lambda *a, **k: None)"},{"line_number":285,"context_line":"        self.stub_out("},{"line_number":286,"context_line":"            \u0027nova.objects.BlockDeviceMapping.get_by_volume_and_instance\u0027,"},{"line_number":287,"context_line":"            classmethod(lambda *a, **k: None))"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        volume \u003d fakes.stub_volume_get(None, context.get_admin_context(),"},{"line_number":290,"context_line":"                                       \u0027a26887c6-c47b-4654-abb5-dfadf7d3f803\u0027)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_f0fd516e","line":287,"range":{"start_line":285,"start_character":1,"end_line":287,"end_character":46},"in_reply_to":"5f2577a7_2c7b8bbe","updated":"2017-09-14 20:52:30.000000000","message":"As above.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"class VolumeAttachmentsSampleV249OldCinderFlow("},{"line_number":388,"context_line":"        test_servers.ServersSampleBase):"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    sample_dir \u003d \"os-volumes\""},{"line_number":391,"context_line":"    microversion \u003d \u00272.49\u0027"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_37fd18b1","line":388,"updated":"2017-09-14 19:55:19.000000000","message":"nit: this actually fits at the end of the previous line.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"class VolumeAttachmentsSampleV249OldCinderFlow("},{"line_number":388,"context_line":"        test_servers.ServersSampleBase):"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    sample_dir \u003d \"os-volumes\""},{"line_number":391,"context_line":"    microversion \u003d \u00272.49\u0027"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_b040e9a6","line":388,"in_reply_to":"5f2577a7_37fd18b1","updated":"2017-09-14 20:52:30.000000000","message":"Done","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        volume \u003d fakes.stub_volume_get(None, context.get_admin_context(),"},{"line_number":403,"context_line":"                                       \u0027a26887c6-c47b-4654-abb5-dfadf7d3f803\u0027)"},{"line_number":404,"context_line":"        self.stub_out(\u0027nova.objects.Service.get_minimum_version\u0027,"},{"line_number":405,"context_line":"                      lambda *a, **k: 21)"},{"line_number":406,"context_line":"        subs \u003d {"},{"line_number":407,"context_line":"            \u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":408,"context_line":"            \u0027device\u0027: device_name,"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_d7b37409","line":405,"range":{"start_line":405,"start_character":38,"end_line":405,"end_character":40},"updated":"2017-09-14 19:55:19.000000000","message":"Isn\u0027t it 22 as in L242?","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        volume \u003d fakes.stub_volume_get(None, context.get_admin_context(),"},{"line_number":403,"context_line":"                                       \u0027a26887c6-c47b-4654-abb5-dfadf7d3f803\u0027)"},{"line_number":404,"context_line":"        self.stub_out(\u0027nova.objects.Service.get_minimum_version\u0027,"},{"line_number":405,"context_line":"                      lambda *a, **k: 21)"},{"line_number":406,"context_line":"        subs \u003d {"},{"line_number":407,"context_line":"            \u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":408,"context_line":"            \u0027device\u0027: device_name,"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_704601c3","line":405,"range":{"start_line":405,"start_character":38,"end_line":405,"end_character":40},"in_reply_to":"5f2577a7_d7b37409","updated":"2017-09-14 20:52:30.000000000","message":"Done","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"}],"nova/tests/functional/notification_sample_tests/test_instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":870,"context_line":""},{"line_number":871,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_ERR_OLD_VOL)"},{"line_number":872,"context_line":"        self.cinder.swap_volume_instance_error_uuid \u003d server[\u0027id\u0027]"},{"line_number":873,"context_line":"        self.cinder.attachment_error_id \u003d self.cinder.SWAP_ERR_ATTACH_ID"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"        self._volume_swap_server(server, self.cinder.SWAP_ERR_OLD_VOL,"},{"line_number":876,"context_line":"                                 self.cinder.SWAP_ERR_NEW_VOL)"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_c358bdfb","line":873,"updated":"2017-07-21 02:24:43.000000000","message":"Why do we need to test this here in this patch? We aren\u0027t changing swap volume.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":870,"context_line":""},{"line_number":871,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_ERR_OLD_VOL)"},{"line_number":872,"context_line":"        self.cinder.swap_volume_instance_error_uuid \u003d server[\u0027id\u0027]"},{"line_number":873,"context_line":"        self.cinder.attachment_error_id \u003d self.cinder.SWAP_ERR_ATTACH_ID"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"        self._volume_swap_server(server, self.cinder.SWAP_ERR_OLD_VOL,"},{"line_number":876,"context_line":"                                 self.cinder.SWAP_ERR_NEW_VOL)"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_6fd1c357","line":873,"in_reply_to":"1f1a1f67_c358bdfb","updated":"2017-07-21 08:14:39.000000000","message":"We are enabling swap volume in this patch and swap wasn\u0027t covered here before.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"dcec5da8af9baad757824ed06fb31044b3f23200","unresolved":false,"context_lines":[{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    @mock.patch(\u0027nova.compute.manager.ComputeManager.\u0027"},{"line_number":745,"context_line":"                \u0027_do_rebuild_instance_with_claim\u0027)"},{"line_number":746,"context_line":"    def test_rebuild_server_exc(self, mock_rebuild, mock_get_version\u003dNone):"},{"line_number":747,"context_line":"        def _compute_resources_unavailable(*args, **kwargs):"},{"line_number":748,"context_line":"            raise exception.ComputeResourcesUnavailable("},{"line_number":749,"context_line":"                reason\u003d\"fake-resource\")"}],"source_content_type":"text/x-python","patch_set":104,"id":"ff346bd7_826058d0","line":746,"range":{"start_line":746,"start_character":8,"end_line":746,"end_character":31},"updated":"2017-07-24 16:02:24.000000000","message":"With the current setup this test is failing in the parent class as it gets the mock from the child and thinks that the compute service version is 21 and tries to switch back to the old flow but the fixture doesn\u0027t contain those calls.\n\nthe failing test:\nnova.tests.functional.notification_sample_tests.test_instance.TestInstanceNotificationSample.test_rebuild_server_exc\n\nlog:\nhttp://logs.openstack.org/85/330285/104/check/gate-nova-tox-functional-ubuntu-xenial/231f3e5/console.html#_2017-07-24_09_34_06_832361","commit_id":"a09f5f0ccc4ab854683b13634c06fcfb092bd19e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def setUp(self):"},{"line_number":93,"context_line":"        self.flags(use_neutron\u003dTrue)"},{"line_number":94,"context_line":"        self.flags(bdms_in_notifications\u003d\u0027True\u0027, group\u003d\u0027notifications\u0027)"},{"line_number":95,"context_line":"        super(TestInstanceNotificationSampleWithMultipleCompute, self).setUp()"},{"line_number":96,"context_line":"        self.neutron \u003d fixtures.NeutronFixture(self)"},{"line_number":97,"context_line":"        self.useFixture(self.neutron)"},{"line_number":98,"context_line":"        self.cinder \u003d fixtures.CinderFixture(self)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_86cedb7f","line":95,"range":{"start_line":95,"start_character":14,"end_line":95,"end_character":63},"updated":"2017-09-14 19:55:19.000000000","message":"This should be TestInstanceNotificationSampleWithMultipleComputeOldAttachFlow","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    def setUp(self):"},{"line_number":93,"context_line":"        self.flags(use_neutron\u003dTrue)"},{"line_number":94,"context_line":"        self.flags(bdms_in_notifications\u003d\u0027True\u0027, group\u003d\u0027notifications\u0027)"},{"line_number":95,"context_line":"        super(TestInstanceNotificationSampleWithMultipleCompute, self).setUp()"},{"line_number":96,"context_line":"        self.neutron \u003d fixtures.NeutronFixture(self)"},{"line_number":97,"context_line":"        self.useFixture(self.neutron)"},{"line_number":98,"context_line":"        self.cinder \u003d fixtures.CinderFixture(self)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_109c5d0d","line":95,"range":{"start_line":95,"start_character":14,"end_line":95,"end_character":63},"in_reply_to":"5f2577a7_86cedb7f","updated":"2017-09-14 20:52:30.000000000","message":"I had issues when using TestInstanceNotificationSampleWithMultipleComputeOldAttachFlow as I had both fixtures set up and I only need the original one here.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        self.cinder \u003d fixtures.CinderFixture(self)"},{"line_number":99,"context_line":"        self.useFixture(self.cinder)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        patcher \u003d self.mock_min_service_version \u003d \\"},{"line_number":102,"context_line":"            mock.patch(\u0027nova.objects.Service.get_minimum_version\u0027,"},{"line_number":103,"context_line":"                       return_value\u003d22)"},{"line_number":104,"context_line":"        self.mock_min_service_version \u003d patcher.start()"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_26c96725","line":101,"range":{"start_line":101,"start_character":18,"end_line":101,"end_character":47},"updated":"2017-09-14 19:55:19.000000000","message":"This is not use anywhere so I guess we don\u0027t need it.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        self.cinder \u003d fixtures.CinderFixture(self)"},{"line_number":99,"context_line":"        self.useFixture(self.cinder)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        patcher \u003d self.mock_min_service_version \u003d \\"},{"line_number":102,"context_line":"            mock.patch(\u0027nova.objects.Service.get_minimum_version\u0027,"},{"line_number":103,"context_line":"                       return_value\u003d22)"},{"line_number":104,"context_line":"        self.mock_min_service_version \u003d patcher.start()"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_f038b1ee","line":101,"range":{"start_line":101,"start_character":18,"end_line":101,"end_character":47},"in_reply_to":"5f2577a7_26c96725","updated":"2017-09-14 20:52:30.000000000","message":"How do you mean it\u0027s not used?","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                       return_value\u003d22)"},{"line_number":104,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":105,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class TestInstanceNotificationSample("},{"line_number":109,"context_line":"        notification_sample_base.NotificationSampleTestBase):"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_c6b863e6","line":106,"updated":"2017-09-14 19:55:19.000000000","message":"When this will call the proper base class setUp() (see my above comment) you don\u0027t have to duplicate everything. You only need the cinder fixture setup as that is different and the get_minimum_version mocking.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                       return_value\u003d22)"},{"line_number":104,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":105,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class TestInstanceNotificationSample("},{"line_number":109,"context_line":"        notification_sample_base.NotificationSampleTestBase):"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_905e0d42","line":106,"in_reply_to":"5f2577a7_c6b863e6","updated":"2017-09-14 20:52:30.000000000","message":"See my above comment about multiple fixtures.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":"class TestInstanceNotificationSampleOldAttachFlow("},{"line_number":1068,"context_line":"        TestInstanceNotificationSample):"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def setUp(self):"},{"line_number":1071,"context_line":"        self.flags(use_neutron\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_29d5b81c","line":1068,"range":{"start_line":1068,"start_character":8,"end_line":1068,"end_character":38},"updated":"2017-09-14 19:55:19.000000000","message":"That means that _every_ notification sample tests now runs with the old and the new cinder flow. I don\u0027t know if it is good or bad I just noted it.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":"class TestInstanceNotificationSampleOldAttachFlow("},{"line_number":1068,"context_line":"        TestInstanceNotificationSample):"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def setUp(self):"},{"line_number":1071,"context_line":"        self.flags(use_neutron\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_50a66555","line":1068,"range":{"start_line":1068,"start_character":8,"end_line":1068,"end_character":38},"in_reply_to":"5f2577a7_29d5b81c","updated":"2017-09-14 20:52:30.000000000","message":"That was the point to have the tests run with the old and new flow as well. So it was intentional.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":1080,"context_line":"            mock.patch(\u0027nova.objects.Service.get_minimum_version\u0027,"},{"line_number":1081,"context_line":"                       return_value\u003d22)"},{"line_number":1082,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":1083,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def test_volume_swap_server_with_error(self):"},{"line_number":1086,"context_line":"        server \u003d self._boot_a_server("}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_c65e2375","line":1083,"updated":"2017-09-14 19:55:19.000000000","message":"You don\u0027t have to duplicate what is already done in the TestInstanceNotificationSample.setUp()","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":1080,"context_line":"            mock.patch(\u0027nova.objects.Service.get_minimum_version\u0027,"},{"line_number":1081,"context_line":"                       return_value\u003d22)"},{"line_number":1082,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":1083,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def test_volume_swap_server_with_error(self):"},{"line_number":1086,"context_line":"        server \u003d self._boot_a_server("}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_106a1ded","line":1083,"in_reply_to":"5f2577a7_c65e2375","updated":"2017-09-14 20:52:30.000000000","message":"It\u0027s in TestInstanceNotificationSampleWithMultipleComputeOldAttachFlow, which is different.\n\nGerrit displays that changes a bit odd way in this file IMHO, it looks less readable to me, but I can\u0027t do much about it.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":1137,"context_line":"                \u0027block_devices\u0027: block_devices,"},{"line_number":1138,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":1139,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[6])"},{"line_number":1140,"context_line":""},{"line_number":1141,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.attach\u0027)"},{"line_number":1142,"context_line":"    def _test_attach_volume_error(self, server, mock_attach):"},{"line_number":1143,"context_line":"        def attach_volume(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_690060ac","line":1140,"updated":"2017-09-14 19:55:19.000000000","message":"Pretty many duplicated lines for two lines of change. But I guess it is complicated because the cinder fixtures are complicated. I have a TODO to do something with these cinder fixtures.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":1137,"context_line":"                \u0027block_devices\u0027: block_devices,"},{"line_number":1138,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":1139,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[6])"},{"line_number":1140,"context_line":""},{"line_number":1141,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.attach\u0027)"},{"line_number":1142,"context_line":"    def _test_attach_volume_error(self, server, mock_attach):"},{"line_number":1143,"context_line":"        def attach_volume(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_70fba146","line":1140,"in_reply_to":"5f2577a7_690060ac","updated":"2017-09-14 20:52:30.000000000","message":"I didn\u0027t want to mix together the old and new flow. And I also couldn\u0027t figure out how not to duplicate the whole test here easily. So for now I was shooting for having test coverage and improve that later.\n\nI\u0027m open to suggestions or happy to help looking into how to optimize this.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.cinder \u003d fixtures.CinderFixtureNewAttachFlow(self)"},{"line_number":37,"context_line":"        self.useFixture(self.cinder)"},{"line_number":38,"context_line":"        self.useFixture(fixtures.AllServicesCurrent())"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":41,"context_line":"    @mock.patch("},{"line_number":42,"context_line":"        \u0027nova.compute.api.API._check_volume_already_attached_to_instance\u0027)"},{"line_number":43,"context_line":"    def test_live_migration_actions(self, mock_volume_already_attached,"},{"line_number":44,"context_line":"                                    mock_cinder_mv):"},{"line_number":45,"context_line":"        server \u003d self._boot_a_server("}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_46603702","line":42,"range":{"start_line":39,"start_character":0,"end_line":42,"end_character":74},"updated":"2017-11-22 13:18:53.000000000","message":"I think we should not do this in a functional test case. I guess we need this here to avoid some problem with the CinderFixture. It would be a lot clearer to have this handled by the fixture.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.cinder \u003d fixtures.CinderFixtureNewAttachFlow(self)"},{"line_number":37,"context_line":"        self.useFixture(self.cinder)"},{"line_number":38,"context_line":"        self.useFixture(fixtures.AllServicesCurrent())"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":41,"context_line":"    @mock.patch("},{"line_number":42,"context_line":"        \u0027nova.compute.api.API._check_volume_already_attached_to_instance\u0027)"},{"line_number":43,"context_line":"    def test_live_migration_actions(self, mock_volume_already_attached,"},{"line_number":44,"context_line":"                                    mock_cinder_mv):"},{"line_number":45,"context_line":"        server \u003d self._boot_a_server("}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_4e704ddd","line":42,"range":{"start_line":39,"start_character":0,"end_line":42,"end_character":74},"in_reply_to":"ff82abbf_46603702","updated":"2017-11-22 15:30:04.000000000","message":"+1 seems odd here.\n\nI don\u0027t get why _check_volume_already_attached_to_instance shouldn\u0027t work. Might be hiding a real bug here? Not sure.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.cinder \u003d fixtures.CinderFixtureNewAttachFlow(self)"},{"line_number":37,"context_line":"        self.useFixture(self.cinder)"},{"line_number":38,"context_line":"        self.useFixture(fixtures.AllServicesCurrent())"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":41,"context_line":"    @mock.patch("},{"line_number":42,"context_line":"        \u0027nova.compute.api.API._check_volume_already_attached_to_instance\u0027)"},{"line_number":43,"context_line":"    def test_live_migration_actions(self, mock_volume_already_attached,"},{"line_number":44,"context_line":"                                    mock_cinder_mv):"},{"line_number":45,"context_line":"        server \u003d self._boot_a_server("}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_5f030b0e","line":42,"range":{"start_line":39,"start_character":0,"end_line":42,"end_character":74},"in_reply_to":"ff82abbf_4e704ddd","updated":"2017-11-23 02:34:54.000000000","message":"Done","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        self.cinder \u003d fixtures.CinderFixture(self)"},{"line_number":154,"context_line":"        self.useFixture(self.cinder)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        patcher \u003d self.mock_min_service_version \u003d \\"},{"line_number":157,"context_line":"            mock.patch(\u0027nova.objects.Service.get_minimum_version\u0027,"},{"line_number":158,"context_line":"                       return_value\u003d23)"},{"line_number":159,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":160,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_262ad38f","line":159,"range":{"start_line":156,"start_character":0,"end_line":159,"end_character":55},"updated":"2017-11-22 13:18:53.000000000","message":"I get this. We need this to force the code to the old flow. So this is OK.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self.cinder \u003d fixtures.CinderFixtureNewAttachFlow(self)"},{"line_number":173,"context_line":"        self.useFixture(self.cinder)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        patcher \u003d self.mock_volume_already_attached \u003d \\"},{"line_number":176,"context_line":"            mock.patch("},{"line_number":177,"context_line":"                \"nova.compute.api.API.\""},{"line_number":178,"context_line":"                \"_check_volume_already_attached_to_instance\")"},{"line_number":179,"context_line":"        self.mock_volume_already_attached \u003d patcher.start()"},{"line_number":180,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        patcher_2 \u003d self.mock_cinder_mv \u003d \\"},{"line_number":183,"context_line":"            mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":184,"context_line":"        self.mock_cinder_mv \u003d patcher_2.start()"},{"line_number":185,"context_line":"        self.addCleanup(patcher_2.stop)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _wait_until_swap_volume(self, server, volume_id):"},{"line_number":188,"context_line":"        for i in range(50):"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_0608ef29","line":185,"range":{"start_line":175,"start_character":0,"end_line":185,"end_character":39},"updated":"2017-11-22 13:18:53.000000000","message":"I think it is the same as L40-L42 so my comment is also the same. This should be handled inside the fixture as this test should not know about these internal cinder api implementation details.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self.cinder \u003d fixtures.CinderFixtureNewAttachFlow(self)"},{"line_number":173,"context_line":"        self.useFixture(self.cinder)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        patcher \u003d self.mock_volume_already_attached \u003d \\"},{"line_number":176,"context_line":"            mock.patch("},{"line_number":177,"context_line":"                \"nova.compute.api.API.\""},{"line_number":178,"context_line":"                \"_check_volume_already_attached_to_instance\")"},{"line_number":179,"context_line":"        self.mock_volume_already_attached \u003d patcher.start()"},{"line_number":180,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        patcher_2 \u003d self.mock_cinder_mv \u003d \\"},{"line_number":183,"context_line":"            mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":184,"context_line":"        self.mock_cinder_mv \u003d patcher_2.start()"},{"line_number":185,"context_line":"        self.addCleanup(patcher_2.stop)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _wait_until_swap_volume(self, server, volume_id):"},{"line_number":188,"context_line":"        for i in range(50):"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_3f296789","line":185,"range":{"start_line":175,"start_character":0,"end_line":185,"end_character":39},"in_reply_to":"ff82abbf_0608ef29","updated":"2017-11-23 02:34:54.000000000","message":"Done","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        return replacements"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    @mock.patch("},{"line_number":325,"context_line":"        \u0027nova.compute.api.API._check_volume_already_attached_to_instance\u0027)"},{"line_number":326,"context_line":"    def test_create_delete_server_with_instance_update(self,"},{"line_number":327,"context_line":"                                                       mock_vol_attached):"},{"line_number":328,"context_line":"        # This makes server network creation synchronous which is necessary"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_a6d4a3be","line":325,"updated":"2017-11-22 13:18:53.000000000","message":"This seems unnecessary and the test passes without it.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        return replacements"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    @mock.patch("},{"line_number":325,"context_line":"        \u0027nova.compute.api.API._check_volume_already_attached_to_instance\u0027)"},{"line_number":326,"context_line":"    def test_create_delete_server_with_instance_update(self,"},{"line_number":327,"context_line":"                                                       mock_vol_attached):"},{"line_number":328,"context_line":"        # This makes server network creation synchronous which is necessary"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_1f26e3b8","line":325,"in_reply_to":"ff82abbf_a6d4a3be","updated":"2017-11-23 02:34:54.000000000","message":"Done","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":1347,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":1348,"context_line":""},{"line_number":1349,"context_line":"    def test_volume_swap_server_with_error(self):"},{"line_number":1350,"context_line":"        server \u003d self._boot_a_server("},{"line_number":1351,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":1352,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_88ec0d2a","line":1349,"updated":"2017-11-22 13:18:53.000000000","message":"The only diff between this and the original test case it overrides is the way how the test tells the fixture that it expects an error now. (old L1054, new L1354). I think it would be better to have the same way in both fixture for this settings. If that is not possible then I suggest to move this  single line of code into a util function in the original test and only override the util function in this test class to avoid the extensive duplication.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":1347,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":1348,"context_line":""},{"line_number":1349,"context_line":"    def test_volume_swap_server_with_error(self):"},{"line_number":1350,"context_line":"        server \u003d self._boot_a_server("},{"line_number":1351,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":1352,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_f973227f","line":1349,"in_reply_to":"ff82abbf_6e1af17d","updated":"2017-11-23 02:34:54.000000000","message":"I wanted to have coverage first and refactor after. Will try my best, might move it into a follow up if I get into trouble with it.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":1346,"context_line":"        self.mock_min_service_version \u003d patcher.start()"},{"line_number":1347,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":1348,"context_line":""},{"line_number":1349,"context_line":"    def test_volume_swap_server_with_error(self):"},{"line_number":1350,"context_line":"        server \u003d self._boot_a_server("},{"line_number":1351,"context_line":"            extra_params\u003d{\u0027networks\u0027: [{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}]})"},{"line_number":1352,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_6e1af17d","line":1349,"in_reply_to":"ff82abbf_88ec0d2a","updated":"2017-11-22 15:30:04.000000000","message":"I would almost rather not have the test than carry all this duplication.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6921a6e55fe179f6240180309397b027c91da4d4","unresolved":false,"context_lines":[{"line_number":1403,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[6])"},{"line_number":1404,"context_line":""},{"line_number":1405,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.attach\u0027)"},{"line_number":1406,"context_line":"    def _test_attach_volume_error(self, server, mock_attach):"},{"line_number":1407,"context_line":"        def attach_volume(*args, **kwargs):"},{"line_number":1408,"context_line":"            raise exception.CinderConnectionFailed("},{"line_number":1409,"context_line":"                reason\u003d\"Connection timed out\")"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_28286132","line":1406,"updated":"2017-11-22 13:18:53.000000000","message":"The only difference between this and the original test step it overrides is the function it mocks out. \nCan we avoid this difference somehow? Can we simulate the error by mocking some common function for both the old and the new flow?\nIf not then I think you can still avoid most of this duplication by the following restructuring:\nin TestInstanceNotificationSample:\n@mock.patch(\u0027nova.volume.cinder.API.attachment_update\u0027)\ndef _test_attach_volume_error(self, server, mock_attach):\n    _do_test_attach_volume_error(self, server, mock_attach)\n\ndef _do_test_attach_volume_error(self, server, mock_attach):\n# move the content of the original _test_attach_volume_error() here\n\nThen in TestInstanceNotificationSampleOldAttachFlow:\n@mock.patch(\u0027nova.volume.cinder.API.attach\u0027)\ndef _test_attach_volume_error(self, server, mock_attach):\n    _do_test_attach_volume_error(self, server, mock_attach)","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":1403,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[6])"},{"line_number":1404,"context_line":""},{"line_number":1405,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.attach\u0027)"},{"line_number":1406,"context_line":"    def _test_attach_volume_error(self, server, mock_attach):"},{"line_number":1407,"context_line":"        def attach_volume(*args, **kwargs):"},{"line_number":1408,"context_line":"            raise exception.CinderConnectionFailed("},{"line_number":1409,"context_line":"                reason\u003d\"Connection timed out\")"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_3f4e476f","line":1406,"in_reply_to":"ff82abbf_28286132","updated":"2017-11-23 02:34:54.000000000","message":"Will give it a try after I cleaned up the mocks. Thanks.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"}],"nova/tests/functional/regressions/test_bug_1675570.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"a3544984df430cdffa892f0173eb0fb55653dddd","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"import time"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_f7a35e4e","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":11},"updated":"2017-10-11 06:51:50.000000000","message":"It should be just before line 18 (from oslo_log import log as logging.)","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"import time"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_a1b3424d","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":11},"in_reply_to":"5f4e5783_f7a35e4e","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        patcher \u003d self.mock_volume_already_attached \u003d \\"},{"line_number":76,"context_line":"            mock.patch("},{"line_number":77,"context_line":"                \"nova.compute.api.API.\""},{"line_number":78,"context_line":"                \"_check_volume_already_attached_to_instance\")"},{"line_number":79,"context_line":"        self.mock_volume_already_attached \u003d patcher.start()"},{"line_number":80,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_3109ac2b","line":78,"updated":"2017-11-22 15:30:04.000000000","message":"Why is this needed? shouldn\u0027t the bdm exist already?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        patcher \u003d self.mock_volume_already_attached \u003d \\"},{"line_number":76,"context_line":"            mock.patch("},{"line_number":77,"context_line":"                \"nova.compute.api.API.\""},{"line_number":78,"context_line":"                \"_check_volume_already_attached_to_instance\")"},{"line_number":79,"context_line":"        self.mock_volume_already_attached \u003d patcher.start()"},{"line_number":80,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_3c1bb581","line":78,"in_reply_to":"ff82abbf_3109ac2b","updated":"2017-11-23 02:34:54.000000000","message":"On one hand, it shouldn\u0027t, on the other hand I got a bit overly ambitious with mocks after the zillion unit test failures. Cleaned it up now.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a956196f2948556a8c736ee466ec0da70f0544fb","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        patcher \u003d self.mock_volume_already_attached \u003d \\"},{"line_number":76,"context_line":"            mock.patch("},{"line_number":77,"context_line":"                \"nova.compute.api.API.\""},{"line_number":78,"context_line":"                \"_check_volume_already_attached_to_instance\")"},{"line_number":79,"context_line":"        self.mock_volume_already_attached \u003d patcher.start()"},{"line_number":80,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_b125a3c4","line":78,"in_reply_to":"ff82abbf_3c1bb581","updated":"2017-11-23 10:20:50.000000000","message":"Ah, I know that feeling.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        patcher_2 \u003d self.mock_cinder_mv \u003d \\"},{"line_number":83,"context_line":"            mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":84,"context_line":"        self.mock_cinder_mv \u003d patcher_2.start()"},{"line_number":85,"context_line":"        self.addCleanup(patcher_2.stop)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_11d8287d","line":83,"updated":"2017-11-22 15:30:04.000000000","message":"+1 for moving this to the fixture.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        patcher_2 \u003d self.mock_cinder_mv \u003d \\"},{"line_number":83,"context_line":"            mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":84,"context_line":"        self.mock_cinder_mv \u003d patcher_2.start()"},{"line_number":85,"context_line":"        self.addCleanup(patcher_2.stop)"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_b976fa05","line":83,"in_reply_to":"ff82abbf_11d8287d","updated":"2017-11-23 02:34:54.000000000","message":"Done","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"eafd2565906667c961a64ed4003ece0d400f7f82","unresolved":false,"context_lines":[{"line_number":973,"context_line":"        with test.nested(mock.patch.object(objects.BlockDeviceMappingList,"},{"line_number":974,"context_line":"                                           \u0027get_by_instance_uuid\u0027),"},{"line_number":975,"context_line":"                         mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":976,"context_line":"                                           \u0027get_by_volume_id\u0027),"},{"line_number":977,"context_line":"                         mock.patch.object(compute_api.API,"},{"line_number":978,"context_line":"                                           \u0027_local_cleanup_bdm_volumes\u0027)"},{"line_number":979,"context_line":"                         ) as (mock_get_bdms, mock_get_bdm, mock_clean_vols):"}],"source_content_type":"text/x-python","patch_set":90,"id":"3f1d235d_9bd6bd27","line":976,"range":{"start_line":976,"start_character":44,"end_line":976,"end_character":60},"updated":"2017-07-08 10:03:33.000000000","message":"get_by_volume_and_instance","commit_id":"a04ca7881a24cb0762f93b73fe079b8cb19588b8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":1034,"context_line":""},{"line_number":1035,"context_line":"        # Test detach volume"},{"line_number":1036,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.get\u0027, fakes.stub_volume_get)"},{"line_number":1037,"context_line":""},{"line_number":1038,"context_line":"        with test.nested(mock.patch.object(objects.BlockDeviceMappingList,"},{"line_number":1039,"context_line":"                                           \u0027get_by_instance_uuid\u0027),"},{"line_number":1040,"context_line":"                         mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":1041,"context_line":"                                           \u0027get_by_volume_and_instance\u0027),"},{"line_number":1042,"context_line":"                         mock.patch.object(compute_api.API,"},{"line_number":1043,"context_line":"                                           \u0027_local_cleanup_bdm_volumes\u0027)"},{"line_number":1044,"context_line":"                         ) as (mock_get_bdms, mock_get_bdm, mock_clean_vols):"},{"line_number":1045,"context_line":"            fake_bdms \u003d self._get_fake_bdms(self.ctxt)"},{"line_number":1046,"context_line":"            mock_get_bdms.return_value \u003d fake_bdms"},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"            fake_bdm \u003d fake_bdms[0]"},{"line_number":1049,"context_line":"            fake_bdm.attachment_id \u003d \u0027fake_id\u0027"},{"line_number":1050,"context_line":"            mock_get_bdm.return_value \u003d fake_bdm"},{"line_number":1051,"context_line":"            attachment_id \u003d mock_get_bdms.return_value[0][\u0027volume_id\u0027]"},{"line_number":1052,"context_line":"            self.api.api_delete(\u0027/servers/%s/os-volume_attachments/%s\u0027 %"},{"line_number":1053,"context_line":"                            (server_id, attachment_id))"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_83f765d5","line":1050,"range":{"start_line":1037,"start_character":0,"end_line":1050,"end_character":48},"updated":"2017-07-21 02:24:43.000000000","message":"Why are we changing any of this? Isn\u0027t this essentially stomping on any testing here for an old style attachment?\n\nWe should leave the old style attachment tests alone, and add new tests for new style attachment coverage.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        # Test detach volume"},{"line_number":1089,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.get\u0027, fakes.stub_volume_get)"},{"line_number":1090,"context_line":"        with test.nested(mock.patch.object(objects.BlockDeviceMappingList,"},{"line_number":1091,"context_line":"                                           \u0027get_by_instance_uuid\u0027),"},{"line_number":1092,"context_line":"                         mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":1093,"context_line":"                                           \u0027get_by_volume_and_instance\u0027),"},{"line_number":1094,"context_line":"                         mock.patch.object(compute_api.API,"},{"line_number":1095,"context_line":"                                           \u0027_local_cleanup_bdm_volumes\u0027)"},{"line_number":1096,"context_line":"                         ) as (mock_get_bdms, mock_get_bdm, mock_clean_vols):"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_297b78f5","line":1093,"range":{"start_line":1090,"start_character":0,"end_line":1093,"end_character":73},"updated":"2017-09-14 19:55:19.000000000","message":"It start looking like a big unit test instead of a black boxy functional test. But I see that this is a pattern from above. So I can accept this.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        # Test detach volume"},{"line_number":1089,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.get\u0027, fakes.stub_volume_get)"},{"line_number":1090,"context_line":"        with test.nested(mock.patch.object(objects.BlockDeviceMappingList,"},{"line_number":1091,"context_line":"                                           \u0027get_by_instance_uuid\u0027),"},{"line_number":1092,"context_line":"                         mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":1093,"context_line":"                                           \u0027get_by_volume_and_instance\u0027),"},{"line_number":1094,"context_line":"                         mock.patch.object(compute_api.API,"},{"line_number":1095,"context_line":"                                           \u0027_local_cleanup_bdm_volumes\u0027)"},{"line_number":1096,"context_line":"                         ) as (mock_get_bdms, mock_get_bdm, mock_clean_vols):"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_6b33b0f7","line":1093,"range":{"start_line":1090,"start_character":0,"end_line":1093,"end_character":73},"in_reply_to":"5f2577a7_297b78f5","updated":"2017-09-14 20:52:30.000000000","message":"I don\u0027t really know the background for not using the fixtures here. I followed the patterns...","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8349a1d0f2e3ecf74d8534f50840b7bef6bc5f44","unresolved":false,"context_lines":[{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"        self._delete_server(server_id)"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    def test_attach_detach_vol_to_shelved_offloaded_server_new_flow(self):"},{"line_number":1073,"context_line":"        self.flags(shelved_offload_time\u003d0)"},{"line_number":1074,"context_line":"        found_server \u003d self._shelve_server()"},{"line_number":1075,"context_line":"        self.assertEqual(\u0027SHELVED_OFFLOADED\u0027, found_server[\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":170,"id":"df87a7cf_841aad7a","line":1072,"range":{"start_line":1072,"start_character":8,"end_line":1072,"end_character":67},"updated":"2017-12-05 23:20:07.000000000","message":"This arguably belongs in nova.tests.unit.compute.test_compute_api - this is a lot of mocking for a functional test, and is probably redundant with unit tests that we already have. I realize it\u0027s copying the test above, but seems we should just remove this.\n\nI think the unit tests that cover this are:\n\ntest_attach_volume_shelved_offloaded_new_flow\n\ntest_detach_volume_shelved_offloaded_new_flow","commit_id":"ccd0044d219176475adf6255e817a432785b6774"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"63abce4faf6337957ae3b17e6098181507f38469","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            return 0"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attach_version\u0027,"},{"line_number":258,"context_line":"                      fake_attach_version)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        self.compute_api \u003d compute.API()"},{"line_number":261,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba2be162_9c4aae53","line":258,"range":{"start_line":258,"start_character":22,"end_line":258,"end_character":41},"updated":"2017-03-06 08:54:03.000000000","message":"ditto","commit_id":"d5b9bd8c34bd785652db7d2425c0aaf63483fd3c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        self.test.stub_out(\u0027nova.volume.cinder.API.attach_version\u0027,"},{"line_number":261,"context_line":"                           lambda *args, **kwargs: 0)"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        self.compute_api \u003d compute.API()"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Just to make long lines short"}],"source_content_type":"text/x-python","patch_set":49,"id":"ff82abbf_11aa68d1","line":262,"updated":"2017-11-22 15:30:04.000000000","message":"I was expecting we would test both old an new flows, although cut and pasting all the tests seems terrible. I need to re-read this to get a better idea.","commit_id":"ebe267929bc92e2b4f211ba3c838cd62feab24db"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"60414861eed418e7214c47768a0175a385ff84fa","unresolved":false,"context_lines":[{"line_number":781,"context_line":"        bdm \u003d objects.BlockDeviceMapping(context\u003dself.context,"},{"line_number":782,"context_line":"                                         id\u003d1, device_name\u003d\u0027/dev/vdb\u0027,"},{"line_number":783,"context_line":"                                         connection_info\u003d\u0027{\"attachment_id\": \u0027"},{"line_number":784,"context_line":"                                         \u0027\"\u0027 + str(uuids.attachment_id) + \u0027\"}\u0027,"},{"line_number":785,"context_line":"                                         instance_uuid\u003dinstance[\u0027uuid\u0027],"},{"line_number":786,"context_line":"                                         source_type\u003d\u0027volume\u0027,"},{"line_number":787,"context_line":"                                         destination_type\u003d\u0027volume\u0027,"}],"source_content_type":"text/x-python","patch_set":63,"id":"5f201791_be82cffe","line":784,"updated":"2017-06-27 18:49:44.000000000","message":"nit - this str() shouldn\u0027t e needed.","commit_id":"c3b9ddc13fd986a9eb31c3139e15ce43425184ca"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"60414861eed418e7214c47768a0175a385ff84fa","unresolved":false,"context_lines":[{"line_number":793,"context_line":"                                         attachment_id\u003dNone)"},{"line_number":794,"context_line":"        host_volume_bdms \u003d {\u0027id\u0027: 1, \u0027device_name\u0027: \u0027/dev/vdb\u0027,"},{"line_number":795,"context_line":"            \u0027connection_info\u0027: \u0027{\"attachment_id\": \u0027"},{"line_number":796,"context_line":"                                 \u0027\"\u0027 + str(uuids.attachment_id) + \u0027\"}\u0027,"},{"line_number":797,"context_line":"            \u0027instance_uuid\u0027: instance[\u0027uuid\u0027],"},{"line_number":798,"context_line":"            \u0027volume_id\u0027: uuids.volume_id}"},{"line_number":799,"context_line":"        mock_get.return_value \u003d bdm.obj_clone()"}],"source_content_type":"text/x-python","patch_set":63,"id":"5f201791_3e76bf3f","line":796,"updated":"2017-06-27 18:49:44.000000000","message":"same here.","commit_id":"c3b9ddc13fd986a9eb31c3139e15ce43425184ca"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"60414861eed418e7214c47768a0175a385ff84fa","unresolved":false,"context_lines":[{"line_number":2798,"context_line":"                    \u0027device_name\u0027: \u0027/dev/vda\u0027,"},{"line_number":2799,"context_line":"                    \u0027connection_info\u0027: \u0027{\"driver_volume_type\": \"rbd\",\u0027"},{"line_number":2800,"context_line":"                                         \u0027\"attachment_id\": \u0027"},{"line_number":2801,"context_line":"                                         \u0027\"\u0027 + str(uuids.attachment_id + \u0027\"}\u0027),"},{"line_number":2802,"context_line":"                    \u0027source_type\u0027: \u0027image\u0027,"},{"line_number":2803,"context_line":"                    \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":2804,"context_line":"                    \u0027image_id\u0027: \u0027fake-image-id-1\u0027,"}],"source_content_type":"text/x-python","patch_set":63,"id":"5f201791_1ea663ac","line":2801,"updated":"2017-06-27 18:49:44.000000000","message":"str() not needed (there are also a few more of these that a search can find)","commit_id":"c3b9ddc13fd986a9eb31c3139e15ce43425184ca"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        mock_elevate.return_value \u003d self.context"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        fake_bdm \u003d objects.BlockDeviceMapping(**self.fake_volume)"},{"line_number":406,"context_line":"        fake_bdm.attachment_id \u003d uuids.attachment_id"},{"line_number":407,"context_line":"        instance \u003d self._create_fake_instance_obj()"},{"line_number":408,"context_line":"        expected_exception \u003d test.TestingException()"},{"line_number":409,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_8320854b","line":406,"updated":"2017-07-21 02:24:43.000000000","message":"Same comments as before, I want to leave the existing old style attachment tests alone, and write new tests for new flows. So basically copy an old style test and tweak it however you need. This applies to everything else in here.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":10123,"context_line":"        fake_volume \u003d {\u0027id\u0027: \u0027fake-volume-id\u0027}"},{"line_number":10124,"context_line":""},{"line_number":10125,"context_line":"        with test.nested("},{"line_number":10126,"context_line":"            mock.patch.object(objects.Service, \u0027get_minimum_version\u0027,"},{"line_number":10127,"context_line":"                              return_value\u003d23),"},{"line_number":10128,"context_line":"            mock.patch.object(cinder.API, \u0027get\u0027, return_value\u003dfake_volume),"},{"line_number":10129,"context_line":"            mock.patch.object(cinder.API, \u0027check_availability_zone\u0027),"},{"line_number":10130,"context_line":"            mock.patch.object(cinder.API, \u0027attachment_create\u0027,"},{"line_number":10131,"context_line":"                              return_value\u003d{\u0027id\u0027: uuids.attachment_id}),"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_498da4d1","line":10128,"range":{"start_line":10126,"start_character":1,"end_line":10128,"end_character":1},"updated":"2017-09-14 19:55:19.000000000","message":"It is now inconsistent with the other new flow test case at L436 where you not set any minimum version. It is fine for me both ways but keep it consistent please.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"180bb55480bfb2b7ce77854264daf76aa2cc05c8","unresolved":false,"context_lines":[{"line_number":10123,"context_line":"        fake_volume \u003d {\u0027id\u0027: \u0027fake-volume-id\u0027}"},{"line_number":10124,"context_line":""},{"line_number":10125,"context_line":"        with test.nested("},{"line_number":10126,"context_line":"            mock.patch.object(objects.Service, \u0027get_minimum_version\u0027,"},{"line_number":10127,"context_line":"                              return_value\u003d23),"},{"line_number":10128,"context_line":"            mock.patch.object(cinder.API, \u0027get\u0027, return_value\u003dfake_volume),"},{"line_number":10129,"context_line":"            mock.patch.object(cinder.API, \u0027check_availability_zone\u0027),"},{"line_number":10130,"context_line":"            mock.patch.object(cinder.API, \u0027attachment_create\u0027,"},{"line_number":10131,"context_line":"                              return_value\u003d{\u0027id\u0027: uuids.attachment_id}),"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_b1758acd","line":10128,"range":{"start_line":10126,"start_character":1,"end_line":10128,"end_character":1},"in_reply_to":"5f2577a7_0b542cfe","updated":"2017-09-14 22:44:26.000000000","message":"Changed my mind. The test above doesn\u0027t hit the get_minimum_version call which is why I didn\u0027t need to add the mock there.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":10123,"context_line":"        fake_volume \u003d {\u0027id\u0027: \u0027fake-volume-id\u0027}"},{"line_number":10124,"context_line":""},{"line_number":10125,"context_line":"        with test.nested("},{"line_number":10126,"context_line":"            mock.patch.object(objects.Service, \u0027get_minimum_version\u0027,"},{"line_number":10127,"context_line":"                              return_value\u003d23),"},{"line_number":10128,"context_line":"            mock.patch.object(cinder.API, \u0027get\u0027, return_value\u003dfake_volume),"},{"line_number":10129,"context_line":"            mock.patch.object(cinder.API, \u0027check_availability_zone\u0027),"},{"line_number":10130,"context_line":"            mock.patch.object(cinder.API, \u0027attachment_create\u0027,"},{"line_number":10131,"context_line":"                              return_value\u003d{\u0027id\u0027: uuids.attachment_id}),"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_0b542cfe","line":10128,"range":{"start_line":10126,"start_character":1,"end_line":10128,"end_character":1},"in_reply_to":"5f2577a7_498da4d1","updated":"2017-09-14 20:52:30.000000000","message":"Done","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":10115,"context_line":"            self.assertEqual(a[2].device_name, \u0027/dev/vdb\u0027)"},{"line_number":10116,"context_line":"            self.assertEqual(a[2].volume_id, uuids.volume_id)"},{"line_number":10117,"context_line":""},{"line_number":10118,"context_line":"    def test_attach_volume_new_flow(self):"},{"line_number":10119,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict("},{"line_number":10120,"context_line":"                {\u0027source_type\u0027: \u0027volume\u0027, \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":10121,"context_line":"                 \u0027volume_id\u0027: uuids.volume_id, \u0027device_name\u0027: \u0027/dev/vdb\u0027})"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_e3a7414f","line":10118,"range":{"start_line":10118,"start_character":8,"end_line":10118,"end_character":35},"updated":"2017-12-01 21:44:51.000000000","message":"Isn\u0027t this basically already tested in test_compute_api? Looks very similar.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"732864ba689333fe44dce6190c494ad7c2e744f7","unresolved":false,"context_lines":[{"line_number":10115,"context_line":"            self.assertEqual(a[2].device_name, \u0027/dev/vdb\u0027)"},{"line_number":10116,"context_line":"            self.assertEqual(a[2].volume_id, uuids.volume_id)"},{"line_number":10117,"context_line":""},{"line_number":10118,"context_line":"    def test_attach_volume_new_flow(self):"},{"line_number":10119,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict("},{"line_number":10120,"context_line":"                {\u0027source_type\u0027: \u0027volume\u0027, \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":10121,"context_line":"                 \u0027volume_id\u0027: uuids.volume_id, \u0027device_name\u0027: \u0027/dev/vdb\u0027})"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_b47dccb2","line":10118,"range":{"start_line":10118,"start_character":8,"end_line":10118,"end_character":35},"in_reply_to":"df87a7cf_d89f83b2","updated":"2017-12-04 16:33:25.000000000","message":"We don\u0027t need to remove old tests or anything, but we don\u0027t need to duplicate new tests for the new flow between test_compute_api and test_compute. In general, test_compute is somewhat considered \u0027legacy\u0027 due to bloat and scope, so things that test just the API (and not the compute manager) are in test_compute_api, and things for just the compute manager are in test_compute_mgr. Sometimes we have coverage for the API or manager in only test_compute, in which case I think it\u0027s OK to duplicate the old test and write the new flow in test_compute, but if there is coverage for an old flow in test_compute_api or test_compute_mgr, then let\u0027s write the new flow test in those modules and not duplicate in test_compute.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":10115,"context_line":"            self.assertEqual(a[2].device_name, \u0027/dev/vdb\u0027)"},{"line_number":10116,"context_line":"            self.assertEqual(a[2].volume_id, uuids.volume_id)"},{"line_number":10117,"context_line":""},{"line_number":10118,"context_line":"    def test_attach_volume_new_flow(self):"},{"line_number":10119,"context_line":"        fake_bdm \u003d fake_block_device.FakeDbBlockDeviceDict("},{"line_number":10120,"context_line":"                {\u0027source_type\u0027: \u0027volume\u0027, \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":10121,"context_line":"                 \u0027volume_id\u0027: uuids.volume_id, \u0027device_name\u0027: \u0027/dev/vdb\u0027})"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_d89f83b2","line":10118,"range":{"start_line":10118,"start_character":8,"end_line":10118,"end_character":35},"in_reply_to":"df87a7cf_e3a7414f","updated":"2017-12-02 15:34:30.000000000","message":"It\u0027s true for the test above too then with the old flow. I\u0027m happy to consolidate, I honestly started to get lost in what\u0027s tested where... I just wanted to have the same coverage for both flows.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":10313,"context_line":"                 \u0027device_type\u0027: \u0027cdrom\u0027,"},{"line_number":10314,"context_line":"                 \u0027disk_bus\u0027: \u0027ide\u0027,"},{"line_number":10315,"context_line":"                 \u0027instance_uuid\u0027: instance.uuid}))"},{"line_number":10316,"context_line":"        fake_bdm.attachment_id \u003d uuids.attachment_id"},{"line_number":10317,"context_line":"        with test.nested("},{"line_number":10318,"context_line":"             mock.patch.object(compute_api.API,"},{"line_number":10319,"context_line":"                               \u0027_create_volume_bdm\u0027,"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_030d853d","line":10316,"range":{"start_line":10316,"start_character":8,"end_line":10316,"end_character":52},"updated":"2017-12-01 21:44:51.000000000","message":"This wouldn\u0027t be set before we call _check_attach_and_reserve_volume since _check_attach_and_reserve_volume is what sets it.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":10313,"context_line":"                 \u0027device_type\u0027: \u0027cdrom\u0027,"},{"line_number":10314,"context_line":"                 \u0027disk_bus\u0027: \u0027ide\u0027,"},{"line_number":10315,"context_line":"                 \u0027instance_uuid\u0027: instance.uuid}))"},{"line_number":10316,"context_line":"        fake_bdm.attachment_id \u003d uuids.attachment_id"},{"line_number":10317,"context_line":"        with test.nested("},{"line_number":10318,"context_line":"             mock.patch.object(compute_api.API,"},{"line_number":10319,"context_line":"                               \u0027_create_volume_bdm\u0027,"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_f86287d8","line":10316,"range":{"start_line":10316,"start_character":8,"end_line":10316,"end_character":52},"in_reply_to":"df87a7cf_030d853d","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0e804d662079a28e8dbbdc718aa7de95a6e07083","unresolved":false,"context_lines":[{"line_number":472,"context_line":"            mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":473,"context_line":"                              \u0027destroy\u0027)"},{"line_number":474,"context_line":"        ) as (mock_attach, mock_attachment_delete, mock_destroy):"},{"line_number":475,"context_line":"            mock_attach.side_effect \u003d fake_attach"},{"line_number":476,"context_line":"            self.assertRaises("},{"line_number":477,"context_line":"                    test.TestingException, self.compute.attach_volume,"},{"line_number":478,"context_line":"                    self.context, instance, fake_bdm)"}],"source_content_type":"text/x-python","patch_set":175,"id":"df87a7cf_508d15d1","line":475,"updated":"2017-12-07 11:07:03.000000000","message":"This can be simplified by saying:\nmock_attach.side_effect \u003d expected_exception\n\nThen the fake_attach function is not needed","commit_id":"2f6562ffb9c01453f6e6b83cf4c8b314c7cc062d"}],"nova/tests/unit/compute/test_compute_api.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"63abce4faf6337957ae3b17e6098181507f38469","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            return 0"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attach_version\u0027,"},{"line_number":80,"context_line":"                      fake_attach_version)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        self.compute_api \u003d compute_api.API()"},{"line_number":83,"context_line":"        self.context \u003d context.RequestContext(self.user_id,"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba2be162_5cb2f64c","line":80,"range":{"start_line":80,"start_character":22,"end_line":80,"end_character":41},"updated":"2017-03-06 08:54:03.000000000","message":"ditto","commit_id":"d5b9bd8c34bd785652db7d2425c0aaf63483fd3c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        self.assertTrue(bdm_create.called)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    @mock.patch.object(compute_rpcapi.ComputeAPI, \u0027reserve_block_device_name\u0027)"},{"line_number":374,"context_line":"    @mock.patch.object(objects.Service, \u0027get_minimum_version\u0027,"},{"line_number":375,"context_line":"                       return_value\u003d22)"},{"line_number":376,"context_line":"    @mock.patch.object(compute_rpcapi.ComputeAPI, \u0027attach_volume\u0027)"},{"line_number":377,"context_line":"    def test_attach_volume(self, mock_attach, mock_get_min_ver, mock_reserve):"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_a3e021fc","line":374,"updated":"2017-07-21 02:24:43.000000000","message":"Same comments as in the other tests - leave the old style attachment tests alone, and write new tests for the new style attachment flows as necessary.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":448,"context_line":"    @mock.patch.object(compute_api.API, \u0027_record_action_start\u0027)"},{"line_number":449,"context_line":"    @mock.patch.object(compute_rpcapi.ComputeAPI, \u0027reserve_block_device_name\u0027)"},{"line_number":450,"context_line":"    @mock.patch.object(objects.Service, \u0027get_minimum_version\u0027,"},{"line_number":451,"context_line":"                       return_value\u003d24)"},{"line_number":452,"context_line":"    @mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":453,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":454,"context_line":"                       \u0027get_by_volume_and_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_a30a9987","line":451,"range":{"start_line":451,"start_character":36,"end_line":451,"end_character":38},"updated":"2017-12-01 21:44:51.000000000","message":"Suggest using the variable from the compute API code so you don\u0027t have to rev this if you need to rebase and the version has changed.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":448,"context_line":"    @mock.patch.object(compute_api.API, \u0027_record_action_start\u0027)"},{"line_number":449,"context_line":"    @mock.patch.object(compute_rpcapi.ComputeAPI, \u0027reserve_block_device_name\u0027)"},{"line_number":450,"context_line":"    @mock.patch.object(objects.Service, \u0027get_minimum_version\u0027,"},{"line_number":451,"context_line":"                       return_value\u003d24)"},{"line_number":452,"context_line":"    @mock.patch(\u0027nova.volume.cinder.is_microversion_supported\u0027)"},{"line_number":453,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":454,"context_line":"                       \u0027get_by_volume_and_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_d8ed4326","line":451,"range":{"start_line":451,"start_character":36,"end_line":451,"end_character":38},"in_reply_to":"df87a7cf_a30a9987","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":570,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":571,"context_line":"                       \u0027get_by_volume_and_instance\u0027)"},{"line_number":572,"context_line":"    @mock.patch.object(compute_rpcapi.ComputeAPI, \u0027attach_volume\u0027)"},{"line_number":573,"context_line":"    def test_attach_volume_reserve_fails_new_flow(self, mock_attach, mock_bdm,"},{"line_number":574,"context_line":"                                                  mock_cinder_mv_supported,"},{"line_number":575,"context_line":"                                                  mock_get_min_ver,"},{"line_number":576,"context_line":"                                                  mock_reserve):"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_43e94d7e","line":573,"range":{"start_line":573,"start_character":27,"end_line":573,"end_character":34},"updated":"2017-12-01 21:44:51.000000000","message":"We don\u0027t call reserve with the new flow, we call attachment_create.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":570,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping,"},{"line_number":571,"context_line":"                       \u0027get_by_volume_and_instance\u0027)"},{"line_number":572,"context_line":"    @mock.patch.object(compute_rpcapi.ComputeAPI, \u0027attach_volume\u0027)"},{"line_number":573,"context_line":"    def test_attach_volume_reserve_fails_new_flow(self, mock_attach, mock_bdm,"},{"line_number":574,"context_line":"                                                  mock_cinder_mv_supported,"},{"line_number":575,"context_line":"                                                  mock_get_min_ver,"},{"line_number":576,"context_line":"                                                  mock_reserve):"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_98f7bbf6","line":573,"range":{"start_line":573,"start_character":27,"end_line":573,"end_character":34},"in_reply_to":"df87a7cf_43e94d7e","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":2548,"context_line":"        @mock.patch.object(self.compute_api.volume_api, \u0027reserve_volume\u0027,"},{"line_number":2549,"context_line":"                           side_effect\u003dfake_vol_api_reserve)"},{"line_number":2550,"context_line":"        @mock.patch.object(self.compute_api,"},{"line_number":2551,"context_line":"                           \u0027_check_volume_already_attached_to_instance\u0027,"},{"line_number":2552,"context_line":"                           side_effect\u003dfake_volume_is_attached)"},{"line_number":2553,"context_line":"        @mock.patch.object(self.compute_api.volume_api, \u0027attachment_create\u0027,"},{"line_number":2554,"context_line":"                           side_effect\u003dfake_vol_api_attachment_create)"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_c3f23d9b","line":2551,"range":{"start_line":2551,"start_character":28,"end_line":2551,"end_character":70},"updated":"2017-12-01 21:44:51.000000000","message":"We need to have a test where this fails during swap volume in the API to assert that we (1) checked this and (2) rolled back the detaching status on the old volume.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":2548,"context_line":"        @mock.patch.object(self.compute_api.volume_api, \u0027reserve_volume\u0027,"},{"line_number":2549,"context_line":"                           side_effect\u003dfake_vol_api_reserve)"},{"line_number":2550,"context_line":"        @mock.patch.object(self.compute_api,"},{"line_number":2551,"context_line":"                           \u0027_check_volume_already_attached_to_instance\u0027,"},{"line_number":2552,"context_line":"                           side_effect\u003dfake_volume_is_attached)"},{"line_number":2553,"context_line":"        @mock.patch.object(self.compute_api.volume_api, \u0027attachment_create\u0027,"},{"line_number":2554,"context_line":"                           side_effect\u003dfake_vol_api_attachment_create)"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_b8363fb4","line":2551,"range":{"start_line":2551,"start_character":28,"end_line":2551,"end_character":70},"in_reply_to":"df87a7cf_c3f23d9b","updated":"2017-12-02 15:34:30.000000000","message":"I get it, but this test already makes me cry just by looking at it. :(","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a32f6d365cf0df2a8ff45a5c8316677efb2132b","unresolved":false,"context_lines":[{"line_number":2560,"context_line":"                           side_effect\u003dfake_vol_api_begin_detaching)"},{"line_number":2561,"context_line":"        def _do_test(mock_begin_detaching, mock_get_by_volume_and_instance,"},{"line_number":2562,"context_line":"                     mock_roll_detaching, mock_attachment_create,"},{"line_number":2563,"context_line":"                     mock_check_volume_attached, mock_reserve_volume,"},{"line_number":2564,"context_line":"                     mock_attachment_delete, mock_unreserve_volume,"},{"line_number":2565,"context_line":"                     mock_swap_volume, mock_record):"},{"line_number":2566,"context_line":""}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_1e4abc26","line":2563,"range":{"start_line":2563,"start_character":21,"end_line":2563,"end_character":47},"updated":"2017-12-01 21:52:07.000000000","message":"If attachment_id is not None, you should assert that this was called.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":2560,"context_line":"                           side_effect\u003dfake_vol_api_begin_detaching)"},{"line_number":2561,"context_line":"        def _do_test(mock_begin_detaching, mock_get_by_volume_and_instance,"},{"line_number":2562,"context_line":"                     mock_roll_detaching, mock_attachment_create,"},{"line_number":2563,"context_line":"                     mock_check_volume_attached, mock_reserve_volume,"},{"line_number":2564,"context_line":"                     mock_attachment_delete, mock_unreserve_volume,"},{"line_number":2565,"context_line":"                     mock_swap_volume, mock_record):"},{"line_number":2566,"context_line":""}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_38730f83","line":2563,"range":{"start_line":2563,"start_character":21,"end_line":2563,"end_character":47},"in_reply_to":"df87a7cf_1e4abc26","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":3899,"context_line":"                                                     mock_get,"},{"line_number":3900,"context_line":"                                                     mock_get_min_ver):"},{"line_number":3901,"context_line":"        # Tests that an InvalidInput exception raised from"},{"line_number":3902,"context_line":"        # volume_api.reserve_volume due to the volume status not being"},{"line_number":3903,"context_line":"        # \u0027available\u0027 results in _validate_bdm re-raising InvalidVolume."},{"line_number":3904,"context_line":"        instance \u003d self._create_instance_obj()"},{"line_number":3905,"context_line":"        instance_type \u003d self._create_flavor()"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_c3479dbc","line":3902,"range":{"start_line":3902,"start_character":10,"end_line":3902,"end_character":35},"updated":"2017-12-01 21:44:51.000000000","message":"We don\u0027t call reserve_volume in this case, we call attachment_create.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":3899,"context_line":"                                                     mock_get,"},{"line_number":3900,"context_line":"                                                     mock_get_min_ver):"},{"line_number":3901,"context_line":"        # Tests that an InvalidInput exception raised from"},{"line_number":3902,"context_line":"        # volume_api.reserve_volume due to the volume status not being"},{"line_number":3903,"context_line":"        # \u0027available\u0027 results in _validate_bdm re-raising InvalidVolume."},{"line_number":3904,"context_line":"        instance \u003d self._create_instance_obj()"},{"line_number":3905,"context_line":"        instance_type \u003d self._create_flavor()"}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_f8e5a739","line":3902,"range":{"start_line":3902,"start_character":10,"end_line":3902,"end_character":35},"in_reply_to":"df87a7cf_c3479dbc","updated":"2017-12-02 15:34:30.000000000","message":"Done","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"669f6f260a35fa9d7331ef26ac4a198b2b006cb9","unresolved":false,"context_lines":[{"line_number":4023,"context_line":"    @mock.patch.object(cinder.API, \u0027check_availability_zone\u0027)"},{"line_number":4024,"context_line":"    @mock.patch.object(cinder.API, \u0027attachment_create\u0027,"},{"line_number":4025,"context_line":"                       side_effect\u003dexception.InvalidInput(reason\u003d\u0027error\u0027))"},{"line_number":4026,"context_line":"    def test_provision_instances_with_error_volume_new_flow(self,"},{"line_number":4027,"context_line":"        mock_cinder_check_av_zone, mock_attach_create, mock_get,"},{"line_number":4028,"context_line":"        mock_get_min_ver):"},{"line_number":4029,"context_line":"        self._test_provision_instances_with_cinder_error("}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_a37db9e8","line":4026,"range":{"start_line":4026,"start_character":8,"end_line":4026,"end_character":59},"updated":"2017-12-01 21:44:51.000000000","message":"Isn\u0027t this testing the same thing as test_validate_bdm_with_error_volume_new_flow?","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"4f8ff80c95c3889bf901a86feb38be5d259756da","unresolved":false,"context_lines":[{"line_number":4023,"context_line":"    @mock.patch.object(cinder.API, \u0027check_availability_zone\u0027)"},{"line_number":4024,"context_line":"    @mock.patch.object(cinder.API, \u0027attachment_create\u0027,"},{"line_number":4025,"context_line":"                       side_effect\u003dexception.InvalidInput(reason\u003d\u0027error\u0027))"},{"line_number":4026,"context_line":"    def test_provision_instances_with_error_volume_new_flow(self,"},{"line_number":4027,"context_line":"        mock_cinder_check_av_zone, mock_attach_create, mock_get,"},{"line_number":4028,"context_line":"        mock_get_min_ver):"},{"line_number":4029,"context_line":"        self._test_provision_instances_with_cinder_error("}],"source_content_type":"text/x-python","patch_set":165,"id":"df87a7cf_f8be07fe","line":4026,"range":{"start_line":4026,"start_character":8,"end_line":4026,"end_character":59},"in_reply_to":"df87a7cf_a37db9e8","updated":"2017-12-02 15:34:30.000000000","message":"Well, one is testing the _validate_bdm call directly, while the other is testing _provision_instances. Same coverage as the old flow.","commit_id":"507e58841f89de9b99209de7af4d2788783ba1ed"}],"nova/tests/unit/fake_block_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        bdm_dict \u003d bdm_dict or {}"},{"line_number":41,"context_line":"        db_id \u003d bdm_dict.pop(\u0027id\u0027, 1)"},{"line_number":42,"context_line":"        instance_uuid \u003d bdm_dict.pop(\u0027instance_uuid\u0027, uuids.fake)"},{"line_number":43,"context_line":"        attachment_id \u003d bdm_dict.pop(\u0027attachment_id\u0027, uuids.attachment_id)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        super(FakeDbBlockDeviceDict, self).__init__(bdm_dict\u003dbdm_dict,"},{"line_number":46,"context_line":"                                                    **kwargs)"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_e3a4d9bb","line":43,"range":{"start_line":43,"start_character":8,"end_line":43,"end_character":74},"updated":"2017-07-21 02:24:43.000000000","message":"This should not be a default. Pass an attachment_id kwarg if you need the fake bdm to come back with the attachment_id set to test new flows, but doing this changes a bunch of old flow tests which we should leave alone.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"18cc911c7678346eb59b637bc90463bb36806d42","unresolved":false,"context_lines":[{"line_number":17998,"context_line":"            \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":17999,"context_line":"            \u0027connection_info\u0027: \u0027{\"fake\": \"connection_info\",\u0027"},{"line_number":18000,"context_line":"                                 \u0027\"attachment_id\": \u0027"},{"line_number":18001,"context_line":"                                 \u0027\"\u0027 + str(uuids.attachment_id) + \u0027\"}\u0027})"},{"line_number":18002,"context_line":"        fake_bdm \u003d objects.BlockDeviceMapping(self.c, **fake_bdm)"},{"line_number":18003,"context_line":"        mock_get_by_volume_and_instance.return_value \u003d fake_bdm"},{"line_number":18004,"context_line":""}],"source_content_type":"text/x-python","patch_set":58,"id":"5f201791_d25f2070","line":18001,"updated":"2017-06-23 15:44:06.000000000","message":"uuids.attachment_id is already a string. Was there a reason you needed to add str() here?","commit_id":"aa34ffc7cefa9bd7d3d42f1742ed01119aa0b6a0"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"077cb02af598f6695a0683cb8d28a669c8b6017c","unresolved":false,"context_lines":[{"line_number":17998,"context_line":"            \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":17999,"context_line":"            \u0027connection_info\u0027: \u0027{\"fake\": \"connection_info\",\u0027"},{"line_number":18000,"context_line":"                                 \u0027\"attachment_id\": \u0027"},{"line_number":18001,"context_line":"                                 \u0027\"\u0027 + str(uuids.attachment_id) + \u0027\"}\u0027})"},{"line_number":18002,"context_line":"        fake_bdm \u003d objects.BlockDeviceMapping(self.c, **fake_bdm)"},{"line_number":18003,"context_line":"        mock_get_by_volume_and_instance.return_value \u003d fake_bdm"},{"line_number":18004,"context_line":""}],"source_content_type":"text/x-python","patch_set":58,"id":"5f201791_deaba786","line":18001,"in_reply_to":"5f201791_d25f2070","updated":"2017-06-23 16:41:30.000000000","message":"Done","commit_id":"aa34ffc7cefa9bd7d3d42f1742ed01119aa0b6a0"}],"nova/tests/unit/virt/libvirt/volume/test_iscsi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            mock_LOG_warning):"},{"line_number":46,"context_line":"        device_path \u003d \u0027/dev/fake-dev\u0027"},{"line_number":47,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: device_path,"},{"line_number":48,"context_line":"                                    \u0027target_lun\u0027: 1}}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        libvirt_driver \u003d iscsi.LibvirtISCSIVolumeDriver(self.fake_host)"},{"line_number":51,"context_line":"        libvirt_driver.connector.disconnect_volume \u003d mock.MagicMock("}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_a3aee195","line":48,"updated":"2017-07-21 02:24:43.000000000","message":"Why did this need to change?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            mock_LOG_warning):"},{"line_number":46,"context_line":"        device_path \u003d \u0027/dev/fake-dev\u0027"},{"line_number":47,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: device_path,"},{"line_number":48,"context_line":"                                    \u0027target_lun\u0027: 1}}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        libvirt_driver \u003d iscsi.LibvirtISCSIVolumeDriver(self.fake_host)"},{"line_number":51,"context_line":"        libvirt_driver.connector.disconnect_volume \u003d mock.MagicMock("}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_cf6fb790","line":48,"in_reply_to":"1f1a1f67_a3aee195","updated":"2017-07-21 08:14:39.000000000","message":"We have a \u0027target_lun\u0027 cast to int due to some unfortunate changes on the Cinder side using OVO. As the brick release got delayed I added the cast to the Nova code to get it operational until we wait.\n\nI will double check and remove this if the brick release got sorted out.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"bd780c5b4db556ca464063193df600be7a41e69e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            mock_LOG_warning):"},{"line_number":46,"context_line":"        device_path \u003d \u0027/dev/fake-dev\u0027"},{"line_number":47,"context_line":"        connection_info \u003d {\u0027data\u0027: {\u0027device_path\u0027: device_path,"},{"line_number":48,"context_line":"                                    \u0027target_lun\u0027: 1}}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        libvirt_driver \u003d iscsi.LibvirtISCSIVolumeDriver(self.fake_host)"},{"line_number":51,"context_line":"        libvirt_driver.connector.disconnect_volume \u003d mock.MagicMock("}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_dd752dce","line":48,"in_reply_to":"1f1a1f67_cf6fb790","updated":"2017-07-21 09:26:52.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"}],"nova/tests/unit/virt/test_block_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":96,"context_line":"         \u0027destination_type\u0027: \u0027volume\u0027,"},{"line_number":97,"context_line":"         \u0027volume_id\u0027: \u0027fake-volume-id-1\u0027,"},{"line_number":98,"context_line":"         \u0027guest_format\u0027: \u0027ext4\u0027,"},{"line_number":99,"context_line":"         \u0027connection_info\u0027: \u0027{\"fake\": \"connection_info\",\u0027"},{"line_number":100,"context_line":"                              \u0027\"attachment_id\": \u0027"},{"line_number":101,"context_line":"                              \u0027\"\u0027 + uuids.attachment_id + \u0027\"}\u0027,"},{"line_number":102,"context_line":"         \u0027delete_on_termination\u0027: False,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_a3870110","line":99,"updated":"2017-07-21 02:24:43.000000000","message":"Why does this all need to change? Why is the attachment_id in the connection_info? I thought when we got an attachment, it was the attachment record body with a connection_info field that had the normal old style connection_info stuff we\u0027ve always used?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"}],"nova/virt/block_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":304,"context_line":"            except Exception:"},{"line_number":305,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":306,"context_line":"                    if do_driver_attach:"},{"line_number":307,"context_line":"                        try:"},{"line_number":308,"context_line":"                            virt_driver.detach_volume(connection_info,"},{"line_number":309,"context_line":"                                                      instance,"},{"line_number":310,"context_line":"                                                      self[\u0027mount_device\u0027],"},{"line_number":311,"context_line":"                                                      encryption\u003dencryption)"},{"line_number":312,"context_line":"                        except Exception:"},{"line_number":313,"context_line":"                            LOG.warning(_LW(\"Driver failed to detach volume \""},{"line_number":314,"context_line":"                                         \"%(volume_id)s at %(mount_point)s.\"),"},{"line_number":315,"context_line":"                                     {\u0027volume_id\u0027: volume_id,"},{"line_number":316,"context_line":"                                      \u0027mount_point\u0027: self[\u0027mount_device\u0027]},"},{"line_number":317,"context_line":"                                     exc_info\u003dTrue, context\u003dcontext,"},{"line_number":318,"context_line":"                                     instance\u003dinstance)"},{"line_number":319,"context_line":"                    volume_api.terminate_connection(context, volume_id,"},{"line_number":320,"context_line":"                                                    connector)"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_ee03d20d","side":"PARENT","line":318,"range":{"start_line":307,"start_character":24,"end_line":318,"end_character":55},"updated":"2016-06-20 16:58:02.000000000","message":"At first I thought we needed to call this from somewhere, but this is really here because in the existing code we attach via the virt driver first, and if that works then we call attach in the cinder API, and if that fails then we need to rollback the attachment from the virt driver (os-brick). But now we\u0027re doing the cinder attach API first, then the virt driver (os-brick) attach, and if that fails then we\u0027re assuming (I guess) that we don\u0027t need to call detach on the driver. If that is a problem, then the compute driver\u0027s attach_volume method probably needs to be doing a better job of cleaning up after itself on a failure.","commit_id":"545d8d8666389f33601b0b003dec844004694919"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d0c63256acbc28e9b368455b2fdad60e9b384f6e","unresolved":false,"context_lines":[{"line_number":304,"context_line":"            except Exception:"},{"line_number":305,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":306,"context_line":"                    if do_driver_attach:"},{"line_number":307,"context_line":"                        try:"},{"line_number":308,"context_line":"                            virt_driver.detach_volume(connection_info,"},{"line_number":309,"context_line":"                                                      instance,"},{"line_number":310,"context_line":"                                                      self[\u0027mount_device\u0027],"},{"line_number":311,"context_line":"                                                      encryption\u003dencryption)"},{"line_number":312,"context_line":"                        except Exception:"},{"line_number":313,"context_line":"                            LOG.warning(_LW(\"Driver failed to detach volume \""},{"line_number":314,"context_line":"                                         \"%(volume_id)s at %(mount_point)s.\"),"},{"line_number":315,"context_line":"                                     {\u0027volume_id\u0027: volume_id,"},{"line_number":316,"context_line":"                                      \u0027mount_point\u0027: self[\u0027mount_device\u0027]},"},{"line_number":317,"context_line":"                                     exc_info\u003dTrue, context\u003dcontext,"},{"line_number":318,"context_line":"                                     instance\u003dinstance)"},{"line_number":319,"context_line":"                    volume_api.terminate_connection(context, volume_id,"},{"line_number":320,"context_line":"                                                    connector)"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_d216c74a","side":"PARENT","line":318,"range":{"start_line":307,"start_character":24,"end_line":318,"end_character":55},"in_reply_to":"5a9d85d2_ee03d20d","updated":"2016-06-25 15:02:44.000000000","message":"Shouldn\u0027t this be part of the cleanup?","commit_id":"545d8d8666389f33601b0b003dec844004694919"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":273,"context_line":"        try:"},{"line_number":274,"context_line":"            attach_info \u003d volume_api.create_attachment(context,"},{"line_number":275,"context_line":"                                                       volume_id,"},{"line_number":276,"context_line":"                                                       connector,"},{"line_number":277,"context_line":"                                                       instance.uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_4e7946fc","line":274,"range":{"start_line":274,"start_character":12,"end_line":274,"end_character":23},"updated":"2016-06-20 16:58:02.000000000","message":"suggestion: you could avoid some churn in here if you leave this as connection_info (as the variable name).","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":273,"context_line":"        try:"},{"line_number":274,"context_line":"            attach_info \u003d volume_api.create_attachment(context,"},{"line_number":275,"context_line":"                                                       volume_id,"},{"line_number":276,"context_line":"                                                       connector,"},{"line_number":277,"context_line":"                                                       instance.uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_bf6d7634","line":274,"range":{"start_line":274,"start_character":12,"end_line":274,"end_character":23},"in_reply_to":"5a9d85d2_4e7946fc","updated":"2016-06-20 17:45:52.000000000","message":"Done","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                                                       self[\u0027mount_device\u0027])"},{"line_number":279,"context_line":"        except Exception:"},{"line_number":280,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":281,"context_line":"                self._cleanup_failed_attach(context, volume_id,"},{"line_number":282,"context_line":"                                            volume_api,"},{"line_number":283,"context_line":"                                            connector,"},{"line_number":284,"context_line":"                                            instance.uuid,"},{"line_number":285,"context_line":"                                            self[\u0027mount_device\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_6eec02c8","line":282,"range":{"start_line":281,"start_character":53,"end_line":282,"end_character":55},"updated":"2016-06-20 16:58:02.000000000","message":"These args have to be reversed.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                                                       self[\u0027mount_device\u0027])"},{"line_number":279,"context_line":"        except Exception:"},{"line_number":280,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":281,"context_line":"                self._cleanup_failed_attach(context, volume_id,"},{"line_number":282,"context_line":"                                            volume_api,"},{"line_number":283,"context_line":"                                            connector,"},{"line_number":284,"context_line":"                                            instance.uuid,"},{"line_number":285,"context_line":"                                            self[\u0027mount_device\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_ffe53ea8","line":282,"range":{"start_line":281,"start_character":53,"end_line":282,"end_character":55},"in_reply_to":"5a9d85d2_6eec02c8","updated":"2016-06-20 17:45:52.000000000","message":"Done","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                context, volume_api, volume_id, attach_info)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"            try:"},{"line_number":297,"context_line":"                virt_driver.attach_volume("},{"line_number":298,"context_line":"                        context, attach_info, instance,"},{"line_number":299,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":300,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_4e63061b","line":297,"updated":"2016-06-20 16:58:02.000000000","message":"We\u0027ve now switched the order of the attaches, we used to attach via the virt driver first (which calls connect_volume() in os-brick), and now we\u0027re attaching in cinder first. Does that make a difference? Probably not, because create_attachment is needed first to get the connection info that the driver needs, and also updates the state in the cinder database.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                context, volume_api, volume_id, attach_info)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"            try:"},{"line_number":297,"context_line":"                virt_driver.attach_volume("},{"line_number":298,"context_line":"                        context, attach_info, instance,"},{"line_number":299,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":300,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_7f04ad14","line":297,"in_reply_to":"5a9d85d2_4e63061b","updated":"2016-06-20 17:45:52.000000000","message":"So WRT this and the comment on the removal.  I need to spend a bit more time on the cleanup.  It is my opinion that it would be nice to keep the ordering here and isolate the cleanup to the side that fails.  So in this case, if the Cinder call succeeds, but the follow up calls in Nova fail, we should handle everything related to that on the Nova side and then if we have to issue a detach back to Cinder.\n\nDoes that make sense?  And does it address some of what you\u0027re thinking about?","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"d0c63256acbc28e9b368455b2fdad60e9b384f6e","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                context, volume_api, volume_id, attach_info)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"            try:"},{"line_number":297,"context_line":"                virt_driver.attach_volume("},{"line_number":298,"context_line":"                        context, attach_info, instance,"},{"line_number":299,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":300,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_7270b3a4","line":297,"in_reply_to":"5a9d85d2_7f04ad14","updated":"2016-06-25 15:02:44.000000000","message":"In the sense that initialize_connection is part of the new create_attachment call and the plans were to create the DB record for the attachment on Cinder at initialize time the flow looks ok here.\n\nThe cleanup strategy also sounds good.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"b75e9f92c25282c90e36dbe11ed735049f3d8046","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                    # happen, the detach request will be ignored."},{"line_number":321,"context_line":"                    volume_api.detach(context, volume_id)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    def _volume_attach(self, context, volume, connector, instance,"},{"line_number":324,"context_line":"                       volume_api, virt_driver,"},{"line_number":325,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":326,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba2be162_ef64a34a","line":323,"updated":"2017-02-28 22:57:03.000000000","message":"There\u0027s an interesting side effect to this new flow. In the old flow, you would know when the attachment is complete by querying cinder and seeing that the attachment is there; the attach update in Cinder was done after libvirt made the attachment. (it\u0027s not great that you needed to ask Cinder for completion status, but I think that\u0027s how it worked). \n\nNow the attachment info is updated before libvirt makes the attachment. So if you check if the disk is attached by querying the instance\u0027s OS (via ssh), that check will fail if it\u0027s done soon after the attach info appears in instance[\u0027\u0027os-extended-volumes:volumes_attached\u0027] and in cinder_vol.attachments. (I wrote a script to do that and it started failing after I applied this patch).\n\nI suppose this change could introduce an incompatibility with existing scripts if they were using the cinder attach info to determine whether to move on after the attachment was complete, though I don\u0027t know how serious this would really be.\n\nIs there another way to deterministically know when the attach has been completed by libvirt? (It\u0027s very possible that I might be missing something. And that status would be best to come from nova, not cinder.)","commit_id":"d5b9bd8c34bd785652db7d2425c0aaf63483fd3c"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"32f7e73232dcacc3743f9aa46464e7667593c58f","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                    # happen, the detach request will be ignored."},{"line_number":321,"context_line":"                    volume_api.detach(context, volume_id)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    def _volume_attach(self, context, volume, connector, instance,"},{"line_number":324,"context_line":"                       volume_api, virt_driver,"},{"line_number":325,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":326,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":35,"id":"ff0f0b1f_2e41d8a9","line":323,"in_reply_to":"ba2be162_a2bb7971","updated":"2017-05-25 01:59:07.000000000","message":"It actually works the same as in the past, the attachment process for completion actually is in Nova\u0027s hands.  Once the initialize connection info is returned to nova and it does it\u0027s thing through brick it send the info to Cinder saying attach (which just updates the db on the cinder side).  We do modify that a bit if you use the condensed call and just leave it to Nova (ie we initialize, return the connection info and mark as attached all at once). \n\nIf Nova has problems, we assume it\u0027s Nova\u0027s responsibility to go back to cinder and delete the attachment.  We\u0027ve had this conversation quite a few times, but it\u0027s been a VERY LONG journey.  I think there\u0027s a note in john\u0027s spec pointing this out, but if not I should update that and also I still owe everyone an update to the Cinder docs to clarify a lot of this flow I think.","commit_id":"d5b9bd8c34bd785652db7d2425c0aaf63483fd3c"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"ab8b0e811150cd339db19206b17f709cf748b6a8","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                    # happen, the detach request will be ignored."},{"line_number":321,"context_line":"                    volume_api.detach(context, volume_id)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    def _volume_attach(self, context, volume, connector, instance,"},{"line_number":324,"context_line":"                       volume_api, virt_driver,"},{"line_number":325,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":326,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba2be162_a2bb7971","line":323,"in_reply_to":"ba2be162_ef64a34a","updated":"2017-03-01 16:54:34.000000000","message":"Never mind. If notifications are used, this isn\u0027t an issue.","commit_id":"d5b9bd8c34bd785652db7d2425c0aaf63483fd3c"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"4259dad6126a6fb3c497e1aa494a5083b8bb7ff7","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":453,"context_line":"            LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":454,"context_line":"                      existing_attach_id)"},{"line_number":455,"context_line":"            attachment_ref \u003d volume_api.attachment_update("},{"line_number":456,"context_line":"                context, existing_attach_id, connector)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"            connection_info_string \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":36,"id":"ff0f0b1f_7471eca7","line":455,"updated":"2017-05-24 20:05:36.000000000","message":"i found that attachment_ref has this in it:\n\nu\u0027target_lun\u0027: u\u00271\u0027\n\ncinder attachment_update returns this as an integer, but thru the oslo message system, was turned into a string when nova gets it here.\n\nThe problem is that later on, os_brick throws an exception as it is expecting an integer for this value.\n\nFile \"/opt/stack/nova/nova/virt/libvirt/volume/iscsi.py\", line 67, in connect_volume\n  device_info \u003d self.connector.connect_volume(connection_info)\n...\nFile \"/usr/local/lib/python2.7/dist-packages/os_brick/initiator/linuxscsi.py\", line 433, in process_lun_id\n  processed \u003d self._format_lun_id(lun_ids)\nFile \"/usr/local/lib/python2.7/dist-packages/os_brick/initiator/linuxscsi.py\", line 441, in _format_lun_id\n  (lun_id \u0026 0xffff, lun_id \u003e\u003e 16 \u0026 0xffff))\nTypeError: unsupported operand type(s) for \u0026: \u0027unicode\u0027 and \u0027int\u0027\n\n\nOnce I converted the lun_id to a string, it worked OK. Not sure why this is different from the legacy case.","commit_id":"37f4e46b5c329ab1863c3b215251f8a99cbf5655"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"493a570bbb509781115529cc64d0fe60455e4aa9","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":453,"context_line":"            LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":454,"context_line":"                      existing_attach_id)"},{"line_number":455,"context_line":"            attachment_ref \u003d volume_api.attachment_update("},{"line_number":456,"context_line":"                context, existing_attach_id, connector)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"            connection_info_string \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":36,"id":"ff0f0b1f_cec25c53","line":455,"in_reply_to":"ff0f0b1f_54d38804","updated":"2017-05-25 01:52:27.000000000","message":"Yeah, that\u0027s the issue, I\u0027m unclear on why you see different results here though, with the last update I pushed I can attach volumes again and not seeing an error? :\n    https://hastebin.com/noxazafulu.rb","commit_id":"37f4e46b5c329ab1863c3b215251f8a99cbf5655"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"a9a2afe0faee835816ff80d67eabcf095c013940","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":453,"context_line":"            LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":454,"context_line":"                      existing_attach_id)"},{"line_number":455,"context_line":"            attachment_ref \u003d volume_api.attachment_update("},{"line_number":456,"context_line":"                context, existing_attach_id, connector)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"            connection_info_string \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":36,"id":"ff0f0b1f_f44dfc3a","line":455,"in_reply_to":"ff0f0b1f_7471eca7","updated":"2017-05-24 20:07:59.000000000","message":"typo in the above in the last paragraph, should have been:\n\nOnce I converted the lun_id to *an integer*, it worked OK. Not sure why this is different from the legacy case.","commit_id":"37f4e46b5c329ab1863c3b215251f8a99cbf5655"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"e7fe3e96d333bff9f18d16b726ed14c61e978f43","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":453,"context_line":"            LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":454,"context_line":"                      existing_attach_id)"},{"line_number":455,"context_line":"            attachment_ref \u003d volume_api.attachment_update("},{"line_number":456,"context_line":"                context, existing_attach_id, connector)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"            connection_info_string \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":36,"id":"ff0f0b1f_54d38804","line":455,"in_reply_to":"ff0f0b1f_f44dfc3a","updated":"2017-05-24 20:14:49.000000000","message":"I believe that is related to this bug:\n\nhttps://bugs.launchpad.net/cinder/+bug/1692153","commit_id":"37f4e46b5c329ab1863c3b215251f8a99cbf5655"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"e3775360052862a945e4861048d7943b1d311d18","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                                  {\u0027volume_id\u0027: volume_id,"},{"line_number":495,"context_line":"                                   \u0027mountpoint\u0027: self[\u0027mount_device\u0027]},"},{"line_number":496,"context_line":"                                  instance\u003dinstance)"},{"line_number":497,"context_line":"                    volume_api.remove_attachment(context,"},{"line_number":498,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":499,"context_line":"                                                 self[\u0027attachment_id\u0027])"},{"line_number":500,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"ff0f0b1f_d4d5581d","line":497,"updated":"2017-05-24 20:10:37.000000000","message":"There is no remove_attachment method. should be attachment_delete.","commit_id":"37f4e46b5c329ab1863c3b215251f8a99cbf5655"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"31be4f3e56fd171f5a4cba6e0d257ecfe71c9e8e","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                                   \u0027mountpoint\u0027: self[\u0027mount_device\u0027]},"},{"line_number":496,"context_line":"                                  instance\u003dinstance)"},{"line_number":497,"context_line":"                    volume_api.remove_attachment(context,"},{"line_number":498,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":499,"context_line":"                                                 self[\u0027attachment_id\u0027])"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"    @update_db"}],"source_content_type":"text/x-python","patch_set":36,"id":"ff0f0b1f_d491d848","line":498,"updated":"2017-05-24 20:13:54.000000000","message":"attachment_delete does not take a volume_id arg.","commit_id":"37f4e46b5c329ab1863c3b215251f8a99cbf5655"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"4d9b7a8de4bd86dfaa9ebc683136305cb2b923d8","unresolved":false,"context_lines":[{"line_number":531,"context_line":"                               virt_driver):"},{"line_number":532,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":533,"context_line":"        attachment_id \u003d self[\u0027connection_info\u0027][\u0027attachment_id\u0027]"},{"line_number":534,"context_line":"        return volume_api.update_attachment(context, attachment_id, connector)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    @update_db"},{"line_number":537,"context_line":"    def refresh_connection_info(self, context, instance,"}],"source_content_type":"text/x-python","patch_set":36,"id":"ff0f0b1f_0d01686a","line":534,"updated":"2017-05-25 14:25:38.000000000","message":"this method name does not exist, should be attachment_update(...)","commit_id":"37f4e46b5c329ab1863c3b215251f8a99cbf5655"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                       volume_api, virt_driver,"},{"line_number":366,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":367,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":368,"context_line":"        LOG.warning(_LW(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":369,"context_line":"                    \u0027shelved Instance.  Please update your cinder \u0027"},{"line_number":370,"context_line":"                    \u0027installation, or your configured API version.\u0027),"},{"line_number":371,"context_line":"                    volume_id, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_44762b72","line":368,"range":{"start_line":368,"start_character":20,"end_line":368,"end_character":23},"updated":"2017-05-25 03:14:21.000000000","message":"Can remove this marker.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                       volume_api, virt_driver,"},{"line_number":366,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":367,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":368,"context_line":"        LOG.warning(_LW(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":369,"context_line":"                    \u0027shelved Instance.  Please update your cinder \u0027"},{"line_number":370,"context_line":"                    \u0027installation, or your configured API version.\u0027),"},{"line_number":371,"context_line":"                    volume_id, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_00ca4a4e","line":368,"range":{"start_line":368,"start_character":20,"end_line":368,"end_character":23},"in_reply_to":"ff0f0b1f_44762b72","updated":"2017-05-25 23:43:14.000000000","message":"Done","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":367,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":368,"context_line":"        LOG.warning(_LW(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":369,"context_line":"                    \u0027shelved Instance.  Please update your cinder \u0027"},{"line_number":370,"context_line":"                    \u0027installation, or your configured API version.\u0027),"},{"line_number":371,"context_line":"                    volume_id, instance\u003dinstance)"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_046cb399","line":369,"range":{"start_line":369,"start_character":29,"end_line":369,"end_character":37},"updated":"2017-05-25 03:14:21.000000000","message":"instance","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":366,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":367,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":368,"context_line":"        LOG.warning(_LW(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":369,"context_line":"                    \u0027shelved Instance.  Please update your cinder \u0027"},{"line_number":370,"context_line":"                    \u0027installation, or your configured API version.\u0027),"},{"line_number":371,"context_line":"                    volume_id, instance\u003dinstance)"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_e0c6364a","line":369,"range":{"start_line":369,"start_character":29,"end_line":369,"end_character":37},"in_reply_to":"ff0f0b1f_046cb399","updated":"2017-05-25 23:43:14.000000000","message":"Done","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":448,"context_line":"        attachment_ref \u003d {}"},{"line_number":449,"context_line":"        if self.get(\u0027connection_info\u0027, None):"},{"line_number":450,"context_line":"            existing_attach_id \u003d \\"},{"line_number":451,"context_line":"                self[\u0027connection_info\u0027].get(\u0027attachment_id\u0027, None)"},{"line_number":452,"context_line":"            connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":453,"context_line":"            LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":454,"context_line":"                      existing_attach_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_040153af","line":451,"range":{"start_line":450,"start_character":12,"end_line":451,"end_character":66},"updated":"2017-05-25 03:14:21.000000000","message":"We just check the self.attachment_id - this class you\u0027re in actually wraps a nova.objects.BlockDeviceMapping object, which has the attachment_id field, so they are also on self here if transformed correctly.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":448,"context_line":"        attachment_ref \u003d {}"},{"line_number":449,"context_line":"        if self.get(\u0027connection_info\u0027, None):"},{"line_number":450,"context_line":"            existing_attach_id \u003d \\"},{"line_number":451,"context_line":"                self[\u0027connection_info\u0027].get(\u0027attachment_id\u0027, None)"},{"line_number":452,"context_line":"            connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":453,"context_line":"            LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":454,"context_line":"                      existing_attach_id)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_0026ca17","line":451,"range":{"start_line":450,"start_character":12,"end_line":451,"end_character":66},"in_reply_to":"ff0f0b1f_040153af","updated":"2017-05-25 23:43:14.000000000","message":"Done","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":520,"context_line":"                                       volume_api, instance):"},{"line_number":521,"context_line":"        LOG.warning(_LW(\u0027Using legacy attach flow to update volume connection.\u0027"},{"line_number":522,"context_line":"                    \u0027 Please update your cinder installation, or your \u0027"},{"line_number":523,"context_line":"                    \u0027configured API version.\u0027),"},{"line_number":524,"context_line":"                    instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_a433c7aa","line":521,"range":{"start_line":521,"start_character":20,"end_line":521,"end_character":23},"updated":"2017-05-25 03:14:21.000000000","message":"remove","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":520,"context_line":"                                       volume_api, instance):"},{"line_number":521,"context_line":"        LOG.warning(_LW(\u0027Using legacy attach flow to update volume connection.\u0027"},{"line_number":522,"context_line":"                    \u0027 Please update your cinder installation, or your \u0027"},{"line_number":523,"context_line":"                    \u0027configured API version.\u0027),"},{"line_number":524,"context_line":"                    instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_405a8283","line":521,"range":{"start_line":521,"start_character":20,"end_line":521,"end_character":23},"in_reply_to":"ff0f0b1f_a433c7aa","updated":"2017-05-25 23:43:14.000000000","message":"Done","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":531,"context_line":"                               virt_driver):"},{"line_number":532,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":533,"context_line":"        attachment_id \u003d self[\u0027connection_info\u0027][\u0027attachment_id\u0027]"},{"line_number":534,"context_line":"        return volume_api.attachment_update(context, attachment_id, connector)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    @update_db"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_64292f35","line":533,"range":{"start_line":533,"start_character":8,"end_line":533,"end_character":64},"updated":"2017-05-25 03:14:21.000000000","message":"This all goes away.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":531,"context_line":"                               virt_driver):"},{"line_number":532,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":533,"context_line":"        attachment_id \u003d self[\u0027connection_info\u0027][\u0027attachment_id\u0027]"},{"line_number":534,"context_line":"        return volume_api.attachment_update(context, attachment_id, connector)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    @update_db"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_60658645","line":533,"range":{"start_line":533,"start_character":8,"end_line":533,"end_character":64},"in_reply_to":"ff0f0b1f_64292f35","updated":"2017-05-25 23:43:14.000000000","message":"Done","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"2c7d1b1f2b4f238c214a0000740342d20db8876a","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        # the method updates the connection_info passed in to it based off"},{"line_number":558,"context_line":"        # of the persisted entry in self, but then that potentially gets"},{"line_number":559,"context_line":"        # overwritten in the next call that copies over into connection_info?"},{"line_number":560,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":561,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":562,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":563,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_888a0661","line":560,"updated":"2017-05-25 15:21:27.000000000","message":"if \u0027serial\u0027 not in connection_update:\n\nTypeError: argument of type \u0027VolumeAttachment\u0027 is not iterable\n\nshould be - \n\nif getattr(connection_update, \u0027serial\u0027, None) is None:\n\nthis is the connection update object:\n\n(Pdb) connection_update\n\u003cAttachment: 1b565a0e-35b8-4bbb-a5ad-eee9902ec7b5\u003e\n(Pdb) connection_update.to_dict()\n{u\u0027status\u0027: u\u0027attached\u0027, u\u0027detached_at\u0027: u\u0027\u0027, u\u0027connection_info\u0027: {u\u0027access_mode\u0027: u\u0027rw\u0027, u\u0027attachment_id\u0027: u\u00271b565a0e-35b8-4bbb-a5ad-eee9902ec7b5\u0027, u\u0027target_discovered\u0027: u\u0027False\u0027, u\u0027encrypted\u0027: u\u0027False\u0027, u\u0027driver_volume_type\u0027: u\u0027iscsi\u0027, u\u0027qos_specs\u0027: None, u\u0027target_iqn\u0027: u\u0027iqn.2010-10.org.openstack:volume-efd98ddc-7bfb-4d75-a4ae-d1a329e5d191\u0027, u\u0027target_portal\u0027: u\u0027192.168.0.181:3260\u0027, u\u0027volume_id\u0027: u\u0027efd98ddc-7bfb-4d75-a4ae-d1a329e5d191\u0027, u\u0027target_lun\u0027: u\u00271\u0027, u\u0027auth_password\u0027: u\u0027SBegHRkrfe4764D6\u0027, u\u0027auth_username\u0027: u\u0027yPF2cQcQ7NVNSVFMt8ZD\u0027, u\u0027auth_method\u0027: u\u0027CHAP\u0027}, u\u0027attached_at\u0027: u\u00272017-05-25T15:07:14.000000\u0027, u\u0027attach_mode\u0027: u\u0027rw\u0027, u\u0027instance\u0027: u\u00279442ba57-38af-459e-932a-9eb3b34fc40a\u0027, u\u0027volume_id\u0027: u\u0027efd98ddc-7bfb-4d75-a4ae-d1a329e5d191\u0027, u\u0027id\u0027: u\u00271b565a0e-35b8-4bbb-a5ad-eee9902ec7b5\u0027}","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        # the method updates the connection_info passed in to it based off"},{"line_number":558,"context_line":"        # of the persisted entry in self, but then that potentially gets"},{"line_number":559,"context_line":"        # overwritten in the next call that copies over into connection_info?"},{"line_number":560,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":561,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":562,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":563,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_6098e61a","line":560,"in_reply_to":"ff0f0b1f_888a0661","updated":"2017-05-25 23:43:14.000000000","message":"Done","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"2c7d1b1f2b4f238c214a0000740342d20db8876a","unresolved":false,"context_lines":[{"line_number":558,"context_line":"        # of the persisted entry in self, but then that potentially gets"},{"line_number":559,"context_line":"        # overwritten in the next call that copies over into connection_info?"},{"line_number":560,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":561,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":562,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":563,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update"},{"line_number":564,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_9adfedd5","line":561,"updated":"2017-05-25 15:21:27.000000000","message":"this fails, should be:\n\nconnection_update.serial \u003d self.volume_id","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":558,"context_line":"        # of the persisted entry in self, but then that potentially gets"},{"line_number":559,"context_line":"        # overwritten in the next call that copies over into connection_info?"},{"line_number":560,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":561,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":562,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":563,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update"},{"line_number":564,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_409de208","line":561,"in_reply_to":"ff0f0b1f_9adfedd5","updated":"2017-05-25 23:43:14.000000000","message":"Done","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"39e076fe3fbd941147ff5c886d3d624befe2b7d7","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":561,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":562,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":563,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    def save(self):"},{"line_number":566,"context_line":"        # NOTE(ndipanov): we might want to generalize this by adding it to the"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_3d557bfb","line":563,"updated":"2017-05-25 15:27:40.000000000","message":"this needs to be:\n\nself[\u0027connection_info\u0027] \u003d connection_update.connection_info","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"bdda3defd13e54f1fd04729fceda24cf84967f7a","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":561,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":562,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":563,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    def save(self):"},{"line_number":566,"context_line":"        # NOTE(ndipanov): we might want to generalize this by adding it to the"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_5d1dcf71","line":563,"in_reply_to":"ff0f0b1f_3d557bfb","updated":"2017-05-25 15:54:37.000000000","message":"actually not sure this is quite correct, getting an error further on where serial is missing in the bdm. looking into it.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fff00f7e85c4bbca26a5467d561ddf69dd90fe64","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        # attachment_id as opposed to relying on what may have been passed"},{"line_number":355,"context_line":"        # in, we want to force usage of the old detach flow for now and only"},{"line_number":356,"context_line":"        # use the new flow when we explicitly used it for the attach."},{"line_number":357,"context_line":"        if not self.attachment_id:"},{"line_number":358,"context_line":"            volume_api.terminate_connection(context, volume_id, connector)"},{"line_number":359,"context_line":"            volume_api.detach(context.elevated(), volume_id, instance.uuid,"},{"line_number":360,"context_line":"                              attachment_id)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_b44f4791","line":357,"range":{"start_line":357,"start_character":15,"end_line":357,"end_character":33},"updated":"2017-05-26 11:49:02.000000000","message":"self[\u0027attachment_id\u0027] is good here.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        # attachment_id as opposed to relying on what may have been passed"},{"line_number":355,"context_line":"        # in, we want to force usage of the old detach flow for now and only"},{"line_number":356,"context_line":"        # use the new flow when we explicitly used it for the attach."},{"line_number":357,"context_line":"        if not self.attachment_id:"},{"line_number":358,"context_line":"            volume_api.terminate_connection(context, volume_id, connector)"},{"line_number":359,"context_line":"            volume_api.detach(context.elevated(), volume_id, instance.uuid,"},{"line_number":360,"context_line":"                              attachment_id)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_3376a340","line":357,"range":{"start_line":357,"start_character":15,"end_line":357,"end_character":33},"in_reply_to":"ff0f0b1f_9d1100b0","updated":"2017-05-26 17:54:44.000000000","message":"Yeah, it\u0027s apparantly not objectified here or something?  I don\u0027t know for sure about how Nova does a lot of this, but just changing it to a dict access works so that\u0027s what I\u0027ve done.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"711982c200f0078e247c0f0083d42936220fab5e","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        # attachment_id as opposed to relying on what may have been passed"},{"line_number":355,"context_line":"        # in, we want to force usage of the old detach flow for now and only"},{"line_number":356,"context_line":"        # use the new flow when we explicitly used it for the attach."},{"line_number":357,"context_line":"        if not self.attachment_id:"},{"line_number":358,"context_line":"            volume_api.terminate_connection(context, volume_id, connector)"},{"line_number":359,"context_line":"            volume_api.detach(context.elevated(), volume_id, instance.uuid,"},{"line_number":360,"context_line":"                              attachment_id)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_9d1100b0","line":357,"range":{"start_line":357,"start_character":15,"end_line":357,"end_character":33},"in_reply_to":"ff0f0b1f_9d2580ae","updated":"2017-05-26 17:08:54.000000000","message":"Though I don\u0027t understand why this is happening now. in compute manager, bdm.attachment_id is commonly used and works.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"e2b696c0afc3219a230828752b6555e2f591bd5c","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        # attachment_id as opposed to relying on what may have been passed"},{"line_number":355,"context_line":"        # in, we want to force usage of the old detach flow for now and only"},{"line_number":356,"context_line":"        # use the new flow when we explicitly used it for the attach."},{"line_number":357,"context_line":"        if not self.attachment_id:"},{"line_number":358,"context_line":"            volume_api.terminate_connection(context, volume_id, connector)"},{"line_number":359,"context_line":"            volume_api.detach(context.elevated(), volume_id, instance.uuid,"},{"line_number":360,"context_line":"                              attachment_id)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_9d2580ae","line":357,"range":{"start_line":357,"start_character":15,"end_line":357,"end_character":33},"in_reply_to":"ff0f0b1f_b44f4791","updated":"2017-05-26 16:25:13.000000000","message":"agree, self.attachment_id raises\n\nAttributeError: \u0027super\u0027 object has no attribute \u0027__getattr__\u0027","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"711982c200f0078e247c0f0083d42936220fab5e","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            volume_api.detach(context.elevated(), volume_id, instance.uuid,"},{"line_number":360,"context_line":"                              attachment_id)"},{"line_number":361,"context_line":"        else:"},{"line_number":362,"context_line":"            volume_api.attachment_delete(context, self.attachment_id)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _legacy_volume_attach(self, context, volume, connector, instance,"},{"line_number":365,"context_line":"                       volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_9dbb4071","line":362,"updated":"2017-05-26 17:08:54.000000000","message":"same problem here. seems odd that this doesn\u0027t work.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            volume_api.detach(context.elevated(), volume_id, instance.uuid,"},{"line_number":360,"context_line":"                              attachment_id)"},{"line_number":361,"context_line":"        else:"},{"line_number":362,"context_line":"            volume_api.attachment_delete(context, self.attachment_id)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _legacy_volume_attach(self, context, volume, connector, instance,"},{"line_number":365,"context_line":"                       volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_f38dcb2a","line":362,"in_reply_to":"ff0f0b1f_9dbb4071","updated":"2017-05-26 17:54:44.000000000","message":"Done","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"c79573a9ccaeef5d31f859a4fb6f7f9ede592fde","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            volume_api.attachment_delete(context, self.attachment_id)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _legacy_volume_attach(self, context, volume, connector, instance,"},{"line_number":365,"context_line":"                       volume_api, virt_driver,"},{"line_number":366,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":367,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":368,"context_line":"        LOG.warning(\u0027Using legacy attach flow to connect volume %s to\u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_5d65a8e0","line":365,"updated":"2017-05-26 16:27:17.000000000","message":"nit- this line is highlighted in my ide as a pep8 warning for indenting.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":362,"context_line":"            volume_api.attachment_delete(context, self.attachment_id)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def _legacy_volume_attach(self, context, volume, connector, instance,"},{"line_number":365,"context_line":"                       volume_api, virt_driver,"},{"line_number":366,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":367,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":368,"context_line":"        LOG.warning(\u0027Using legacy attach flow to connect volume %s to\u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_f3b6ebdc","line":365,"in_reply_to":"ff0f0b1f_5d65a8e0","updated":"2017-05-26 17:54:44.000000000","message":"No problem, I\u0027ll fix it so it\u0027s acceptable to at least *most* of the pep8 versions","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fff00f7e85c4bbca26a5467d561ddf69dd90fe64","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                                  {\u0027volume_id\u0027: volume_id,"},{"line_number":498,"context_line":"                                   \u0027mountpoint\u0027: self[\u0027mount_device\u0027]},"},{"line_number":499,"context_line":"                                  instance\u003dinstance)"},{"line_number":500,"context_line":"                    volume_api.remove_attachment(context,"},{"line_number":501,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":502,"context_line":"                                                 self.attachment_id)"},{"line_number":503,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_399e9254","line":500,"range":{"start_line":500,"start_character":31,"end_line":500,"end_character":48},"updated":"2017-05-26 11:49:02.000000000","message":"This should be attachment_delete(context, self[\u0027attachment_id\u0027]).\n\nIn my env something blows up after fixing target_lun with this command: Command: /lib/udev/scsi_id --page 0x83 --whitelisted /dev/disk/by-path/ip-127.0.0.1:3260-iscsi-iqn.2010-10.org.openstack:volume-c15cfef9-9d06-4bf1-96ac-a234c635563b-lun-1\n\nAnd after fixing the delete it cleans up Cinder too before that it only destroyed the BDM.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                                  {\u0027volume_id\u0027: volume_id,"},{"line_number":498,"context_line":"                                   \u0027mountpoint\u0027: self[\u0027mount_device\u0027]},"},{"line_number":499,"context_line":"                                  instance\u003dinstance)"},{"line_number":500,"context_line":"                    volume_api.remove_attachment(context,"},{"line_number":501,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":502,"context_line":"                                                 self.attachment_id)"},{"line_number":503,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_b3b073df","line":500,"range":{"start_line":500,"start_character":31,"end_line":500,"end_character":48},"in_reply_to":"ff0f0b1f_399e9254","updated":"2017-05-26 17:54:44.000000000","message":"Done","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"41af714c7ac20d971956dd6c794cc266283dd1ee","unresolved":false,"context_lines":[{"line_number":499,"context_line":"                                  instance\u003dinstance)"},{"line_number":500,"context_line":"                    volume_api.remove_attachment(context,"},{"line_number":501,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":502,"context_line":"                                                 self.attachment_id)"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    @update_db"},{"line_number":505,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_ebcf1527","line":502,"updated":"2017-05-26 16:16:58.000000000","message":"(Pdb) self.attachment_id\n*** AttributeError: \u0027super\u0027 object has no attribute \u0027__getattr__\u0027\n(Pdb) self[\u0027attachment_id\u0027]\n\u0027b6465bde-f952-4f03-ac54-0771e6dbe4b5\u0027\n\nnot the most intuitive thing...","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":499,"context_line":"                                  instance\u003dinstance)"},{"line_number":500,"context_line":"                    volume_api.remove_attachment(context,"},{"line_number":501,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":502,"context_line":"                                                 self.attachment_id)"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    @update_db"},{"line_number":505,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_93b56fd0","line":502,"in_reply_to":"ff0f0b1f_ebcf1527","updated":"2017-05-26 17:54:44.000000000","message":"Yeah, I\u0027ve just resolved to using dict style access for everything in this file :)","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"711982c200f0078e247c0f0083d42936220fab5e","unresolved":false,"context_lines":[{"line_number":531,"context_line":"                                                connector)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":534,"context_line":"                               virt_driver):"},{"line_number":535,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":536,"context_line":"        return volume_api.attachment_update(context, self.attachment_id,"},{"line_number":537,"context_line":"                                            connector)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_40013baf","line":534,"updated":"2017-05-26 17:08:54.000000000","message":"nit - pep8 indent warning","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":531,"context_line":"                                                connector)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":534,"context_line":"                               virt_driver):"},{"line_number":535,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":536,"context_line":"        return volume_api.attachment_update(context, self.attachment_id,"},{"line_number":537,"context_line":"                                            connector)"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_b3fe3369","line":534,"in_reply_to":"ff0f0b1f_40013baf","updated":"2017-05-26 17:54:44.000000000","message":"Done","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"711982c200f0078e247c0f0083d42936220fab5e","unresolved":false,"context_lines":[{"line_number":533,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":534,"context_line":"                               virt_driver):"},{"line_number":535,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":536,"context_line":"        return volume_api.attachment_update(context, self.attachment_id,"},{"line_number":537,"context_line":"                                            connector)"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    @update_db"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_406c9b9b","line":536,"updated":"2017-05-26 17:08:54.000000000","message":"another self.attachment_id","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":533,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":534,"context_line":"                               virt_driver):"},{"line_number":535,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":536,"context_line":"        return volume_api.attachment_update(context, self.attachment_id,"},{"line_number":537,"context_line":"                                            connector)"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    @update_db"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_13d6fff2","line":536,"in_reply_to":"ff0f0b1f_406c9b9b","updated":"2017-05-26 17:54:44.000000000","message":"so this one seemed to work, I don\u0027t know how to resolve the self objects and what\u0027s going on there honestly.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"e6845c5f4d3c449cea7637983aa02edb6dc221a4","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # of the persisted entry in self, but then that potentially gets"},{"line_number":562,"context_line":"        # overwritten in the next call that copies over into connection_info?"},{"line_number":563,"context_line":"        if getattr(connection_update, \u0027serial\u0027, None) is None:"},{"line_number":564,"context_line":"            connection_update.serial \u003d self.volume_id"},{"line_number":565,"context_line":"            self[\u0027connection_info\u0027] \u003d connection_update.connection_info"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def save(self):"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_2aa06ba5","line":564,"updated":"2017-05-26 14:26:39.000000000","message":"i think serial is part of connection_info, not connection_update. (these objects can make you crazy)","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # of the persisted entry in self, but then that potentially gets"},{"line_number":562,"context_line":"        # overwritten in the next call that copies over into connection_info?"},{"line_number":563,"context_line":"        if getattr(connection_update, \u0027serial\u0027, None) is None:"},{"line_number":564,"context_line":"            connection_update.serial \u003d self.volume_id"},{"line_number":565,"context_line":"            self[\u0027connection_info\u0027] \u003d connection_update.connection_info"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def save(self):"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_f3294bf2","line":564,"in_reply_to":"ff0f0b1f_2aa06ba5","updated":"2017-05-26 17:54:44.000000000","message":"I was crazy to begin with... now just \"ier\"","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"0d17aad04759a8c7b55caa7b4d03f85100e0b1ac","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        if getattr(connection_update, \u0027serial\u0027, None) is None:"},{"line_number":564,"context_line":"            connection_update.serial \u003d self.volume_id"},{"line_number":565,"context_line":"            self[\u0027connection_info\u0027] \u003d connection_update.connection_info"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def save(self):"},{"line_number":568,"context_line":"        # NOTE(ndipanov): we might want to generalize this by adding it to the"},{"line_number":569,"context_line":"        # _update_on_save and adding a transformation function."}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_4ae03f97","line":566,"updated":"2017-05-26 14:35:03.000000000","message":"also, was there a reason you removed self._preserve_multipath_id()?","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":563,"context_line":"        if getattr(connection_update, \u0027serial\u0027, None) is None:"},{"line_number":564,"context_line":"            connection_update.serial \u003d self.volume_id"},{"line_number":565,"context_line":"            self[\u0027connection_info\u0027] \u003d connection_update.connection_info"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"    def save(self):"},{"line_number":568,"context_line":"        # NOTE(ndipanov): we might want to generalize this by adding it to the"},{"line_number":569,"context_line":"        # _update_on_save and adding a transformation function."}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_134b9fb0","line":566,"in_reply_to":"ff0f0b1f_4ae03f97","updated":"2017-05-26 17:54:44.000000000","message":"Yeah, honestly I don\u0027t remember what I was doing here, and my comment while likely intending to be helpful, isn\u0027t really.  I\u0027ll look at just putting it back the way it was and see if I can figure out what I was doing.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"b48e392da8901ad8cc3905c56c7cd6b78c6fda19","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                                  {\u0027volume_id\u0027: volume_id,"},{"line_number":498,"context_line":"                                   \u0027mountpoint\u0027: self[\u0027mount_device\u0027]},"},{"line_number":499,"context_line":"                                  instance\u003dinstance)"},{"line_number":500,"context_line":"                    volume_api.attachment_delete(context,"},{"line_number":501,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":502,"context_line":"                                                 self[\u0027attachment_id\u0027])"},{"line_number":503,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"df140735_8580738d","line":500,"updated":"2017-05-30 19:45:54.000000000","message":"attachment_delete only takes an attachment_id","commit_id":"4d3ecfe485654051fe42c154135d89b9fbb3937c"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"c6b38fe8382840b0d4d0cb2bd4f11e2633f524ff","unresolved":false,"context_lines":[{"line_number":556,"context_line":"                                                             instance,"},{"line_number":557,"context_line":"                                                             virt_driver)"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":560,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":561,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":562,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update.connection_info"}],"source_content_type":"text/x-python","patch_set":44,"id":"df140735_d854fbcc","line":559,"updated":"2017-05-31 13:34:27.000000000","message":"(Pdb) \u0027serial\u0027 not in connection_update \n*** TypeError: argument of type \u0027VolumeAttachment\u0027 is not iterable\n\n(Pdb) connection_update.__class__\n\u003cclass \u0027cinderclient.v3.attachments.VolumeAttachment\u0027\u003e\n\n(Pdb) connection_update.to_dict()\n{u\u0027status\u0027: u\u0027attached\u0027, u\u0027detached_at\u0027: u\u0027\u0027, u\u0027connection_info\u0027: {u\u0027access_mode\u0027: u\u0027rw\u0027, u\u0027attachment_id\u0027: u\u00274a216242-ca40-4961-ae60-71cd5204d4da\u0027, u\u0027target_discovered\u0027: u\u0027False\u0027, u\u0027encrypted\u0027: u\u0027False\u0027, u\u0027driver_volume_type\u0027: u\u0027iscsi\u0027, u\u0027qos_specs\u0027: None, u\u0027target_iqn\u0027: u\u0027iqn.2010-10.org.openstack:volume-0a270341-ccbe-4544-906e-21d15a5a1c85\u0027, u\u0027target_portal\u0027: u\u0027192.168.0.181:3260\u0027, u\u0027volume_id\u0027: u\u00270a270341-ccbe-4544-906e-21d15a5a1c85\u0027, u\u0027target_lun\u0027: u\u00271\u0027, u\u0027auth_password\u0027: u\u0027SqWtZvGzs8LThA6Y\u0027, u\u0027auth_username\u0027: u\u0027so5qwhEPHc3JDpK82Uvx\u0027, u\u0027auth_method\u0027: u\u0027CHAP\u0027}, u\u0027attached_at\u0027: u\u00272017-05-31T13:08:41.000000\u0027, u\u0027attach_mode\u0027: u\u0027rw\u0027, u\u0027instance\u0027: u\u0027e01b3be6-cf8f-433a-a921-f9b7efb0efec\u0027, u\u0027volume_id\u0027: u\u00270a270341-ccbe-4544-906e-21d15a5a1c85\u0027, u\u0027id\u0027: u\u00274a216242-ca40-4961-ae60-71cd5204d4da\u0027}\n\nI\u0027m not sure if the problem is dealing with this object or if get connection update is returning a different object than initialize_connection.","commit_id":"4d3ecfe485654051fe42c154135d89b9fbb3937c"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"3bd9d71cf3194ff24960ed9227c48d6a27c28eac","unresolved":false,"context_lines":[{"line_number":556,"context_line":"                                                             instance,"},{"line_number":557,"context_line":"                                                             virt_driver)"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_update:"},{"line_number":560,"context_line":"            connection_update[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":561,"context_line":"        self._preserve_multipath_id(connection_update)"},{"line_number":562,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_update.connection_info"}],"source_content_type":"text/x-python","patch_set":44,"id":"df140735_9e81a24d","line":559,"in_reply_to":"df140735_d854fbcc","updated":"2017-06-01 16:40:02.000000000","message":"my workaround was to return connection_update.connection_info (a dict) from _get_connection_updates()","commit_id":"4d3ecfe485654051fe42c154135d89b9fbb3937c"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"77883ce72103cf198e796c97e3605bb4bfef6a5f","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                                   \u0027mountpoint\u0027: self[\u0027mount_device\u0027]},"},{"line_number":499,"context_line":"                                  instance\u003dinstance)"},{"line_number":500,"context_line":"                    volume_api.attachment_delete(context,"},{"line_number":501,"context_line":"                                                 volume[\u0027id\u0027],"},{"line_number":502,"context_line":"                                                 self[\u0027attachment_id\u0027])"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    @update_db"}],"source_content_type":"text/x-python","patch_set":45,"id":"df140735_feb9b5cb","line":501,"range":{"start_line":501,"start_character":49,"end_line":501,"end_character":62},"updated":"2017-06-01 22:08:56.000000000","message":"volume[\u0027id\u0027] is not needed here.","commit_id":"d24cb9c23b121184bff05f503be15ede7882afb0"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"40f5d7d9c50640705e499324b8c0c07d311be1b5","unresolved":false,"context_lines":[{"line_number":553,"context_line":"                                                           connector,"},{"line_number":554,"context_line":"                                                           volume_api,"},{"line_number":555,"context_line":"                                                           instance,"},{"line_number":556,"context_line":"                                                           virt_driver).get(\u0027connection_info\u0027,"},{"line_number":557,"context_line":"                                                                            None)"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_info:"},{"line_number":560,"context_line":"            connection_info[\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":46,"id":"df140735_65905a4b","line":557,"range":{"start_line":556,"start_character":59,"end_line":557,"end_character":81},"updated":"2017-06-02 13:46:34.000000000","message":"Nit: these lines are too long.","commit_id":"0a9465d2c8d42390c10e2de61c34e5d6480eb2cd"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"40f5d7d9c50640705e499324b8c0c07d311be1b5","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_info:"},{"line_number":560,"context_line":"            connection_info[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":561,"context_line":"        self._preserve_multipath_id(connection_info)"},{"line_number":562,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_info.connection_info"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"    def save(self):"},{"line_number":565,"context_line":"        # NOTE(ndipanov): we might want to generalize this by adding it to the"}],"source_content_type":"text/x-python","patch_set":46,"id":"df140735_e5c34a88","line":562,"range":{"start_line":562,"start_character":49,"end_line":562,"end_character":65},"updated":"2017-06-02 13:46:34.000000000","message":"It\u0027s not needed here anymore.","commit_id":"0a9465d2c8d42390c10e2de61c34e5d6480eb2cd"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"1b17ae7e7896ca3c235be1da57a12668a5972b08","unresolved":false,"context_lines":[{"line_number":553,"context_line":"                                                           connector,"},{"line_number":554,"context_line":"                                                           volume_api,"},{"line_number":555,"context_line":"                                                           instance,"},{"line_number":556,"context_line":"                                                           virt_driver).get(\u0027connection_info\u0027,"},{"line_number":557,"context_line":"                                                                            None)"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_info:"}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_6c21d2b4","line":556,"updated":"2017-06-21 17:33:27.000000000","message":"This .get() is throwing an exception:\n\n-\u003e connection_info \u003d connection_info.get(\u0027connection_info\u0027,None)\n(Pdb) n\nTypeError: \u0027get() takes exactly 1 argument (3 given)\u0027\n\u003e /mnt/share/stack/nova/nova/virt/block_device.py(555)refresh_connection_info()\n-\u003e connection_info \u003d connection_info.get(\u0027connection_info\u0027,None)\n\nThis should be:\n\nupdates \u003d self._get_connection_updates(\n                context, connector, volume_api, \n                instance, virt_driver)\nconnection_info \u003d updates.connection_info","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fef775cd69dd682ced954cb3675d3ef858a5dcc9","unresolved":false,"context_lines":[{"line_number":553,"context_line":"                                                           connector,"},{"line_number":554,"context_line":"                                                           volume_api,"},{"line_number":555,"context_line":"                                                           instance,"},{"line_number":556,"context_line":"                                                           virt_driver).get(\u0027connection_info\u0027,"},{"line_number":557,"context_line":"                                                                            None)"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_info:"}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_40fa4875","line":556,"in_reply_to":"5f201791_6c21d2b4","updated":"2017-09-27 09:47:09.000000000","message":"Done","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"75ae42bb91e95b38f059c8425377585af7fd7a31","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_info:"},{"line_number":560,"context_line":"            connection_info[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":561,"context_line":"        self._preserve_multipath_id(connection_info)"},{"line_number":562,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_info.connection_info"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"    def save(self):"},{"line_number":565,"context_line":"        # NOTE(ndipanov): we might want to generalize this by adding it to the"}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_673d6dba","line":562,"updated":"2017-06-21 17:39:11.000000000","message":"and then this should be:\n\nself[\u0027connection_info\u0027] \u003d connection_info\n\notherwise:\n\nAttributeError: \u0027dict\u0027 object has no attribute \u0027connection_info\u0027","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fef775cd69dd682ced954cb3675d3ef858a5dcc9","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        if \u0027serial\u0027 not in connection_info:"},{"line_number":560,"context_line":"            connection_info[\u0027serial\u0027] \u003d self.volume_id"},{"line_number":561,"context_line":"        self._preserve_multipath_id(connection_info)"},{"line_number":562,"context_line":"        self[\u0027connection_info\u0027] \u003d connection_info.connection_info"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"    def save(self):"},{"line_number":565,"context_line":"        # NOTE(ndipanov): we might want to generalize this by adding it to the"}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_00f45085","line":562,"in_reply_to":"5f201791_673d6dba","updated":"2017-09-27 09:47:09.000000000","message":"Done","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"8d96ee0596fcd6d41671c765d92718cd27e741cc","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":459,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":460,"context_line":"                  attachment_id)"},{"line_number":461,"context_line":"        attachment_ref \u003d volume_api.attachment_update("},{"line_number":462,"context_line":"            context, attachment_id, connector)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":465,"context_line":"            self.get(\u0027connection_info\u0027))"}],"source_content_type":"text/x-python","patch_set":73,"id":"3f1d235d_c9891727","line":462,"range":{"start_line":461,"start_character":8,"end_line":462,"end_character":46},"updated":"2017-06-29 13:59:30.000000000","message":"The problem in the rebuild case is that we did an attachment-delete, so we\u0027ll go try and grab the attachment-id from Cinder here but it\u0027s going to bomb out with NotFound because it\u0027s deleted.\n\nInstead, we\u0027ll need to catch that; create a new attachment and update the bdm.","commit_id":"064ebaf8f9651eaf557df713e09162693f208559"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"021b33e5389b95a2986b830a521502c8129ba243","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        # FIXME(jdg):  I don\u0027t think this should be a possible path any longer,"},{"line_number":441,"context_line":"        # but not sure, for now leave this here for the WIP just to test some"},{"line_number":442,"context_line":"        # things out"},{"line_number":443,"context_line":"        if not attachment_id:"},{"line_number":444,"context_line":"            LOG.error(\"awww crap, run away\")"},{"line_number":445,"context_line":"            raise NotImplementedError()"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        # Just because we have an attachment_id doesn\u0027t mean we\u0027ve initialized"},{"line_number":448,"context_line":"        # with a connector, need to check for connection_info and determine"}],"source_content_type":"text/x-python","patch_set":89,"id":"3f1d235d_e9c0532d","line":445,"range":{"start_line":443,"start_character":8,"end_line":445,"end_character":39},"updated":"2017-07-07 21:39:46.000000000","message":"We should be able to drop this as if we don\u0027t have attachment_id we go to the legacy path anyway in attach() (line #504).","commit_id":"4ff098303c45d7376131e080a884912b177f20ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":362,"context_line":"                              volume_api, virt_driver,"},{"line_number":363,"context_line":"                              do_driver_attach\u003dFalse):"},{"line_number":364,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":365,"context_line":"        LOG.warning(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":366,"context_line":"                    \u0027shelved instance.  Please update your cinder \u0027"},{"line_number":367,"context_line":"                    \u0027installation, or your configured API version.\u0027,"},{"line_number":368,"context_line":"                    volume_id, instance\u003dinstance)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        connection_info \u003d volume_api.initialize_connection(context,"},{"line_number":371,"context_line":"                                                           volume_id,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_e392994b","line":368,"range":{"start_line":365,"start_character":8,"end_line":368,"end_character":49},"updated":"2017-07-21 02:24:43.000000000","message":"We don\u0027t need this. We\u0027re supporting the old style stuff to avoid freaking people out and making it painful.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":362,"context_line":"                              volume_api, virt_driver,"},{"line_number":363,"context_line":"                              do_driver_attach\u003dFalse):"},{"line_number":364,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":365,"context_line":"        LOG.warning(\u0027Using legacy attach flow to connect volume %s to\u0027"},{"line_number":366,"context_line":"                    \u0027shelved instance.  Please update your cinder \u0027"},{"line_number":367,"context_line":"                    \u0027installation, or your configured API version.\u0027,"},{"line_number":368,"context_line":"                    volume_id, instance\u003dinstance)"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        connection_info \u003d volume_api.initialize_connection(context,"},{"line_number":371,"context_line":"                                                           volume_id,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_0fe12fff","line":368,"range":{"start_line":365,"start_character":8,"end_line":368,"end_character":49},"in_reply_to":"1f1a1f67_e392994b","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                       volume_api, virt_driver,"},{"line_number":437,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":438,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":439,"context_line":"        attachment_id \u003d self.get(\u0027attachment_id\u0027, None)"},{"line_number":440,"context_line":"        # Just because we have an attachment_id doesn\u0027t mean we\u0027ve initialized"},{"line_number":441,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":442,"context_line":"        # whether this is an update or a full on new connection."}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_23ef71b1","line":439,"range":{"start_line":439,"start_character":48,"end_line":439,"end_character":54},"updated":"2017-07-21 02:24:43.000000000","message":"We only get here if attachment_id is set, so we shouldn\u0027t need to default to None. Maybe better to just pass attachment_id in as an arg so it\u0027s more clear?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                       volume_api, virt_driver,"},{"line_number":437,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":438,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":439,"context_line":"        attachment_id \u003d self.get(\u0027attachment_id\u0027, None)"},{"line_number":440,"context_line":"        # Just because we have an attachment_id doesn\u0027t mean we\u0027ve initialized"},{"line_number":441,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":442,"context_line":"        # whether this is an update or a full on new connection."}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_2f986b68","line":439,"range":{"start_line":439,"start_character":48,"end_line":439,"end_character":54},"in_reply_to":"1f1a1f67_23ef71b1","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        # is if we do \"multi-attach to same instance\""},{"line_number":449,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":450,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":451,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":452,"context_line":"                  attachment_id)"},{"line_number":453,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":454,"context_line":"            context, attachment_id, connector)"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_43ab8d74","line":452,"range":{"start_line":451,"start_character":8,"end_line":452,"end_character":32},"updated":"2017-07-21 02:24:43.000000000","message":"If attachment_id above is None then this is confusing.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":448,"context_line":"        # is if we do \"multi-attach to same instance\""},{"line_number":449,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":450,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":451,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":452,"context_line":"                  attachment_id)"},{"line_number":453,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":454,"context_line":"            context, attachment_id, connector)"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_0f9daf58","line":452,"range":{"start_line":451,"start_character":8,"end_line":452,"end_character":32},"in_reply_to":"1f1a1f67_43ab8d74","updated":"2017-07-21 08:14:39.000000000","message":"Switched to passing it in.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":454,"context_line":"            context, attachment_id, connector)"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":457,"context_line":"            self.get(\u0027connection_info\u0027))"},{"line_number":458,"context_line":"        if connection_info_string !\u003d self._bdm_obj.connection_info:"},{"line_number":459,"context_line":"            self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":460,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_03b7d5da","line":457,"range":{"start_line":457,"start_character":12,"end_line":457,"end_character":39},"updated":"2017-07-21 02:24:43.000000000","message":"Can\u0027t we just use self[\u0027connection_info\u0027] since we just set it above? Don\u0027t need get().","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":454,"context_line":"            context, attachment_id, connector)"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":457,"context_line":"            self.get(\u0027connection_info\u0027))"},{"line_number":458,"context_line":"        if connection_info_string !\u003d self._bdm_obj.connection_info:"},{"line_number":459,"context_line":"            self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":460,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_6f89c324","line":457,"range":{"start_line":457,"start_character":12,"end_line":457,"end_character":39},"in_reply_to":"1f1a1f67_03b7d5da","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":505,"context_line":""},{"line_number":506,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":507,"context_line":"                                       volume_api, instance):"},{"line_number":508,"context_line":"        LOG.warning(\u0027Using legacy attach flow to update volume connection.\u0027"},{"line_number":509,"context_line":"                    \u0027 Please update your cinder installation, or your \u0027"},{"line_number":510,"context_line":"                    \u0027configured API version.\u0027,"},{"line_number":511,"context_line":"                    instance\u003dinstance)"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        return volume_api.initialize_connection(context,"},{"line_number":514,"context_line":"                                                self.volume_id,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_83cac54c","line":511,"range":{"start_line":508,"start_character":8,"end_line":511,"end_character":38},"updated":"2017-07-21 02:24:43.000000000","message":"Same as above, we don\u0027t want this.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":505,"context_line":""},{"line_number":506,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":507,"context_line":"                                       volume_api, instance):"},{"line_number":508,"context_line":"        LOG.warning(\u0027Using legacy attach flow to update volume connection.\u0027"},{"line_number":509,"context_line":"                    \u0027 Please update your cinder installation, or your \u0027"},{"line_number":510,"context_line":"                    \u0027configured API version.\u0027,"},{"line_number":511,"context_line":"                    instance\u003dinstance)"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        return volume_api.initialize_connection(context,"},{"line_number":514,"context_line":"                                                self.volume_id,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_0fba4fdd","line":511,"range":{"start_line":508,"start_character":8,"end_line":511,"end_character":38},"in_reply_to":"1f1a1f67_83cac54c","updated":"2017-07-21 08:14:39.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"fbed7fcc670dace716758a793acc87e30e5e8b5a","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        # is if we do \"multi-attach to same instance\""},{"line_number":445,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":446,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":447,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":448,"context_line":"                  attachment_id)"},{"line_number":449,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":450,"context_line":"            context, attachment_id, connector)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":453,"context_line":"            self[\u0027connection_info\u0027])"}],"source_content_type":"text/x-python","patch_set":104,"id":"ff346bd7_698562ad","line":450,"range":{"start_line":447,"start_character":60,"end_line":450,"end_character":46},"updated":"2017-07-24 13:47:47.000000000","message":"attachment_update is returning an attachment object (in change set 91, it was returning a dict):\n\n(Pdb) self[\u0027connection_info\u0027]\n\u003cAttachment: c1ef761d-ce20-4515-809a-0bd2fc8f27a6\u003e\n\nWhich \n\n(Pdb) jsonutils.dumps(self[\u0027connection_info\u0027])\n*** ValueError: Circular reference detected\n\nNot sure why it\u0027s returning an object now instead of a dict.","commit_id":"a09f5f0ccc4ab854683b13634c06fcfb092bd19e"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"552712f3df2e8d3a53797970574002f499c2dc26","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        # is if we do \"multi-attach to same instance\""},{"line_number":445,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":446,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":447,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":448,"context_line":"                  attachment_id)"},{"line_number":449,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":450,"context_line":"            context, attachment_id, connector)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":453,"context_line":"            self[\u0027connection_info\u0027])"}],"source_content_type":"text/x-python","patch_set":104,"id":"ff346bd7_9f2e75a3","line":450,"range":{"start_line":447,"start_character":60,"end_line":450,"end_character":46},"in_reply_to":"ff346bd7_698562ad","updated":"2017-07-24 15:59:02.000000000","message":"All the magic is happening here: https://review.openstack.org/#/c/486194/\n\nYou will need that patch to make attach work properly with the new flow.","commit_id":"a09f5f0ccc4ab854683b13634c06fcfb092bd19e"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"b13ff38cac5256f7cc49456c1485bc0d2030e08a","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                context, volume_api, volume_id, self[\u0027connection_info\u0027])"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            try:"},{"line_number":470,"context_line":"                virt_driver.attach_volume("},{"line_number":471,"context_line":"                        context, self[\u0027connection_info\u0027], instance,"},{"line_number":472,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":473,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"}],"source_content_type":"text/x-python","patch_set":104,"id":"ff346bd7_da09aedd","line":470,"updated":"2017-07-24 14:55:58.000000000","message":"Once the above is fixed, another problem is hit. there is no longer a \u0027data\u0027 key in connection_info, and then in libvirt/volume/iscsi.py, connect_volume(), this line blows up:\n\n63 device_info \u003d self.connector.connect_volume(connection_info[\u0027data\u0027])","commit_id":"a09f5f0ccc4ab854683b13634c06fcfb092bd19e"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"552712f3df2e8d3a53797970574002f499c2dc26","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                context, volume_api, volume_id, self[\u0027connection_info\u0027])"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            try:"},{"line_number":470,"context_line":"                virt_driver.attach_volume("},{"line_number":471,"context_line":"                        context, self[\u0027connection_info\u0027], instance,"},{"line_number":472,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":473,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"}],"source_content_type":"text/x-python","patch_set":104,"id":"ff346bd7_9f07951d","line":470,"in_reply_to":"ff346bd7_da09aedd","updated":"2017-07-24 15:59:02.000000000","message":"Same as above, the patch puts the \u0027data\u0027 key back into connection_info.","commit_id":"a09f5f0ccc4ab854683b13634c06fcfb092bd19e"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"43995d8e0e2c345507d04363e10948caef26b32e","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                                  instance\u003dinstance)"},{"line_number":492,"context_line":"                    volume_api.attachment_delete(context,"},{"line_number":493,"context_line":"                                                 attachment_id)"},{"line_number":494,"context_line":"        self.save()"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    @update_db"},{"line_number":497,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":119,"id":"9f436f4f_7c744ecf","line":494,"range":{"start_line":494,"start_character":8,"end_line":494,"end_character":19},"updated":"2017-08-16 10:06:53.000000000","message":"There\u0027s a self.save() in line #468 too. Do we need both?","commit_id":"6462abb449c272b2737fba96406150e6cb1420ab"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        # here to block driver--\u003eos-brick and back up."},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":439,"context_line":"        attachment_id \u003d attachment_id"},{"line_number":440,"context_line":"        # Just because we have an attachment_id doesn\u0027t mean we\u0027ve initialized"},{"line_number":441,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":442,"context_line":"        # whether this is an update or a full on new connection."}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_fa6ad0ea","line":439,"range":{"start_line":439,"start_character":8,"end_line":439,"end_character":37},"updated":"2017-09-14 19:55:19.000000000","message":"why do we need this?","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"180bb55480bfb2b7ce77854264daf76aa2cc05c8","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        # here to block driver--\u003eos-brick and back up."},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":439,"context_line":"        attachment_id \u003d attachment_id"},{"line_number":440,"context_line":"        # Just because we have an attachment_id doesn\u0027t mean we\u0027ve initialized"},{"line_number":441,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":442,"context_line":"        # whether this is an update or a full on new connection."}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_f4ce60b2","line":439,"range":{"start_line":439,"start_character":8,"end_line":439,"end_character":37},"in_reply_to":"5f2577a7_fa6ad0ea","updated":"2017-09-14 22:44:26.000000000","message":"Done","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":454,"context_line":"            context, attachment_id, connector)[\u0027connection_info\u0027]"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":457,"context_line":"            self[\u0027connection_info\u0027])"},{"line_number":458,"context_line":"        if connection_info_string !\u003d self._bdm_obj.connection_info:"},{"line_number":459,"context_line":"            self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        if \u0027serial\u0027 not in self[\u0027connection_info\u0027]:"},{"line_number":462,"context_line":"            self[\u0027connection_info\u0027][\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_15d9ef7d","line":459,"range":{"start_line":456,"start_character":0,"end_line":459,"end_character":66},"updated":"2017-09-14 19:55:19.000000000","message":"Isn\u0027t the json serializer serializes dict keys in unspecified order if sort_keys is False (default)? So even if we serialize the same connection info, there is no guarantee that the two strings will match. So either we should remove the if or pass sort_keys\u003dTrue to the dumps() call.\n\nhttps://docs.python.org/2/library/json.html#json.dump","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"180bb55480bfb2b7ce77854264daf76aa2cc05c8","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":454,"context_line":"            context, attachment_id, connector)[\u0027connection_info\u0027]"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":457,"context_line":"            self[\u0027connection_info\u0027])"},{"line_number":458,"context_line":"        if connection_info_string !\u003d self._bdm_obj.connection_info:"},{"line_number":459,"context_line":"            self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        if \u0027serial\u0027 not in self[\u0027connection_info\u0027]:"},{"line_number":462,"context_line":"            self[\u0027connection_info\u0027][\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_94bddc03","line":459,"range":{"start_line":456,"start_character":0,"end_line":459,"end_character":66},"in_reply_to":"5f2577a7_15d9ef7d","updated":"2017-09-14 22:44:26.000000000","message":"Removed the if, it shouldn\u0027t hurt.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    @update_db"},{"line_number":497,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"},{"line_number":498,"context_line":"               do_check_attach\u003dTrue, do_driver_attach\u003dFalse, **kwargs):"},{"line_number":499,"context_line":"        volume \u003d volume_api.get(context, self.volume_id)"},{"line_number":500,"context_line":"        volume_api.check_availability_zone(context, volume,"},{"line_number":501,"context_line":"                                           instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_9a54ec54","line":498,"range":{"start_line":498,"start_character":61,"end_line":498,"end_character":69},"updated":"2017-09-14 19:55:19.000000000","message":"I don\u0027t see any usage of this, can we drop this as well?","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"180bb55480bfb2b7ce77854264daf76aa2cc05c8","unresolved":false,"context_lines":[{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    @update_db"},{"line_number":497,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"},{"line_number":498,"context_line":"               do_check_attach\u003dTrue, do_driver_attach\u003dFalse, **kwargs):"},{"line_number":499,"context_line":"        volume \u003d volume_api.get(context, self.volume_id)"},{"line_number":500,"context_line":"        volume_api.check_availability_zone(context, volume,"},{"line_number":501,"context_line":"                                           instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_f480a048","line":498,"range":{"start_line":498,"start_character":61,"end_line":498,"end_character":69},"in_reply_to":"5f2577a7_0b69cc1f","updated":"2017-09-14 22:44:26.000000000","message":"Got this error in the test run, so it stays:\n\nTraceback (most recent call last):\n      File \"nova/compute/manager.py\", line 1568, in _prep_block_device\n        wait_func\u003dself._await_block_device_map_created)\n      File \"nova/virt/block_device.py\", line 723, in attach_block_devices\n        _log_and_attach(device)\n      File \"nova/virt/block_device.py\", line 720, in _log_and_attach\n        bdm.attach(*attach_args, **attach_kwargs)\n      File \"nova/virt/block_device.py\", line 45, in wrapped\n        ret_val \u003d method(obj, context, *args, **kwargs)\n    TypeError: attach() got an unexpected keyword argument \u0027wait_func\u0027","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    @update_db"},{"line_number":497,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"},{"line_number":498,"context_line":"               do_check_attach\u003dTrue, do_driver_attach\u003dFalse, **kwargs):"},{"line_number":499,"context_line":"        volume \u003d volume_api.get(context, self.volume_id)"},{"line_number":500,"context_line":"        volume_api.check_availability_zone(context, volume,"},{"line_number":501,"context_line":"                                           instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_0b69cc1f","line":498,"range":{"start_line":498,"start_character":61,"end_line":498,"end_character":69},"in_reply_to":"5f2577a7_9a54ec54","updated":"2017-09-14 20:52:30.000000000","message":"It\u0027s from the legacy header, but I can remove it","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"26dcc63612b96dd079d9c26a98a1ee1915960e19","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        context \u003d context.elevated()"},{"line_number":503,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        if not self[\u0027attachment_id\u0027]:"},{"line_number":506,"context_line":"            self._legacy_volume_attach(context, volume, connector, instance,"},{"line_number":507,"context_line":"                                       volume_api, virt_driver,"},{"line_number":508,"context_line":"                                       do_driver_attach)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_3ac058e1","line":505,"range":{"start_line":505,"start_character":15,"end_line":505,"end_character":36},"updated":"2017-09-14 19:55:19.000000000","message":"huh, that looks weird but DriverVolumeBlockDevice is a dict derivative so it is OK.","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"e2ee6cf2637816f5a950a5a9e8e7699afb9b623c","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        context \u003d context.elevated()"},{"line_number":503,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        if not self[\u0027attachment_id\u0027]:"},{"line_number":506,"context_line":"            self._legacy_volume_attach(context, volume, connector, instance,"},{"line_number":507,"context_line":"                                       volume_api, virt_driver,"},{"line_number":508,"context_line":"                                       do_driver_attach)"}],"source_content_type":"text/x-python","patch_set":136,"id":"5f2577a7_2bd48847","line":505,"range":{"start_line":505,"start_character":15,"end_line":505,"end_character":36},"in_reply_to":"5f2577a7_3ac058e1","updated":"2017-09-14 20:52:30.000000000","message":"Agreed :)","commit_id":"55edec6acb9202f0808f074e74a5d5ebcdd3872b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44604734565ccd2ea867d37fb22d26d49c929453","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        # NOTE (ndipanov): A no-op if there is no connection info already"},{"line_number":441,"context_line":"        if not self[\u0027connection_info\u0027]:"},{"line_number":442,"context_line":"            return"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":445,"context_line":"        connection_info \u003d volume_api.initialize_connection(context,"},{"line_number":446,"context_line":"                                                           self.volume_id,"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_cc40e30a","side":"PARENT","line":443,"updated":"2017-10-10 20:09:30.000000000","message":"unrelated","commit_id":"232458ae4e83e8b218397e42435baa9f1d025b68"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"07baeb270f112c751f6821b8599bfb8dceb9abc0","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":450,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":451,"context_line":"                  attachment_id)"},{"line_number":452,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":453,"context_line":"            context, attachment_id, connector)[\u0027connection_info\u0027]"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        connection_info_string \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_afb415d2","line":452,"updated":"2017-10-13 16:08:14.000000000","message":"surely we only need to call update if it was not already called before, if this is the second time we get here for this connection (reboot?) then we should just do attachment_get(...)? Or did I totally miss understand this?","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":450,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":451,"context_line":"                  attachment_id)"},{"line_number":452,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":453,"context_line":"            context, attachment_id, connector)[\u0027connection_info\u0027]"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        connection_info_string \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_21cf52b1","line":452,"in_reply_to":"5f4e5783_afb415d2","updated":"2017-10-20 16:55:20.000000000","message":"We are using attachment_update for swap volume and here only, so it should be safe.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8a4a1045c3b7e7c025a48454f189b715a8f03c1e","unresolved":false,"context_lines":[{"line_number":473,"context_line":"                        context, self[\u0027connection_info\u0027], instance,"},{"line_number":474,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":475,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"},{"line_number":476,"context_line":"                # NOTE(jdg): There are a number of paths to get to this call,"},{"line_number":477,"context_line":"                # it\u0027d be nice to keep things like calls to complete higher up"},{"line_number":478,"context_line":"                # in the stack (api or manager layer) but there are cases where"},{"line_number":479,"context_line":"                # this is triggered by things that aren\u0027t so clear, so we try"},{"line_number":480,"context_line":"                # this default point here after the connect call which covers"},{"line_number":481,"context_line":"                # us in MOST cases except things like shelve and migrate."},{"line_number":482,"context_line":"                volume_api.attachment_complete(context, attachment_id)"},{"line_number":483,"context_line":"            except Exception:"},{"line_number":484,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":485,"context_line":"                    LOG.exception(\"Driver failed to attach volume \""}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_41cb9f52","line":482,"range":{"start_line":476,"start_character":16,"end_line":482,"end_character":70},"updated":"2017-10-10 19:11:27.000000000","message":"In _legacy_volume_attach, nova calls os-attach regardless of do_driver_attach so why are we only completing the attachment if do_driver_attach\u003dTrue here? See my comment in the compute manager - we should be completing the attachment here regardless of do_driver_attach.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"07baeb270f112c751f6821b8599bfb8dceb9abc0","unresolved":false,"context_lines":[{"line_number":473,"context_line":"                        context, self[\u0027connection_info\u0027], instance,"},{"line_number":474,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":475,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"},{"line_number":476,"context_line":"                # NOTE(jdg): There are a number of paths to get to this call,"},{"line_number":477,"context_line":"                # it\u0027d be nice to keep things like calls to complete higher up"},{"line_number":478,"context_line":"                # in the stack (api or manager layer) but there are cases where"},{"line_number":479,"context_line":"                # this is triggered by things that aren\u0027t so clear, so we try"},{"line_number":480,"context_line":"                # this default point here after the connect call which covers"},{"line_number":481,"context_line":"                # us in MOST cases except things like shelve and migrate."},{"line_number":482,"context_line":"                volume_api.attachment_complete(context, attachment_id)"},{"line_number":483,"context_line":"            except Exception:"},{"line_number":484,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":485,"context_line":"                    LOG.exception(\"Driver failed to attach volume \""}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_cf0bd17a","line":482,"range":{"start_line":476,"start_character":16,"end_line":482,"end_character":70},"in_reply_to":"5f4e5783_41cb9f52","updated":"2017-10-13 16:08:14.000000000","message":"This relates to the attachment_update above I think.\n\nFirst time for this attachment (boot, attach, live-migration, etc?):\n\n* pass connector for first time\n* that gets us connection_info\n* we do the driver attachment\n* we tell cinder we are done now attachment_complete\n\nSecond time for this attachment(reboot, rebuild, etc?):\n\n* just get the connection_info by fetching the attachment from cinder (it already has the connector)\n* do the driver attach again\n* No call to attachment_complete, as this is just a re-attach\n\nIs that what we mean here? We can get here in both of the above cases?","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":473,"context_line":"                        context, self[\u0027connection_info\u0027], instance,"},{"line_number":474,"context_line":"                        self[\u0027mount_device\u0027], disk_bus\u003dself[\u0027disk_bus\u0027],"},{"line_number":475,"context_line":"                        device_type\u003dself[\u0027device_type\u0027], encryption\u003dencryption)"},{"line_number":476,"context_line":"                # NOTE(jdg): There are a number of paths to get to this call,"},{"line_number":477,"context_line":"                # it\u0027d be nice to keep things like calls to complete higher up"},{"line_number":478,"context_line":"                # in the stack (api or manager layer) but there are cases where"},{"line_number":479,"context_line":"                # this is triggered by things that aren\u0027t so clear, so we try"},{"line_number":480,"context_line":"                # this default point here after the connect call which covers"},{"line_number":481,"context_line":"                # us in MOST cases except things like shelve and migrate."},{"line_number":482,"context_line":"                volume_api.attachment_complete(context, attachment_id)"},{"line_number":483,"context_line":"            except Exception:"},{"line_number":484,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":485,"context_line":"                    LOG.exception(\"Driver failed to attach volume \""}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_a1ba2207","line":482,"range":{"start_line":476,"start_character":16,"end_line":482,"end_character":70},"in_reply_to":"5f4e5783_cf0bd17a","updated":"2017-10-20 16:55:20.000000000","message":"Moved it outside of the if in version 146.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44604734565ccd2ea867d37fb22d26d49c929453","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                                do_driver_attach)"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":514,"context_line":"                                       volume_api, instance):"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        return volume_api.initialize_connection(context,"},{"line_number":517,"context_line":"                                                self.volume_id,"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_8cc54b91","line":514,"range":{"start_line":514,"start_character":51,"end_line":514,"end_character":59},"updated":"2017-10-10 20:09:30.000000000","message":"This parameter isn\u0027t used.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                                do_driver_attach)"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":514,"context_line":"                                       volume_api, instance):"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        return volume_api.initialize_connection(context,"},{"line_number":517,"context_line":"                                                self.volume_id,"}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_813726b1","line":514,"range":{"start_line":514,"start_character":51,"end_line":514,"end_character":59},"in_reply_to":"5f4e5783_8cc54b91","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44604734565ccd2ea867d37fb22d26d49c929453","unresolved":false,"context_lines":[{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":521,"context_line":"                                virt_driver):"},{"line_number":522,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":523,"context_line":"        return volume_api.attachment_update(context, self[\u0027attachment_id\u0027],"},{"line_number":524,"context_line":"                                            connector)[\u0027connection_info\u0027]"},{"line_number":525,"context_line":""}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_6cd9ef81","line":522,"range":{"start_line":522,"start_character":8,"end_line":522,"end_character":62},"updated":"2017-10-10 20:09:30.000000000","message":"You already have the connector passed in.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":521,"context_line":"                                virt_driver):"},{"line_number":522,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":523,"context_line":"        return volume_api.attachment_update(context, self[\u0027attachment_id\u0027],"},{"line_number":524,"context_line":"                                            connector)[\u0027connection_info\u0027]"},{"line_number":525,"context_line":""}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_613aea98","line":522,"range":{"start_line":522,"start_character":8,"end_line":522,"end_character":62},"in_reply_to":"5f4e5783_6cd9ef81","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e7e067945aa9ac837d8e9c790bf4692fd4a563d7","unresolved":false,"context_lines":[{"line_number":520,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":521,"context_line":"                                virt_driver):"},{"line_number":522,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":523,"context_line":"        return volume_api.attachment_update(context, self[\u0027attachment_id\u0027],"},{"line_number":524,"context_line":"                                            connector)[\u0027connection_info\u0027]"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    @update_db"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_af13590d","line":523,"updated":"2017-10-10 20:35:01.000000000","message":"We talked about this at the PTG a bit, see L122:\n\nhttps://etherpad.openstack.org/p/cinder-ptg-queens-thursday-notes\n\nApparently calling attachemnt_update puts the volume into \u0027attaching\u0027 status? And it\u0027s expected that we\u0027d call attachment_complete to put it back into \u0027in-use\u0027 status.\n\nThis refresh method is called from a few places in the compute manager and is just for getting the latest connection_info from the volume backend in Cinder. This was meant to be a replacement call for os-initialize_connection, which didn\u0027t change the volume status. Now it seems we have this new issue to get the latest connection_info. So question is:\n\n1. Can we just get the attachment from Cinder and return it\u0027s connection_info since Cinder is storing that now? I assume that just pulls it out of the database and if it changed for whatever reason on the backend in cinder that would get updated.\n\n2. If we can\u0027t just get it from the attachment, do we need to do some kind of dance to get the latest connection_info without changing the status of the volume while doing it?","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44604734565ccd2ea867d37fb22d26d49c929453","unresolved":false,"context_lines":[{"line_number":532,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        if not self[\u0027attachment_id\u0027]:"},{"line_number":535,"context_line":"            connection_info \u003d self._legacy_get_connection_updates(context,"},{"line_number":536,"context_line":"                                                                  connector,"},{"line_number":537,"context_line":"                                                                  volume_api,"},{"line_number":538,"context_line":"                                                                  instance)"},{"line_number":539,"context_line":"        else:"},{"line_number":540,"context_line":"            connection_info \u003d self._get_connection_updates("},{"line_number":541,"context_line":"                context, connector, volume_api, instance,"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_4cbf53fb","line":538,"range":{"start_line":535,"start_character":12,"end_line":538,"end_character":75},"updated":"2017-10-10 20:09:30.000000000","message":"Do we need a separate method for a single API call? Just inline it here.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":532,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"        if not self[\u0027attachment_id\u0027]:"},{"line_number":535,"context_line":"            connection_info \u003d self._legacy_get_connection_updates(context,"},{"line_number":536,"context_line":"                                                                  connector,"},{"line_number":537,"context_line":"                                                                  volume_api,"},{"line_number":538,"context_line":"                                                                  instance)"},{"line_number":539,"context_line":"        else:"},{"line_number":540,"context_line":"            connection_info \u003d self._get_connection_updates("},{"line_number":541,"context_line":"                context, connector, volume_api, instance,"}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_e145ba16","line":538,"range":{"start_line":535,"start_character":12,"end_line":538,"end_character":75},"in_reply_to":"5f4e5783_4cbf53fb","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"44604734565ccd2ea867d37fb22d26d49c929453","unresolved":false,"context_lines":[{"line_number":537,"context_line":"                                                                  volume_api,"},{"line_number":538,"context_line":"                                                                  instance)"},{"line_number":539,"context_line":"        else:"},{"line_number":540,"context_line":"            connection_info \u003d self._get_connection_updates("},{"line_number":541,"context_line":"                context, connector, volume_api, instance,"},{"line_number":542,"context_line":"                virt_driver)"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        if \u0027serial\u0027 not in connection_info:"},{"line_number":545,"context_line":"            connection_info[\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":144,"id":"5f4e5783_0c371bb3","line":542,"range":{"start_line":540,"start_character":12,"end_line":542,"end_character":28},"updated":"2017-10-10 20:09:30.000000000","message":"Same, it\u0027s just a single call, we don\u0027t really need a separate method.","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":537,"context_line":"                                                                  volume_api,"},{"line_number":538,"context_line":"                                                                  instance)"},{"line_number":539,"context_line":"        else:"},{"line_number":540,"context_line":"            connection_info \u003d self._get_connection_updates("},{"line_number":541,"context_line":"                context, connector, volume_api, instance,"},{"line_number":542,"context_line":"                virt_driver)"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        if \u0027serial\u0027 not in connection_info:"},{"line_number":545,"context_line":"            connection_info[\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":144,"id":"3f4b6375_c154fecc","line":542,"range":{"start_line":540,"start_character":12,"end_line":542,"end_character":28},"in_reply_to":"5f4e5783_0c371bb3","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"ba7b2390a43917dbf0bc79e5d93aea984fd12066"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"060607c6846ff1f280f84421237459de50f322ff","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                                do_driver_attach)"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":514,"context_line":"                                       volume_api, instance):"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        return volume_api.initialize_connection(context,"},{"line_number":517,"context_line":"                                                self.volume_id,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_61c3d139","line":514,"range":{"start_line":514,"start_character":51,"end_line":514,"end_character":59},"updated":"2017-10-13 18:03:49.000000000","message":"This parameter isn\u0027t used.","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                                do_driver_attach)"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def _legacy_get_connection_updates(self, context, connector,"},{"line_number":514,"context_line":"                                       volume_api, instance):"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        return volume_api.initialize_connection(context,"},{"line_number":517,"context_line":"                                                self.volume_id,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_b4854009","line":514,"range":{"start_line":514,"start_character":51,"end_line":514,"end_character":59},"in_reply_to":"5f4e5783_61c3d139","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"060607c6846ff1f280f84421237459de50f322ff","unresolved":false,"context_lines":[{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":521,"context_line":"                                virt_driver):"},{"line_number":522,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":523,"context_line":"        return volume_api.attachment_update(context, self[\u0027attachment_id\u0027],"},{"line_number":524,"context_line":"                                            connector)[\u0027connection_info\u0027]"},{"line_number":525,"context_line":""}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_21df190e","line":522,"range":{"start_line":522,"start_character":8,"end_line":522,"end_character":62},"updated":"2017-10-13 18:03:49.000000000","message":"you already have the connector passed in","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":521,"context_line":"                                virt_driver):"},{"line_number":522,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":523,"context_line":"        return volume_api.attachment_update(context, self[\u0027attachment_id\u0027],"},{"line_number":524,"context_line":"                                            connector)[\u0027connection_info\u0027]"},{"line_number":525,"context_line":""}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_948004f7","line":522,"range":{"start_line":522,"start_character":8,"end_line":522,"end_character":62},"in_reply_to":"5f4e5783_21df190e","updated":"2017-10-20 16:55:20.000000000","message":"Done","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"060607c6846ff1f280f84421237459de50f322ff","unresolved":false,"context_lines":[{"line_number":520,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":521,"context_line":"                                virt_driver):"},{"line_number":522,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":523,"context_line":"        return volume_api.attachment_update(context, self[\u0027attachment_id\u0027],"},{"line_number":524,"context_line":"                                            connector)[\u0027connection_info\u0027]"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    @update_db"},{"line_number":527,"context_line":"    def refresh_connection_info(self, context, instance,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_41ee95b4","line":524,"range":{"start_line":523,"start_character":8,"end_line":524,"end_character":73},"updated":"2017-10-13 18:03:49.000000000","message":"We said in the checkpoint meeting today that we shouldn\u0027t be calling attachment_update when we\u0027re just asking to refresh the connection_info because that changes the attach_status on the volume to \u0027attaching\u0027 and we don\u0027t later call attachment_complete, so we\u0027ve left the volume in a bad state - and what calls the refresh method might not actually be doing anything with attachments. So I thought we were just going to do an attachment_get()[\u0027connection_info\u0027] for new style attachment connection info refresh?","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"168ca7dbd2551f3d1b0c6b4f5ce4cf27a7a6abac","unresolved":false,"context_lines":[{"line_number":520,"context_line":"    def _get_connection_updates(self, context, connector, volume_api, instance,"},{"line_number":521,"context_line":"                                virt_driver):"},{"line_number":522,"context_line":"        connector \u003d virt_driver.get_volume_connector(instance)"},{"line_number":523,"context_line":"        return volume_api.attachment_update(context, self[\u0027attachment_id\u0027],"},{"line_number":524,"context_line":"                                            connector)[\u0027connection_info\u0027]"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    @update_db"},{"line_number":527,"context_line":"    def refresh_connection_info(self, context, instance,"}],"source_content_type":"text/x-python","patch_set":145,"id":"5f4e5783_f494d838","line":524,"range":{"start_line":523,"start_character":8,"end_line":524,"end_character":73},"in_reply_to":"5f4e5783_41ee95b4","updated":"2017-10-20 16:55:20.000000000","message":"Done here: https://review.openstack.org/#/c/512626/","commit_id":"0b193074d3103a9b53a2504ae22ae0b2a5ca8760"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        # here to block driver--\u003eos-brick and back up."},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":439,"context_line":"        # Just because we have an attachment_id doesn\u0027t mean we\u0027ve initialized"},{"line_number":440,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":441,"context_line":"        # whether this is an update or a full on new connection."},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        # NOTE(jdg): For now we\u0027re assuming no multi-attach, so if"},{"line_number":444,"context_line":"        # an attach_id exists, we use it and update the record"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_b1c93c79","line":441,"range":{"start_line":439,"start_character":0,"end_line":441,"end_character":64},"updated":"2017-11-22 15:30:04.000000000","message":"Surely on first attach, we must update the connector. That is a key part of the flow where the backend attach occurs.\n\nWill Cinder error out if there is a change in the connector later on? Like on a hard reboot?\n\nI kinda like the idea of doing attachment_get, and seeing if the connector needs to be added? Is there a reason we didn\u0027t go that direction? That way we still get a fresh copy of connection_info each time.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        # here to block driver--\u003eos-brick and back up."},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        volume_id \u003d volume[\u0027id\u0027]"},{"line_number":439,"context_line":"        # Just because we have an attachment_id doesn\u0027t mean we\u0027ve initialized"},{"line_number":440,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":441,"context_line":"        # whether this is an update or a full on new connection."},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        # NOTE(jdg): For now we\u0027re assuming no multi-attach, so if"},{"line_number":444,"context_line":"        # an attach_id exists, we use it and update the record"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_1c4a717f","line":441,"range":{"start_line":439,"start_character":0,"end_line":441,"end_character":64},"in_reply_to":"ff82abbf_b1c93c79","updated":"2017-11-23 02:34:54.000000000","message":"I don\u0027t think this comment is still up to date, will double check with jgriffith.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":441,"context_line":"        # whether this is an update or a full on new connection."},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        # NOTE(jdg): For now we\u0027re assuming no multi-attach, so if"},{"line_number":444,"context_line":"        # an attach_id exists, we use it and update the record"},{"line_number":445,"context_line":"        # we can adapt this easily for multi-attach by inspecting"},{"line_number":446,"context_line":"        # details like instance.id and connection_info.  Only trick"},{"line_number":447,"context_line":"        # is if we do \"multi-attach to same instance\""},{"line_number":448,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":449,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":450,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_11e26802","line":447,"range":{"start_line":443,"start_character":0,"end_line":447,"end_character":53},"updated":"2017-11-22 15:30:04.000000000","message":"I don\u0027t get this comment. We have the attachment_id here, so there is no guessing?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        # with a connector, need to check for connection_info and determine"},{"line_number":441,"context_line":"        # whether this is an update or a full on new connection."},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        # NOTE(jdg): For now we\u0027re assuming no multi-attach, so if"},{"line_number":444,"context_line":"        # an attach_id exists, we use it and update the record"},{"line_number":445,"context_line":"        # we can adapt this easily for multi-attach by inspecting"},{"line_number":446,"context_line":"        # details like instance.id and connection_info.  Only trick"},{"line_number":447,"context_line":"        # is if we do \"multi-attach to same instance\""},{"line_number":448,"context_line":"        # We do this special handling for things like unshelve/migrate"},{"line_number":449,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":450,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_5c3559f6","line":447,"range":{"start_line":443,"start_character":0,"end_line":447,"end_character":53},"in_reply_to":"ff82abbf_11e26802","updated":"2017-11-23 02:34:54.000000000","message":"Yeah, I think so too, again will double check to be sure we don\u0027t miss anything.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":456,"context_line":"            self[\u0027connection_info\u0027])"},{"line_number":457,"context_line":"        self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        if \u0027serial\u0027 not in self[\u0027connection_info\u0027]:"},{"line_number":460,"context_line":"            self[\u0027connection_info\u0027][\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_9192f84a","line":457,"updated":"2017-11-22 15:30:04.000000000","message":"Why is this here? I thought we will always refetch this from Cinder now? I guess it keeps us consistent with the refresh logic below, but I would rather it was always None, so we knew there was no reuse.\n\nMaybe this is a follow on patch?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":456,"context_line":"            self[\u0027connection_info\u0027])"},{"line_number":457,"context_line":"        self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        if \u0027serial\u0027 not in self[\u0027connection_info\u0027]:"},{"line_number":460,"context_line":"            self[\u0027connection_info\u0027][\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_9ce0c198","line":457,"in_reply_to":"ff82abbf_9192f84a","updated":"2017-11-23 02:34:54.000000000","message":"I thought we said we will store this in Nova, but can clean up anytime if it was a misunderstanding.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a956196f2948556a8c736ee466ec0da70f0544fb","unresolved":false,"context_lines":[{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":456,"context_line":"            self[\u0027connection_info\u0027])"},{"line_number":457,"context_line":"        self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        if \u0027serial\u0027 not in self[\u0027connection_info\u0027]:"},{"line_number":460,"context_line":"            self[\u0027connection_info\u0027][\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_cc0e8c31","line":457,"in_reply_to":"ff82abbf_9ce0c198","updated":"2017-11-23 10:20:50.000000000","message":"Long term I think we said no need to store it in Nova because its in Cinder, stops any confusion to always fetch from cinder.\n\nShort term, I get it probably needs to stay while we untangle things. Maybe worth adding a TODO around it? Not sure...","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"341f22c47602149bb70ffe5452d3b56c93d57432","unresolved":false,"context_lines":[{"line_number":454,"context_line":""},{"line_number":455,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":456,"context_line":"            self[\u0027connection_info\u0027])"},{"line_number":457,"context_line":"        self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        if \u0027serial\u0027 not in self[\u0027connection_info\u0027]:"},{"line_number":460,"context_line":"            self[\u0027connection_info\u0027][\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_ccd68cc4","line":457,"in_reply_to":"ff82abbf_cc0e8c31","updated":"2017-12-01 12:24:03.000000000","message":"Yep, you\u0027re right. I wonder whether things would badly blow up if I just removed this from here?\n\nI will give it a try to remove it in a dedicated patch set and see what happens. Honestly it should work, I don\u0027t think we use this anywhere form the BDM in the new flow.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":462,"context_line":"        if self.volume_size is None:"},{"line_number":463,"context_line":"            self.volume_size \u003d volume.get(\u0027size\u0027)"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        self._preserve_multipath_id(self[\u0027connection_info\u0027])"},{"line_number":466,"context_line":"        self.save()"},{"line_number":467,"context_line":"        if do_driver_attach:"},{"line_number":468,"context_line":"            encryption \u003d encryptors.get_encryption_metadata("}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_f15fc43e","line":465,"updated":"2017-11-22 15:30:04.000000000","message":"Hmm, how does this work with the new flow, surely we need to use the save value Cinder is using / gave us? Confusing.\n\nhttps://github.com/openstack/nova/commit/3ea14e8a70a946dbb162ecafa848e4f2fa29772a\n\nMaybe we just add a TODO to revist this later, and check we are multi-path safe on live-migration?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                # in the stack (api or manager layer) but there are cases where"},{"line_number":479,"context_line":"                # this is triggered by things that aren\u0027t so clear, so we try"},{"line_number":480,"context_line":"                # this default point here after the connect call which covers"},{"line_number":481,"context_line":"                # us in MOST cases except things like shelve and migrate."},{"line_number":482,"context_line":"            except Exception:"},{"line_number":483,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":484,"context_line":"                    LOG.exception(\"Driver failed to attach volume \""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_9198b81b","line":481,"updated":"2017-11-22 15:30:04.000000000","message":"What is this comment trying to say? I am not sure. Does it mean attachment_delete might be dodgy here, but seems the best first attempt?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                # in the stack (api or manager layer) but there are cases where"},{"line_number":479,"context_line":"                # this is triggered by things that aren\u0027t so clear, so we try"},{"line_number":480,"context_line":"                # this default point here after the connect call which covers"},{"line_number":481,"context_line":"                # us in MOST cases except things like shelve and migrate."},{"line_number":482,"context_line":"            except Exception:"},{"line_number":483,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":484,"context_line":"                    LOG.exception(\"Driver failed to attach volume \""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_dcff2932","line":481,"in_reply_to":"ff82abbf_9198b81b","updated":"2017-11-23 02:34:54.000000000","message":"Sorry, it\u0027s a leftover.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a956196f2948556a8c736ee466ec0da70f0544fb","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                # in the stack (api or manager layer) but there are cases where"},{"line_number":479,"context_line":"                # this is triggered by things that aren\u0027t so clear, so we try"},{"line_number":480,"context_line":"                # this default point here after the connect call which covers"},{"line_number":481,"context_line":"                # us in MOST cases except things like shelve and migrate."},{"line_number":482,"context_line":"            except Exception:"},{"line_number":483,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":484,"context_line":"                    LOG.exception(\"Driver failed to attach volume \""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_8c188475","line":481,"in_reply_to":"ff82abbf_dcff2932","updated":"2017-11-23 10:20:50.000000000","message":"No worries, I thought I was missing something big.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":489,"context_line":"                    volume_api.attachment_delete(context,"},{"line_number":490,"context_line":"                                                 attachment_id)"},{"line_number":491,"context_line":"        volume_api.attachment_complete(context, attachment_id)"},{"line_number":492,"context_line":"        self.save()"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    @update_db"},{"line_number":495,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_b1929cf5","line":492,"updated":"2017-11-22 15:30:04.000000000","message":"Does this extra save() ever do anything here?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":489,"context_line":"                    volume_api.attachment_delete(context,"},{"line_number":490,"context_line":"                                                 attachment_id)"},{"line_number":491,"context_line":"        volume_api.attachment_complete(context, attachment_id)"},{"line_number":492,"context_line":"        self.save()"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    @update_db"},{"line_number":495,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_bc04a54b","line":492,"in_reply_to":"ff82abbf_b1929cf5","updated":"2017-11-23 02:34:54.000000000","message":"I think at this point it might not so I\u0027ll remove it.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1a6198c8acb4ef19f263559e4e4f8a432d7734b4","unresolved":false,"context_lines":[{"line_number":489,"context_line":"                    volume_api.attachment_delete(context,"},{"line_number":490,"context_line":"                                                 attachment_id)"},{"line_number":491,"context_line":"        volume_api.attachment_complete(context, attachment_id)"},{"line_number":492,"context_line":"        self.save()"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    @update_db"},{"line_number":495,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":153,"id":"df87a7cf_92c73846","line":492,"in_reply_to":"ff82abbf_bc04a54b","updated":"2017-12-06 20:39:17.000000000","message":"This is equivalent to the @update_db decorator in the attach() method doing the save() for us, so yes, it\u0027s not needed here.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3b9621eace6a8bcebe326675db86cd04a42101e2","unresolved":false,"context_lines":[{"line_number":428,"context_line":"                    # happen, the detach request will be ignored."},{"line_number":429,"context_line":"                    volume_api.detach(context, volume_id)"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"    def _volume_attach(self, context, volume, connector, instance,"},{"line_number":432,"context_line":"                       volume_api, virt_driver, attachment_id,"},{"line_number":433,"context_line":"                       do_driver_attach\u003dFalse):"},{"line_number":434,"context_line":"        # This is where we actually (finally) make a call down to the device"}],"source_content_type":"text/x-python","patch_set":169,"id":"df87a7cf_a6bb39c2","line":431,"updated":"2017-12-05 20:07:43.000000000","message":"From what I can tell, none of this is tested in nova/tests/unit/virt/test_block_device.py. I think we could do that pretty easily by extending TestDriverBlockDevice and update self.volume_bdm to have an attachment_id set, then deal with whatever mocks we need to deal with.","commit_id":"71ed107f366a0025dc3a9bc2a401c2b1f65442ba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8fe1392c7bce7465aca33c4d76342c91a0676b6","unresolved":false,"context_lines":[{"line_number":446,"context_line":"        connector[\u0027mount_device\u0027] \u003d self[\u0027mount_device\u0027]"},{"line_number":447,"context_line":"        LOG.debug(\"Updating existing attachment record: %s\","},{"line_number":448,"context_line":"                  attachment_id)"},{"line_number":449,"context_line":"        self[\u0027connection_info\u0027] \u003d volume_api.attachment_update("},{"line_number":450,"context_line":"            context, attachment_id, connector)[\u0027connection_info\u0027]"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        # NOTE(ildikov): With the new attach flow Cinder stores the"},{"line_number":453,"context_line":"        # connection_info as well. In principle we would like to retrieve the"}],"source_content_type":"text/x-python","patch_set":169,"id":"df87a7cf_665d31e8","line":450,"range":{"start_line":449,"start_character":8,"end_line":450,"end_character":46},"updated":"2017-12-05 19:50:36.000000000","message":"I think for the shelved offloaded attach case this should be OK as well, because I don\u0027t see any state checks in the cinder side where it won\u0027t let you update a \"completed\" attachment.","commit_id":"71ed107f366a0025dc3a9bc2a401c2b1f65442ba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8fe1392c7bce7465aca33c4d76342c91a0676b6","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                                  instance\u003dinstance)"},{"line_number":484,"context_line":"                    volume_api.attachment_delete(context,"},{"line_number":485,"context_line":"                                                 attachment_id)"},{"line_number":486,"context_line":"        volume_api.attachment_complete(context, attachment_id)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    @update_db"},{"line_number":489,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"}],"source_content_type":"text/x-python","patch_set":169,"id":"df87a7cf_06dd456f","line":486,"updated":"2017-12-05 19:50:36.000000000","message":"For the shelve offloadd / unshelve case with a volume attached while the instance was shelved offloaded, it looks like this should be fine, the attachment_complete call is idempotent:\n\nhttps://github.com/openstack/cinder/blob/master/cinder/api/v3/attachments.py#L262","commit_id":"71ed107f366a0025dc3a9bc2a401c2b1f65442ba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a8fe1392c7bce7465aca33c4d76342c91a0676b6","unresolved":false,"context_lines":[{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    @update_db"},{"line_number":489,"context_line":"    def attach(self, context, instance, volume_api, virt_driver,"},{"line_number":490,"context_line":"               do_check_attach\u003dTrue, do_driver_attach\u003dFalse, **kwargs):"},{"line_number":491,"context_line":"        volume \u003d volume_api.get(context, self.volume_id)"},{"line_number":492,"context_line":"        volume_api.check_availability_zone(context, volume,"},{"line_number":493,"context_line":"                                           instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":169,"id":"df87a7cf_f329059b","line":490,"range":{"start_line":490,"start_character":15,"end_line":490,"end_character":30},"updated":"2017-12-05 19:50:36.000000000","message":"This must be a rebase failure because this isn\u0027t used.","commit_id":"71ed107f366a0025dc3a9bc2a401c2b1f65442ba"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8349a1d0f2e3ecf74d8534f50840b7bef6bc5f44","unresolved":false,"context_lines":[{"line_number":455,"context_line":"        # so we keep storing it in the BDM for now."},{"line_number":456,"context_line":"        connection_info_string \u003d jsonutils.dumps("},{"line_number":457,"context_line":"            self[\u0027connection_info\u0027])"},{"line_number":458,"context_line":"        self._bdm_obj.connection_info \u003d connection_info_string"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"        if \u0027serial\u0027 not in self[\u0027connection_info\u0027]:"},{"line_number":461,"context_line":"            self[\u0027connection_info\u0027][\u0027serial\u0027] \u003d self.volume_id"}],"source_content_type":"text/x-python","patch_set":170,"id":"df87a7cf_3f288c32","line":458,"range":{"start_line":458,"start_character":8,"end_line":458,"end_character":62},"updated":"2017-12-05 23:20:07.000000000","message":"We shouldn\u0027t need to do this, the save() method on this object, called via the @update_db decorator, will do this for us.","commit_id":"ccd0044d219176475adf6255e817a432785b6774"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c531d451f95b5ea828ace1906c33bf660153050c","unresolved":false,"context_lines":[{"line_number":464,"context_line":"            self.volume_size \u003d volume.get(\u0027size\u0027)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        self._preserve_multipath_id(self[\u0027connection_info\u0027])"},{"line_number":467,"context_line":"        self.save()"},{"line_number":468,"context_line":"        if do_driver_attach:"},{"line_number":469,"context_line":"            encryption \u003d encryptors.get_encryption_metadata("},{"line_number":470,"context_line":"                context, volume_api, volume_id, self[\u0027connection_info\u0027])"}],"source_content_type":"text/x-python","patch_set":170,"id":"df87a7cf_24aac1d1","line":467,"range":{"start_line":467,"start_character":8,"end_line":467,"end_character":19},"updated":"2017-12-05 21:40:22.000000000","message":"Why don\u0027t we do this *after* the virt_driver.attach_volume call is successful like in the legacy flow? Otherwise we now have a BDM with connection_info set in Nova even though we failed to connect the volume.","commit_id":"ccd0044d219176475adf6255e817a432785b6774"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c531d451f95b5ea828ace1906c33bf660153050c","unresolved":false,"context_lines":[{"line_number":565,"context_line":"            av_zone \u003d _get_volume_create_az_value(instance)"},{"line_number":566,"context_line":"            snapshot \u003d volume_api.get_snapshot(context,"},{"line_number":567,"context_line":"                                               self.snapshot_id)"},{"line_number":568,"context_line":"            vol \u003d volume_api.create(context, self.volume_size, \u0027\u0027, \u0027\u0027,"},{"line_number":569,"context_line":"                                    snapshot, availability_zone\u003dav_zone)"},{"line_number":570,"context_line":"            if wait_func:"},{"line_number":571,"context_line":"                self._call_wait_func(context, wait_func, volume_api, vol[\u0027id\u0027])"},{"line_number":572,"context_line":""}],"source_content_type":"text/x-python","patch_set":170,"id":"df87a7cf_04cc5d68","line":569,"range":{"start_line":568,"start_character":12,"end_line":569,"end_character":72},"updated":"2017-12-05 21:40:22.000000000","message":"For this case, and \u0027image\u0027 and \u0027blank\u0027 below, where we create a volume, things fail to go down the \u0027new\u0027 flow because we don\u0027t have an attachment_id set on this BDM object. So for boot from volume with an source_type\u003dsnapshot/image/blank device, we create the volume and then we need to create the attachment? That would require doing the same checks as in the API, so I\u0027m thinking we expect legacy flow in this case. That should affect multiattach boot from volume because we said you can\u0027t create a multiattach volume via nova during boot from volume.","commit_id":"ccd0044d219176475adf6255e817a432785b6774"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":6570,"context_line":"        connector \u003d self.get_volume_connector(instance)"},{"line_number":6571,"context_line":"        volume_api \u003d self._volume_api"},{"line_number":6572,"context_line":"        for vol in block_device_mapping:"},{"line_number":6573,"context_line":"            # FIXME(jdg): Should implement/use a Cinder get_connection_info"},{"line_number":6574,"context_line":"            # method for this sort of thing instead of dual purposing the"},{"line_number":6575,"context_line":"            # initialize_connection call"},{"line_number":6576,"context_line":""},{"line_number":6577,"context_line":"            # Retrieve connection info from Cinder\u0027s initialize_connection API."},{"line_number":6578,"context_line":"            # The info returned will be accurate for the source server."}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_ee73d24b","line":6575,"range":{"start_line":6573,"start_character":12,"end_line":6575,"end_character":40},"updated":"2016-06-20 16:58:02.000000000","message":"Does https://review.openstack.org/#/c/312773/ help here?","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"79f60c3fdd8f91c4322d6c002e2f911504768359","unresolved":false,"context_lines":[{"line_number":6570,"context_line":"        connector \u003d self.get_volume_connector(instance)"},{"line_number":6571,"context_line":"        volume_api \u003d self._volume_api"},{"line_number":6572,"context_line":"        for vol in block_device_mapping:"},{"line_number":6573,"context_line":"            # FIXME(jdg): Should implement/use a Cinder get_connection_info"},{"line_number":6574,"context_line":"            # method for this sort of thing instead of dual purposing the"},{"line_number":6575,"context_line":"            # initialize_connection call"},{"line_number":6576,"context_line":""},{"line_number":6577,"context_line":"            # Retrieve connection info from Cinder\u0027s initialize_connection API."},{"line_number":6578,"context_line":"            # The info returned will be accurate for the source server."}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_3f6065ce","line":6575,"range":{"start_line":6573,"start_character":12,"end_line":6575,"end_character":40},"in_reply_to":"5a9d85d2_ee73d24b","updated":"2016-06-20 17:45:52.000000000","message":"It looks like it probably would.  Honestly though, I am not crazy about storing/persisting that info on the Nova side... I think it\u0027s more intuitive to add it to the flow and give it an explicit call on the Cinder side.  One of the things I\u0027d like to achieve if we can is eliminate the split-brain scenario for Volume data.\n\nAlso to be honest I think there are other uses cases where this would be beneficial.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"            \u0027device_name\u0027: disk_dev,"},{"line_number":1200,"context_line":"            \u0027disk_bus\u0027: disk_bus,"},{"line_number":1201,"context_line":"            \u0027device_type\u0027: device_type,"},{"line_number":1202,"context_line":"            \u0027attachment_id\u0027: connection_info[\u0027attachment_id\u0027]}"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        # Note(cfb): If the volume has a custom block size, check that"},{"line_number":1205,"context_line":"        #            that we are using QEMU/KVM and libvirt \u003e\u003d 0.10.2. The"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_e4141feb","line":1202,"range":{"start_line":1202,"start_character":29,"end_line":1202,"end_character":61},"updated":"2017-05-25 03:14:21.000000000","message":"This shouldn\u0027t be in here.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"78e0eab67212b41a06c98824375f2d99b539b662","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"            \u0027device_name\u0027: disk_dev,"},{"line_number":1200,"context_line":"            \u0027disk_bus\u0027: disk_bus,"},{"line_number":1201,"context_line":"            \u0027device_type\u0027: device_type,"},{"line_number":1202,"context_line":"            \u0027volume_id\u0027: connection_info[\u0027volume_id\u0027]}"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        # Note(cfb): If the volume has a custom block size, check that"},{"line_number":1205,"context_line":"        #            that we are using QEMU/KVM and libvirt \u003e\u003d 0.10.2. The"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_86878762","line":1202,"range":{"start_line":1202,"start_character":25,"end_line":1202,"end_character":40},"updated":"2017-05-25 23:57:24.000000000","message":"I\u0027m missing something with the attach flow, when we call detach right now we iterate through the bdm\u0027s looking for the volume_id but currently it\u0027s not finding it; need to figure this out next.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"3f3b11533596f594cf2a9f3318ea7172c446b70f","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"            \u0027device_name\u0027: disk_dev,"},{"line_number":1200,"context_line":"            \u0027disk_bus\u0027: disk_bus,"},{"line_number":1201,"context_line":"            \u0027device_type\u0027: device_type,"},{"line_number":1202,"context_line":"            \u0027volume_id\u0027: connection_info[\u0027volume_id\u0027]}"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"        # Note(cfb): If the volume has a custom block size, check that"},{"line_number":1205,"context_line":"        #            that we are using QEMU/KVM and libvirt \u003e\u003d 0.10.2. The"}],"source_content_type":"text/x-python","patch_set":39,"id":"ff0f0b1f_13e03f96","line":1202,"range":{"start_line":1202,"start_character":25,"end_line":1202,"end_character":40},"in_reply_to":"ff0f0b1f_86878762","updated":"2017-05-26 17:54:44.000000000","message":"Done - Yeah, it\u0027s the brick issue, updating brick fixes this so I\u0027ll remove this little hacky thing.","commit_id":"359b102d986f1154c3113eae4d3b8d42977b1e12"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"44e382ed5a46b10ddb471a13b1d6c9dba5d39850","unresolved":false,"context_lines":[{"line_number":6956,"context_line":"        connector \u003d self.get_volume_connector(instance)"},{"line_number":6957,"context_line":"        volume_api \u003d self._volume_api"},{"line_number":6958,"context_line":"        for vol in block_device_mapping:"},{"line_number":6959,"context_line":"            # FIXME(jdg): Should implement/use a Cinder get_connection_info"},{"line_number":6960,"context_line":"            # method for this sort of thing instead of dual purposing the"},{"line_number":6961,"context_line":"            # initialize_connection call"},{"line_number":6962,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"df140735_e3b17491","line":6959,"updated":"2017-05-30 14:10:39.000000000","message":"I have this covered in the live migration change here - https://review.openstack.org/#/c/463987/","commit_id":"5d1fbae5d2caac463a42f26b4fef9569722afbfc"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"9550d5bf02a40fefc3ee01cdea7a2c5a447c87f4","unresolved":false,"context_lines":[{"line_number":6956,"context_line":"        connector \u003d self.get_volume_connector(instance)"},{"line_number":6957,"context_line":"        volume_api \u003d self._volume_api"},{"line_number":6958,"context_line":"        for vol in block_device_mapping:"},{"line_number":6959,"context_line":"            # FIXME(jdg): Should implement/use a Cinder get_connection_info"},{"line_number":6960,"context_line":"            # method for this sort of thing instead of dual purposing the"},{"line_number":6961,"context_line":"            # initialize_connection call"},{"line_number":6962,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"df140735_d7cf4a7d","line":6959,"in_reply_to":"df140735_e3b17491","updated":"2017-05-30 16:00:04.000000000","message":"Cool, I\u0027ll remove the note; thanks Steve!","commit_id":"5d1fbae5d2caac463a42f26b4fef9569722afbfc"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"872cbdb908ba9c8f7bcbb0384922fcc27d1d7bf1","unresolved":false,"context_lines":[{"line_number":6980,"context_line":"            # multipath_id can be placed into the connection info"},{"line_number":6981,"context_line":"            # because it is based off of the volume and will be the"},{"line_number":6982,"context_line":"            # same on the source and destination hosts."},{"line_number":6983,"context_line":"            if \u0027multipath_id\u0027 in vol[\u0027connection_info\u0027][\u0027data\u0027]:"},{"line_number":6984,"context_line":"                multipath_id \u003d vol[\u0027connection_info\u0027][\u0027data\u0027][\u0027multipath_id\u0027]"},{"line_number":6985,"context_line":"                connection_info[\u0027data\u0027][\u0027multipath_id\u0027] \u003d multipath_id"},{"line_number":6986,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"bf091321_b4a3c44f","line":6983,"updated":"2017-06-08 14:35:57.000000000","message":"I am running into problems with the \u0027data\u0027 key not present in connection_info. I think it\u0027s related to some other changes you made elsewhere?\n\n(Pdb) vol\n{\u0027guest_format\u0027: None, \u0027boot_index\u0027: None, \u0027mount_device\u0027: u\u0027/dev/vdb\u0027, \u0027connection_info\u0027: {u\u0027access_mode\u0027: u\u0027rw\u0027, u\u0027attachment_id\u0027: u\u0027e338628b-0d06-47aa-a776-b924e34c9d71\u0027, u\u0027target_discovered\u0027: u\u0027False\u0027, u\u0027encrypted\u0027: u\u0027False\u0027, u\u0027driver_volume_type\u0027: u\u0027iscsi\u0027, u\u0027qos_specs\u0027: None, u\u0027target_iqn\u0027: u\u0027iqn.2010-10.org.openstack:volume-3a504278-3eb0-462e-a59f-77007fe1be77\u0027, u\u0027target_portal\u0027: u\u0027192.168.0.181:3260\u0027, u\u0027volume_id\u0027: u\u00273a504278-3eb0-462e-a59f-77007fe1be77\u0027, u\u0027target_lun\u0027: u\u00271\u0027, u\u0027serial\u0027: u\u00273a504278-3eb0-462e-a59f-77007fe1be77\u0027, u\u0027auth_password\u0027: u\u0027TBqSBpc82TLJVPeR\u0027, u\u0027auth_username\u0027: u\u0027TLEH62rioYBKiEhFmUEX\u0027, u\u0027auth_method\u0027: u\u0027CHAP\u0027}, \u0027disk_bus\u0027: None, \u0027device_type\u0027: None, \u0027attachment_id\u0027: \u0027e338628b-0d06-47aa-a776-b924e34c9d71\u0027, \u0027delete_on_termination\u0027: False}\n\n(Pdb) vol[\u0027connection_info\u0027][\u0027data\u0027]\n*** KeyError: \u0027data\u0027","commit_id":"0a9465d2c8d42390c10e2de61c34e5d6480eb2cd"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"6c5ae9001da6adde8a62ea3661a2d8d6f92c56f0","unresolved":false,"context_lines":[{"line_number":6980,"context_line":"            # multipath_id can be placed into the connection info"},{"line_number":6981,"context_line":"            # because it is based off of the volume and will be the"},{"line_number":6982,"context_line":"            # same on the source and destination hosts."},{"line_number":6983,"context_line":"            if \u0027multipath_id\u0027 in vol[\u0027connection_info\u0027][\u0027data\u0027]:"},{"line_number":6984,"context_line":"                multipath_id \u003d vol[\u0027connection_info\u0027][\u0027data\u0027][\u0027multipath_id\u0027]"},{"line_number":6985,"context_line":"                connection_info[\u0027data\u0027][\u0027multipath_id\u0027] \u003d multipath_id"},{"line_number":6986,"context_line":""}],"source_content_type":"text/x-python","patch_set":46,"id":"bf091321_d7a4fa0a","line":6983,"in_reply_to":"bf091321_b4a3c44f","updated":"2017-06-08 14:42:22.000000000","message":"That\u0027s correct, we started to remove the \u0027data\u0027 key, but obviously haven\u0027t done a thorough enough job as of yet. Thanks for pointing it out.","commit_id":"0a9465d2c8d42390c10e2de61c34e5d6480eb2cd"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"8f4f243810b2348618702934ab34ff38251ae515","unresolved":false,"context_lines":[{"line_number":6997,"context_line":"            # multipath_id can be placed into the connection info"},{"line_number":6998,"context_line":"            # because it is based off of the volume and will be the"},{"line_number":6999,"context_line":"            # same on the source and destination hosts."},{"line_number":7000,"context_line":"            if \u0027multipath_id\u0027 in vol[\u0027connection_info\u0027][\u0027data\u0027]:"},{"line_number":7001,"context_line":"                multipath_id \u003d vol[\u0027connection_info\u0027][\u0027data\u0027][\u0027multipath_id\u0027]"},{"line_number":7002,"context_line":"                connection_info[\u0027data\u0027][\u0027multipath_id\u0027] \u003d multipath_id"},{"line_number":7003,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_47915199","line":7000,"updated":"2017-06-21 17:43:07.000000000","message":"[\u0027data\u0027] should be removed here, and in the next 2 lines.","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fef775cd69dd682ced954cb3675d3ef858a5dcc9","unresolved":false,"context_lines":[{"line_number":6997,"context_line":"            # multipath_id can be placed into the connection info"},{"line_number":6998,"context_line":"            # because it is based off of the volume and will be the"},{"line_number":6999,"context_line":"            # same on the source and destination hosts."},{"line_number":7000,"context_line":"            if \u0027multipath_id\u0027 in vol[\u0027connection_info\u0027][\u0027data\u0027]:"},{"line_number":7001,"context_line":"                multipath_id \u003d vol[\u0027connection_info\u0027][\u0027data\u0027][\u0027multipath_id\u0027]"},{"line_number":7002,"context_line":"                connection_info[\u0027data\u0027][\u0027multipath_id\u0027] \u003d multipath_id"},{"line_number":7003,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_800e208b","line":7000,"in_reply_to":"5f201791_47915199","updated":"2017-09-27 09:47:09.000000000","message":"Done","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"}],"nova/virt/libvirt/volume/iscsi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        conf \u003d super(LibvirtISCSIVolumeDriver,"},{"line_number":54,"context_line":"                     self).get_config(connection_info, disk_info)"},{"line_number":55,"context_line":"        conf.source_type \u003d \"block\""},{"line_number":56,"context_line":"        conf.source_path \u003d connection_info[\u0027device_path\u0027]"},{"line_number":57,"context_line":"        conf.driver_io \u003d \"native\""},{"line_number":58,"context_line":"        return conf"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_a4d86752","line":56,"updated":"2017-05-25 03:14:21.000000000","message":"Why does all of this need to change?","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fce4fe48522ce3076f5cbc9d1287a5dfa3e97bcd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        conf \u003d super(LibvirtISCSIVolumeDriver,"},{"line_number":54,"context_line":"                     self).get_config(connection_info, disk_info)"},{"line_number":55,"context_line":"        conf.source_type \u003d \"block\""},{"line_number":56,"context_line":"        conf.source_path \u003d connection_info[\u0027device_path\u0027]"},{"line_number":57,"context_line":"        conf.driver_io \u003d \"native\""},{"line_number":58,"context_line":"        return conf"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_56e350a5","line":56,"in_reply_to":"ff0f0b1f_340e9732","updated":"2017-05-26 12:16:39.000000000","message":"Can we sort it out with the microversion somehow?\n\nI mean if it makes connection_info less messy then it might worth a try. Not a strong preference, just thought to ask as we\u0027re going down on the path of trying to clean things up.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a97fe07f498c32ee1a558bf27d14fbc4117830a9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        conf \u003d super(LibvirtISCSIVolumeDriver,"},{"line_number":54,"context_line":"                     self).get_config(connection_info, disk_info)"},{"line_number":55,"context_line":"        conf.source_type \u003d \"block\""},{"line_number":56,"context_line":"        conf.source_path \u003d connection_info[\u0027device_path\u0027]"},{"line_number":57,"context_line":"        conf.driver_io \u003d \"native\""},{"line_number":58,"context_line":"        return conf"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_340e9732","line":56,"in_reply_to":"ff0f0b1f_8382e451","updated":"2017-05-26 11:16:59.000000000","message":"I think you need to put it back, seems backward incompatible otherwise, especially if we\u0027re not using cinder 3.27.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        conf \u003d super(LibvirtISCSIVolumeDriver,"},{"line_number":54,"context_line":"                     self).get_config(connection_info, disk_info)"},{"line_number":55,"context_line":"        conf.source_type \u003d \"block\""},{"line_number":56,"context_line":"        conf.source_path \u003d connection_info[\u0027device_path\u0027]"},{"line_number":57,"context_line":"        conf.driver_io \u003d \"native\""},{"line_number":58,"context_line":"        return conf"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_8382e451","line":56,"in_reply_to":"ff0f0b1f_a4d86752","updated":"2017-05-25 23:43:14.000000000","message":"so the data structure on the connection info in the past was kinda dumb; it had an extra-layer for connection_info that had everything under the data key which was annoying.  I modified that along the way and just made everything a K/V under connection_info.  I\u0027ll look into this and make sure it is still in place.\n\nIf there\u0027s a desire to leave the extra level of Keys I can modify/put-back","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        LOG.debug(\"calling os-brick to detach iSCSI Volume\")"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            self.connector.disconnect_volume(connection_info, None)"},{"line_number":75,"context_line":"        except os_brick_exception.VolumeDeviceNotFound as exc:"},{"line_number":76,"context_line":"            LOG.warning(_LW(\u0027Ignoring VolumeDeviceNotFound: %s\u0027), exc)"},{"line_number":77,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_44e98be3","line":74,"updated":"2017-05-25 03:14:21.000000000","message":"This won\u0027t be right for old style attachments created in ocata (or juno).","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        LOG.debug(\"calling os-brick to detach iSCSI Volume\")"},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            self.connector.disconnect_volume(connection_info, None)"},{"line_number":75,"context_line":"        except os_brick_exception.VolumeDeviceNotFound as exc:"},{"line_number":76,"context_line":"            LOG.warning(_LW(\u0027Ignoring VolumeDeviceNotFound: %s\u0027), exc)"},{"line_number":77,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_e392c09f","line":74,"in_reply_to":"ff0f0b1f_44e98be3","updated":"2017-05-25 23:43:14.000000000","message":"correct, I\u0027ll do a temporary work around for that and if we want to just continue using the data key I can update everything to do that later.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"f0269f592f8db64e7c3c6353384bc24f4a7e4924","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def connect_volume(self, connection_info, disk_info, instance):"},{"line_number":61,"context_line":"        \"\"\"Attach the volume to instance_name.\"\"\""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        LOG.debug(\"Calling os-brick to attach iSCSI Volume\")"},{"line_number":64,"context_line":"        device_info \u003d self.connector.connect_volume(connection_info)"},{"line_number":65,"context_line":"        LOG.debug(\"Attached iSCSI volume %s\", device_info)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_27a9b57a","line":63,"updated":"2017-06-21 18:01:07.000000000","message":"fyi, to avoid bug https://bugs.launchpad.net/cinder/+bug/1692153, I inserted this line here:\n\nconnection_info[\u0027target_lun\u0027] \u003d \\  \n    int(connection_info[\u0027target_lun\u0027])","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"fef775cd69dd682ced954cb3675d3ef858a5dcc9","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def connect_volume(self, connection_info, disk_info, instance):"},{"line_number":61,"context_line":"        \"\"\"Attach the volume to instance_name.\"\"\""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        LOG.debug(\"Calling os-brick to attach iSCSI Volume\")"},{"line_number":64,"context_line":"        device_info \u003d self.connector.connect_volume(connection_info)"},{"line_number":65,"context_line":"        LOG.debug(\"Attached iSCSI volume %s\", device_info)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_871e48b8","line":63,"in_reply_to":"5f201791_27a9b57a","updated":"2017-09-27 09:47:09.000000000","message":"It\u0027s fixed in brick, it \"only\" needs a release. We need to figure out how to handle it better in Cinder though.","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":17386,"name":"Steve Noyes","email":"steve.noyes@oracle.com","username":"ssn1ssn"},"change_message_id":"f0269f592f8db64e7c3c6353384bc24f4a7e4924","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        LOG.debug(\"calling os-brick to detach iSCSI Volume\")"},{"line_number":73,"context_line":"        con_info \u003d connection_info.get(\u0027data\u0027, None)"},{"line_number":74,"context_line":"        if not con_info:"},{"line_number":75,"context_line":"            con_info \u003d connection_info"},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            self.connector.disconnect_volume(con_info, None)"},{"line_number":78,"context_line":"        except os_brick_exception.VolumeDeviceNotFound as exc:"}],"source_content_type":"text/x-python","patch_set":51,"id":"5f201791_47c5d13b","line":75,"updated":"2017-06-21 18:01:07.000000000","message":"and likewise to avoid bug https://bugs.launchpad.net/cinder/+bug/1692153, I inserted this line here:\n\ncon_info[\u0027target_lun\u0027] \u003d int(con_info[\u0027target_lun\u0027])","commit_id":"27f36ac23056a0d324cdcddc477954f5fa8dd883"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\"Attach the volume to instance_name.\"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        LOG.debug(\"Calling os-brick to attach iSCSI Volume\")"},{"line_number":63,"context_line":"        connection_info[\u0027data\u0027][\u0027target_lun\u0027] \u003d \\"},{"line_number":64,"context_line":"            int(connection_info[\u0027data\u0027][\u0027target_lun\u0027])"},{"line_number":65,"context_line":"        device_info \u003d self.connector.connect_volume(connection_info[\u0027data\u0027])"},{"line_number":66,"context_line":"        LOG.debug(\"Attached iSCSI volume %s\", device_info)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_e32e19f9","line":64,"range":{"start_line":63,"start_character":8,"end_line":64,"end_character":54},"updated":"2017-07-21 02:24:43.000000000","message":"I don\u0027t see why this is a necessary change in this patch.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"bd780c5b4db556ca464063193df600be7a41e69e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\"Attach the volume to instance_name.\"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        LOG.debug(\"Calling os-brick to attach iSCSI Volume\")"},{"line_number":63,"context_line":"        connection_info[\u0027data\u0027][\u0027target_lun\u0027] \u003d \\"},{"line_number":64,"context_line":"            int(connection_info[\u0027data\u0027][\u0027target_lun\u0027])"},{"line_number":65,"context_line":"        device_info \u003d self.connector.connect_volume(connection_info[\u0027data\u0027])"},{"line_number":66,"context_line":"        LOG.debug(\"Attached iSCSI volume %s\", device_info)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_9daa1517","line":64,"range":{"start_line":63,"start_character":8,"end_line":64,"end_character":54},"in_reply_to":"1f1a1f67_0f124fb2","updated":"2017-07-21 09:26:52.000000000","message":"Done","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\"Attach the volume to instance_name.\"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        LOG.debug(\"Calling os-brick to attach iSCSI Volume\")"},{"line_number":63,"context_line":"        connection_info[\u0027data\u0027][\u0027target_lun\u0027] \u003d \\"},{"line_number":64,"context_line":"            int(connection_info[\u0027data\u0027][\u0027target_lun\u0027])"},{"line_number":65,"context_line":"        device_info \u003d self.connector.connect_volume(connection_info[\u0027data\u0027])"},{"line_number":66,"context_line":"        LOG.debug(\"Attached iSCSI volume %s\", device_info)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_0f124fb2","line":64,"range":{"start_line":63,"start_character":8,"end_line":64,"end_character":54},"in_reply_to":"1f1a1f67_e32e19f9","updated":"2017-07-21 08:14:39.000000000","message":"The change is here temporarily, as I commented on this earlier I will check whether the brick release is all set and remove this.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"}],"nova/volume/cinder.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                                                   instance_uuid, mountpoint)"},{"line_number":528,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":529,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":530,"context_line":"                LOG.error(_LE(\u0027Create attachment failed for volume \u0027"},{"line_number":531,"context_line":"                              \u0027on host %(host)s. Error: %(msg)s \u0027"},{"line_number":532,"context_line":"                              \u0027Code: %(code)s.\u0027),"},{"line_number":533,"context_line":"                          {\u0027host\u0027: connector.get(\u0027host\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_6914fcf4","line":530,"range":{"start_line":530,"start_character":60,"end_line":530,"end_character":66},"updated":"2016-06-20 16:58:02.000000000","message":"Would be good to have the volume id in the error message for context.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                          {\u0027host\u0027: connector.get(\u0027host\u0027),"},{"line_number":534,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"},{"line_number":535,"context_line":"                           \u0027code\u0027: ex.code},"},{"line_number":536,"context_line":"                          resource\u003d{\u0027type\u0027: \u0027volume\u0027,"},{"line_number":537,"context_line":"                                    \u0027id\u0027: volume_id})"},{"line_number":538,"context_line":"        return attachment_info"},{"line_number":539,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_091bb81c","line":536,"range":{"start_line":536,"start_character":26,"end_line":536,"end_character":34},"updated":"2016-06-20 16:58:02.000000000","message":"This is a cinder-specific thing. :)\n\nYou\u0027d pass instance_uuid\u003dinstance_uuid for logging context in nova.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":546,"context_line":"                                                   instance_uuid, mountpoint)"},{"line_number":547,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":548,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":549,"context_line":"                LOG.error(_LE(\u0027Remove attachment failed for volume \u0027"},{"line_number":550,"context_line":"                              \u0027on host %(host)s. Error: %(msg)s \u0027"},{"line_number":551,"context_line":"                              \u0027Code: %(code)s.\u0027),"},{"line_number":552,"context_line":"                          {\u0027host\u0027: connector.get(\u0027host\u0027),"},{"line_number":553,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"},{"line_number":554,"context_line":"                           \u0027code\u0027: ex.code},"},{"line_number":555,"context_line":"                          resource\u003d{\u0027type\u0027: \u0027volume\u0027,"},{"line_number":556,"context_line":"                                    \u0027id\u0027: volume_id})"},{"line_number":557,"context_line":"        rval \u003d []"},{"line_number":558,"context_line":"        for item in remaining_attachments:"},{"line_number":559,"context_line":"            rval.append(_untranslate_attachment_summary_view(context, item))"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_29d83453","line":556,"range":{"start_line":549,"start_character":16,"end_line":556,"end_character":53},"updated":"2016-06-20 16:58:02.000000000","message":"Same comments as above.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2a0111bd8d6a97446cac7aec296237b1017fad6","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        return rval"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    @translate_volume_exception"},{"line_number":563,"context_line":"    def list_attachments(self, context, volume_id, host\u003dNone):"},{"line_number":564,"context_line":"        attachment_refs \u003d ("},{"line_number":565,"context_line":"            cinderclient(context).volumes.list_attachments("},{"line_number":566,"context_line":"                volume_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a9d85d2_499b00ca","line":563,"updated":"2016-06-20 16:58:02.000000000","message":"This isn\u0027t used yet from what I can tell.","commit_id":"ae46dab0c753213bbac17efb3cd26f72b39cc5ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"49f05a02588b68369aecc804ef5c349da31e633c","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    version \u003d cinder_client.get_volume_api_from_url(url)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    try:"},{"line_number":89,"context_line":"        cinder_client.get_volume_api_from_url(url.replace(\u0027v2\u0027,"},{"line_number":90,"context_line":"                                                          \u0027v3\u0027))"},{"line_number":91,"context_line":"        version \u003d 3"},{"line_number":92,"context_line":"        endpoint_override \u003d url.replace(\u0027v2\u0027, \u0027v3\u0027)"},{"line_number":93,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_84a32300","line":90,"range":{"start_line":89,"start_character":8,"end_line":90,"end_character":64},"updated":"2017-05-25 03:01:37.000000000","message":"Is this just to see if v3 is available?","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    version \u003d cinder_client.get_volume_api_from_url(url)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    try:"},{"line_number":89,"context_line":"        cinder_client.get_volume_api_from_url(url.replace(\u0027v2\u0027,"},{"line_number":90,"context_line":"                                                          \u0027v3\u0027))"},{"line_number":91,"context_line":"        version \u003d 3"},{"line_number":92,"context_line":"        endpoint_override \u003d url.replace(\u0027v2\u0027, \u0027v3\u0027)"},{"line_number":93,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_a399687a","line":90,"range":{"start_line":89,"start_character":8,"end_line":90,"end_character":64},"in_reply_to":"ff0f0b1f_84a32300","updated":"2017-05-25 23:43:14.000000000","message":"Yeah, that was the intent; there\u0027s likely a better way to do this, I\u0027ll have a look.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a97fe07f498c32ee1a558bf27d14fbc4117830a9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    version \u003d cinder_client.get_volume_api_from_url(url)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    try:"},{"line_number":89,"context_line":"        cinder_client.get_volume_api_from_url(url.replace(\u0027v2\u0027,"},{"line_number":90,"context_line":"                                                          \u0027v3\u0027))"},{"line_number":91,"context_line":"        version \u003d 3"},{"line_number":92,"context_line":"        endpoint_override \u003d url.replace(\u0027v2\u0027, \u0027v3\u0027)"},{"line_number":93,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_74252fab","line":90,"range":{"start_line":89,"start_character":8,"end_line":90,"end_character":64},"in_reply_to":"ff0f0b1f_a399687a","updated":"2017-05-26 11:16:59.000000000","message":"A simple thing we should be able to do is just a GET / to the endpoint to find out which versions are available, since min and max versions should be in the version discovery doc. I don\u0027t know if the client supports that, but we don\u0027t really need cinderclient for that - we can just make a request with keystoneauth to find that out. But maybe I\u0027m over simplifying this. Monty or sdague would know.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"49f05a02588b68369aecc804ef5c349da31e633c","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        # attach/detach API that was added in 3.27."},{"line_number":106,"context_line":"        version \u003d \u00273.0\u0027"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    return cinder_client.Client(\u00273.27\u0027,"},{"line_number":109,"context_line":"                                session\u003d_SESSION,"},{"line_number":110,"context_line":"                                auth\u003dauth,"},{"line_number":111,"context_line":"                                endpoint_override\u003dendpoint_override,"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_04b7133c","line":108,"range":{"start_line":108,"start_character":32,"end_line":108,"end_character":38},"updated":"2017-05-25 03:01:37.000000000","message":"We need some code to see if 3.27 is even available. I don\u0027t know if cinderclient has a way to get the version discovery doc to find out what the min/max versions are, but we\u0027ll need to use that I think.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"a5dd49a917d9febefa54f57b021f2728286c9bf0","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        # attach/detach API that was added in 3.27."},{"line_number":106,"context_line":"        version \u003d \u00273.0\u0027"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    return cinder_client.Client(\u00273.27\u0027,"},{"line_number":109,"context_line":"                                session\u003d_SESSION,"},{"line_number":110,"context_line":"                                auth\u003dauth,"},{"line_number":111,"context_line":"                                endpoint_override\u003dendpoint_override,"}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_e39d2058","line":108,"range":{"start_line":108,"start_character":32,"end_line":108,"end_character":38},"in_reply_to":"ff0f0b1f_04b7133c","updated":"2017-05-25 23:43:14.000000000","message":"Probably, I\u0027ll look into that as well.  I was pretty comfortable with this thought because 27 is included in our first release of V3; so with the exception of maybe running CD from source this would be safe.\n\nAgain, I know this is far from perfect, will look into it.","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1d18087fad80794f2713f1f1c18ce584513f1e9c","unresolved":false,"context_lines":[{"line_number":575,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"},{"line_number":576,"context_line":"                           \u0027code\u0027: getattr(ex, \u0027code\u0027, None)})"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"    def attach_version(self, context):"},{"line_number":579,"context_line":"        # FIXME(jdg): Convert this to do a version check later, that\u0027s tricky"},{"line_number":580,"context_line":"        # right now though because get_version for some reason seems to be"},{"line_number":581,"context_line":"        # something we only support in \u003e\u003dV3, so that doesn\u0027t do us much good."}],"source_content_type":"text/x-python","patch_set":38,"id":"ff0f0b1f_04ef13e9","line":578,"range":{"start_line":578,"start_character":8,"end_line":578,"end_character":22},"updated":"2017-05-25 03:14:21.000000000","message":"The way this is being checked is really, is cinder new enough to do the new thing, so what this really needs to become is a check if cinder \u003e\u003d3.27 is available in the client object, and then maybe this just returns a boolean. I don\u0027t know what we\u0027d call it though, can_new_style_attach or something?","commit_id":"d74d21a997b743817bebac4028bb2791e0624931"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"77883ce72103cf198e796c97e3605bb4bfef6a5f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            else:"},{"line_number":141,"context_line":"                version \u003d _check_microversion(url, microversion)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    return cinder_client.Client(\u00273.27\u0027,"},{"line_number":144,"context_line":"                                session\u003d_SESSION,"},{"line_number":145,"context_line":"                                auth\u003dauth,"},{"line_number":146,"context_line":"                                endpoint_override\u003dendpoint_override,"}],"source_content_type":"text/x-python","patch_set":45,"id":"df140735_98a1b149","line":143,"range":{"start_line":143,"start_character":32,"end_line":143,"end_character":38},"updated":"2017-06-01 22:08:56.000000000","message":"It\u0027s a leftover, can be switched back to \u0027version\u0027.","commit_id":"d24cb9c23b121184bff05f503be15ede7882afb0"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"77883ce72103cf198e796c97e3605bb4bfef6a5f","unresolved":false,"context_lines":[{"line_number":617,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"},{"line_number":618,"context_line":"                           \u0027code\u0027: getattr(ex, \u0027code\u0027, None)})"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def attach_version(self, context):"},{"line_number":621,"context_line":"        # FIXME(jdg): Convert this to do a version check later, that\u0027s tricky"},{"line_number":622,"context_line":"        # right now though because get_version for some reason seems to be"},{"line_number":623,"context_line":"        # something we only support in \u003e\u003dV3, so that doesn\u0027t do us much good."},{"line_number":624,"context_line":"        # Also these calls are part of contrib and in V2, just do a simple"},{"line_number":625,"context_line":"        # check to see if it\u0027s supported for now"},{"line_number":626,"context_line":"        return 3"}],"source_content_type":"text/x-python","patch_set":45,"id":"df140735_587559ca","line":626,"range":{"start_line":620,"start_character":4,"end_line":626,"end_character":16},"updated":"2017-06-01 22:08:56.000000000","message":"This part can also be removed now.","commit_id":"d24cb9c23b121184bff05f503be15ede7882afb0"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7c5c8801e1ea544371506f86dc0804d2da1c71b1","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        try:"},{"line_number":402,"context_line":"            connection_info \u003d cinderclient("},{"line_number":403,"context_line":"                context).volumes.initialize_connection(volume_id, connector)"},{"line_number":404,"context_line":"            connection_info[\u0027connector\u0027] \u003d connector"},{"line_number":405,"context_line":"            # TODO(ildikov): The latest call does not return the \u0027data\u0027 key."},{"line_number":406,"context_line":"            # For now we will just add it back for backward compatibility and"},{"line_number":407,"context_line":"            # later we will do the transormation and remove the \u0027data\u0027 key"},{"line_number":408,"context_line":"            # from \u0027connection_info\u0027 on the Nova side too."},{"line_number":409,"context_line":"            conn_info \u003d {}"},{"line_number":410,"context_line":"            if not connection_info.get(\u0027data\u0027, None):"},{"line_number":411,"context_line":"                conn_info.update(connection_info)"},{"line_number":412,"context_line":"                connection_info[\u0027data\u0027] \u003d conn_info"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"            return connection_info"},{"line_number":415,"context_line":"        except cinder_exception.ClientException as ex:"}],"source_content_type":"text/x-python","patch_set":82,"id":"3f1d235d_ac2565c4","line":412,"range":{"start_line":404,"start_character":12,"end_line":412,"end_character":51},"updated":"2017-07-04 02:22:20.000000000","message":"Wrong call :) initialize_connection still behaves the same as always, it\u0027s attachment_create and attachment_update that need the data key artificially added in.\n\nie:\nhttps://gist.github.com/j-griffith/fc59fe79fcfb767a0514c8f339d996bf","commit_id":"39ca5b7f1570a505c75946af9a3f82ed31113e62"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ab40ff7899a62da0bec377a3e31ffa4a8ab11657","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        try:"},{"line_number":402,"context_line":"            connection_info \u003d cinderclient("},{"line_number":403,"context_line":"                context).volumes.initialize_connection(volume_id, connector)"},{"line_number":404,"context_line":"            connection_info[\u0027connector\u0027] \u003d connector"},{"line_number":405,"context_line":"            # TODO(ildikov): The latest call does not return the \u0027data\u0027 key."},{"line_number":406,"context_line":"            # For now we will just add it back for backward compatibility and"},{"line_number":407,"context_line":"            # later we will do the transormation and remove the \u0027data\u0027 key"},{"line_number":408,"context_line":"            # from \u0027connection_info\u0027 on the Nova side too."},{"line_number":409,"context_line":"            conn_info \u003d {}"},{"line_number":410,"context_line":"            if not connection_info.get(\u0027data\u0027, None):"},{"line_number":411,"context_line":"                conn_info.update(connection_info)"},{"line_number":412,"context_line":"                connection_info[\u0027data\u0027] \u003d conn_info"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"            return connection_info"},{"line_number":415,"context_line":"        except cinder_exception.ClientException as ex:"}],"source_content_type":"text/x-python","patch_set":82,"id":"3f1d235d_6eca904e","line":412,"range":{"start_line":404,"start_character":12,"end_line":412,"end_character":51},"in_reply_to":"3f1d235d_1cc80420","updated":"2017-07-04 14:39:01.000000000","message":"Yeah, I get it; and my brilliant idea of collapsing the data key has proven to be more problematic than it\u0027s worth.  Anyway, all we need to do here is revert back to what the code used to do, initialize_connection on the Cinder side still has data.\n\nFWIW, I did try and push the patch set that I was workign on with all of this on top of here but we\u0027ve diverged a bit and I didn\u0027t have time to go through and rework everything.","commit_id":"39ca5b7f1570a505c75946af9a3f82ed31113e62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"6318d5a732c1657f8b3a02e2bac49b9a0f1360d5","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        try:"},{"line_number":402,"context_line":"            connection_info \u003d cinderclient("},{"line_number":403,"context_line":"                context).volumes.initialize_connection(volume_id, connector)"},{"line_number":404,"context_line":"            connection_info[\u0027connector\u0027] \u003d connector"},{"line_number":405,"context_line":"            # TODO(ildikov): The latest call does not return the \u0027data\u0027 key."},{"line_number":406,"context_line":"            # For now we will just add it back for backward compatibility and"},{"line_number":407,"context_line":"            # later we will do the transormation and remove the \u0027data\u0027 key"},{"line_number":408,"context_line":"            # from \u0027connection_info\u0027 on the Nova side too."},{"line_number":409,"context_line":"            conn_info \u003d {}"},{"line_number":410,"context_line":"            if not connection_info.get(\u0027data\u0027, None):"},{"line_number":411,"context_line":"                conn_info.update(connection_info)"},{"line_number":412,"context_line":"                connection_info[\u0027data\u0027] \u003d conn_info"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"            return connection_info"},{"line_number":415,"context_line":"        except cinder_exception.ClientException as ex:"}],"source_content_type":"text/x-python","patch_set":82,"id":"3f1d235d_d596cb3e","line":412,"range":{"start_line":404,"start_character":12,"end_line":412,"end_character":51},"in_reply_to":"3f1d235d_6eca904e","updated":"2017-07-04 17:43:59.000000000","message":"We will do that, just not in this patch. I don\u0027t give up this easily. :)\n\nI removed this whole block in the next patch set this (my) morning. Sorry if I messed up your stuff, I wanted to get fixed what I can, so following this idea I\u0027ll just add the compute version bump and check as I have some clue of what needs to be done there.\n\nI have no idea still of the permission issue with shelved offloaded detach, we can check that tomorrow.","commit_id":"39ca5b7f1570a505c75946af9a3f82ed31113e62"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0b6be7df95dabea40060367900abb12f7d4b630f","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        try:"},{"line_number":402,"context_line":"            connection_info \u003d cinderclient("},{"line_number":403,"context_line":"                context).volumes.initialize_connection(volume_id, connector)"},{"line_number":404,"context_line":"            connection_info[\u0027connector\u0027] \u003d connector"},{"line_number":405,"context_line":"            # TODO(ildikov): The latest call does not return the \u0027data\u0027 key."},{"line_number":406,"context_line":"            # For now we will just add it back for backward compatibility and"},{"line_number":407,"context_line":"            # later we will do the transormation and remove the \u0027data\u0027 key"},{"line_number":408,"context_line":"            # from \u0027connection_info\u0027 on the Nova side too."},{"line_number":409,"context_line":"            conn_info \u003d {}"},{"line_number":410,"context_line":"            if not connection_info.get(\u0027data\u0027, None):"},{"line_number":411,"context_line":"                conn_info.update(connection_info)"},{"line_number":412,"context_line":"                connection_info[\u0027data\u0027] \u003d conn_info"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"            return connection_info"},{"line_number":415,"context_line":"        except cinder_exception.ClientException as ex:"}],"source_content_type":"text/x-python","patch_set":82,"id":"3f1d235d_1cc80420","line":412,"range":{"start_line":404,"start_character":12,"end_line":412,"end_character":51},"in_reply_to":"3f1d235d_ac2565c4","updated":"2017-07-04 06:13:18.000000000","message":"I\u0027m not saying I wasn\u0027t confused, but I just modified this: https://review.openstack.org/#/c/330285/78/nova/volume/cinder.py :)\n\nYou can upload a new version of the patch when you see I do stupid things so we could have one good thing coming out of being in different time zones, like waking up to having less gate jobs failing. :)","commit_id":"39ca5b7f1570a505c75946af9a3f82ed31113e62"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            else:"},{"line_number":141,"context_line":"                version \u003d _check_microversion(url, microversion)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    global_request_id \u003d None"},{"line_number":144,"context_line":"    try:"},{"line_number":145,"context_line":"        global_request_id \u003d context.global_id"},{"line_number":146,"context_line":"    except AttributeError:"},{"line_number":147,"context_line":"        LOG.debug(\"Context does not include a global_id\")"},{"line_number":148,"context_line":"        pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    return cinder_client.Client(version,"},{"line_number":151,"context_line":"                                session\u003d_SESSION,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_4006e322","line":148,"range":{"start_line":143,"start_character":4,"end_line":148,"end_character":12},"updated":"2017-07-21 02:24:43.000000000","message":"How is this related to this change? Rebase failure?","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"be069ad0e8f49f673eb7f0610952e0370eb3931f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            else:"},{"line_number":141,"context_line":"                version \u003d _check_microversion(url, microversion)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    global_request_id \u003d None"},{"line_number":144,"context_line":"    try:"},{"line_number":145,"context_line":"        global_request_id \u003d context.global_id"},{"line_number":146,"context_line":"    except AttributeError:"},{"line_number":147,"context_line":"        LOG.debug(\"Context does not include a global_id\")"},{"line_number":148,"context_line":"        pass"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    return cinder_client.Client(version,"},{"line_number":151,"context_line":"                                session\u003d_SESSION,"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_727c03b5","line":148,"range":{"start_line":143,"start_character":4,"end_line":148,"end_character":12},"in_reply_to":"1f1a1f67_4006e322","updated":"2017-07-21 11:17:57.000000000","message":"We hit a related failure at an earlier stage, I don\u0027t remember the exact details, John might know.\n\nI can remove it for now and propose it as a separate change if needed.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    return d"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"def _translate_attachment_ref(attachment_ref):"},{"line_number":224,"context_line":"    \"\"\"Building old style connection_info by adding the \u0027data\u0027 key back.\"\"\""},{"line_number":225,"context_line":"    data_keys \u003d attachment_ref.pop(\u0027connection_info\u0027, {})"},{"line_number":226,"context_line":"    if data_keys.get(\u0027driver_volume_type\u0027, None):"},{"line_number":227,"context_line":"        attachment_ref[\u0027driver_volume_type\u0027] \u003d data_keys[\u0027driver_volume_type\u0027]"},{"line_number":228,"context_line":"    attachment_ref[\u0027data\u0027] \u003d {}"},{"line_number":229,"context_line":"    for k, v in data_keys.items():"},{"line_number":230,"context_line":"        if k !\u003d \"driver_volume_type\":"},{"line_number":231,"context_line":"            attachment_ref[\u0027data\u0027][k] \u003d v"},{"line_number":232,"context_line":"    return attachment_ref"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"def translate_cinder_exception(method):"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_e32bb97f","line":232,"range":{"start_line":223,"start_character":0,"end_line":232,"end_character":25},"updated":"2017-07-21 02:24:43.000000000","message":"What is this all about? Is this a bug in the Cinder side?\n\nAlso, if this is something we have to do, it seems like something we should split out into a separate patch before this one since it\u0027s touching the existing swap volume code that\u0027s using the new style attachment logic, so it\u0027d be nice to separate the changes (the refactor from the new functionality that is).","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    return d"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"def _translate_attachment_ref(attachment_ref):"},{"line_number":224,"context_line":"    \"\"\"Building old style connection_info by adding the \u0027data\u0027 key back.\"\"\""},{"line_number":225,"context_line":"    data_keys \u003d attachment_ref.pop(\u0027connection_info\u0027, {})"},{"line_number":226,"context_line":"    if data_keys.get(\u0027driver_volume_type\u0027, None):"},{"line_number":227,"context_line":"        attachment_ref[\u0027driver_volume_type\u0027] \u003d data_keys[\u0027driver_volume_type\u0027]"},{"line_number":228,"context_line":"    attachment_ref[\u0027data\u0027] \u003d {}"},{"line_number":229,"context_line":"    for k, v in data_keys.items():"},{"line_number":230,"context_line":"        if k !\u003d \"driver_volume_type\":"},{"line_number":231,"context_line":"            attachment_ref[\u0027data\u0027][k] \u003d v"},{"line_number":232,"context_line":"    return attachment_ref"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"def translate_cinder_exception(method):"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_4f7de7e5","line":232,"range":{"start_line":223,"start_character":0,"end_line":232,"end_character":25},"in_reply_to":"1f1a1f67_e32bb97f","updated":"2017-07-21 08:14:39.000000000","message":"We had an attempt to remove the \u0027data\u0027 key from connection_info as it didn\u0027t have a solid purpose. It turned out it\u0027s not that easy to switch in Nova, so we are switching back to the old format here for now.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            attached."},{"line_number":551,"context_line":"        :param connector: host connector dict; if None, the attachment will"},{"line_number":552,"context_line":"            be \u0027reserved\u0027 but not yet attached."},{"line_number":553,"context_line":"        :returns: connection_info dict, built from the"},{"line_number":554,"context_line":"            cinderclient.v3.attachments.VolumeAttachment object dict (this"},{"line_number":555,"context_line":"            gives us a backward compatable connection_info dict)"},{"line_number":556,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_639329a5","line":553,"range":{"start_line":553,"start_character":18,"end_line":553,"end_character":38},"updated":"2017-07-21 02:24:43.000000000","message":"Is this correct? Because what\u0027s returned for attachment_update isn\u0027t the same as this.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"696fdd522bfc9c93267a9206e731276d9d52c4f0","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            attached."},{"line_number":551,"context_line":"        :param connector: host connector dict; if None, the attachment will"},{"line_number":552,"context_line":"            be \u0027reserved\u0027 but not yet attached."},{"line_number":553,"context_line":"        :returns: connection_info dict, built from the"},{"line_number":554,"context_line":"            cinderclient.v3.attachments.VolumeAttachment object dict (this"},{"line_number":555,"context_line":"            gives us a backward compatable connection_info dict)"},{"line_number":556,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_35031510","line":553,"range":{"start_line":553,"start_character":18,"end_line":553,"end_character":38},"in_reply_to":"1f1a1f67_639329a5","updated":"2017-07-21 11:25:25.000000000","message":"If you specify the connector in the attachment_create call it will internally call attachment_update to finalize the attachment and give you the same return value as attachment_update. If the connector is None in the call then the connection_info will be a dict with \u0027data\u0027: {} in it.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"212ae1740d77007eaa3250fb05f5a5cc62932bde","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            attachment_ref \u003d cinderclient("},{"line_number":586,"context_line":"                context, \u00273.27\u0027, skip_version_check\u003dTrue).attachments.update("},{"line_number":587,"context_line":"                    attachment_id, connector)"},{"line_number":588,"context_line":"            return _translate_attachment_ref(attachment_ref.to_dict())"},{"line_number":589,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":590,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":591,"context_line":"                LOG.error((\u0027Update attachment failed for attachment \u0027"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_83964594","line":588,"range":{"start_line":588,"start_character":45,"end_line":588,"end_character":69},"updated":"2017-07-21 02:24:43.000000000","message":"Why doesn\u0027t attachment_create do the to_dict()?\n\nI\u0027d prefer that these methods return the same thing, and if the client needs the connection_info they can pull it out of the returned object. I don\u0027t really get what\u0027s going on with the connection_info stuff here.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"df00847db8910fa2843996aacadb1694fef7f1e8","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            attachment_ref \u003d cinderclient("},{"line_number":586,"context_line":"                context, \u00273.27\u0027, skip_version_check\u003dTrue).attachments.update("},{"line_number":587,"context_line":"                    attachment_id, connector)"},{"line_number":588,"context_line":"            return _translate_attachment_ref(attachment_ref.to_dict())"},{"line_number":589,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":590,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":591,"context_line":"                LOG.error((\u0027Update attachment failed for attachment \u0027"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_afe35ba4","line":588,"range":{"start_line":588,"start_character":45,"end_line":588,"end_character":69},"in_reply_to":"1f1a1f67_83964594","updated":"2017-07-21 08:14:39.000000000","message":"I don\u0027t think we need the .to_dict() here, I will double check.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"a806990c3a17fa91bb90d8be439c21d2ade1df7c","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            attachment_ref \u003d cinderclient("},{"line_number":586,"context_line":"                context, \u00273.27\u0027, skip_version_check\u003dTrue).attachments.update("},{"line_number":587,"context_line":"                    attachment_id, connector)"},{"line_number":588,"context_line":"            return _translate_attachment_ref(attachment_ref.to_dict())"},{"line_number":589,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":590,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":591,"context_line":"                LOG.error((\u0027Update attachment failed for attachment \u0027"}],"source_content_type":"text/x-python","patch_set":96,"id":"1f1a1f67_b2ff3b33","line":588,"range":{"start_line":588,"start_character":45,"end_line":588,"end_character":69},"in_reply_to":"1f1a1f67_afe35ba4","updated":"2017-07-21 11:11:27.000000000","message":"My mistake, we still need the dict here. We normalize the return value through the translation helper method here as opposed to having changes on the Cinder side.\n\nSo basically we\u0027re handling backward compatibility on the Nova side now with the thought of removing the \u0027data\u0027 key at a certain point to not have a nested dict for seemingly no good reason.\n\nI will split this transformation out to a separate patch and we can figure this part out there.","commit_id":"45bf1a844b8870ee5f6155475fc0374378c47b87"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"1d1c413f38ba2f60954ca6aa38efb9c0555d3a9c","unresolved":false,"context_lines":[{"line_number":216,"context_line":"def _translate_attachment_ref(attachment_ref):"},{"line_number":217,"context_line":"    \"\"\"Building old style connection_info by adding the \u0027data\u0027 key back.\"\"\""},{"line_number":218,"context_line":"    translated_con_info \u003d {}"},{"line_number":219,"context_line":"    translated_con_info[\u0027attachment_id\u0027] \u003d \\"},{"line_number":220,"context_line":"        attachment_ref[\u0027connection_info\u0027].pop(\u0027attachment_id\u0027, None)"},{"line_number":221,"context_line":"    translated_con_info[\u0027driver_volume_type\u0027] \u003d \\"},{"line_number":222,"context_line":"        attachment_ref[\u0027connection_info\u0027].pop(\u0027driver_volume_type\u0027, None)"},{"line_number":223,"context_line":"    translated_con_info[\u0027data\u0027] \u003d attachment_ref.pop(\u0027connection_info\u0027, None)"}],"source_content_type":"text/x-python","patch_set":118,"id":"9f436f4f_8349e9b7","line":220,"range":{"start_line":219,"start_character":4,"end_line":220,"end_character":68},"updated":"2017-08-15 16:16:34.000000000","message":"We have this here already to fill up \u0027attachment_id\u0027. When we don\u0027t have \u0027attachment_id\u0027 in the \u0027connection_info\u0027 is attachment_create for the purpose of reserving the volume. In that case we are using \u0027id\u0027 in the attachment_ref.","commit_id":"15ac128ee929f885a6180c39605942f784374c67"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"1d1c413f38ba2f60954ca6aa38efb9c0555d3a9c","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        if k !\u003d \"id\":"},{"line_number":236,"context_line":"            translated_con_info[k] \u003d v"},{"line_number":237,"context_line":"        else:"},{"line_number":238,"context_line":"            translated_con_info[\u0027attachment_id\u0027] \u003d v"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    attachment_ref[\u0027connection_info\u0027] \u003d {}"},{"line_number":241,"context_line":"    attachment_ref[\u0027connection_info\u0027] \u003d translated_con_info"}],"source_content_type":"text/x-python","patch_set":118,"id":"9f436f4f_e38b15c0","line":238,"range":{"start_line":238,"start_character":12,"end_line":238,"end_character":52},"updated":"2017-08-15 16:16:34.000000000","message":"I wonder whether it is really necessary? As we have an attempt to fill it up a few lines above.\n\nI also haven\u0027t seen this used anywhere, although I might\u0027ve easily missed it.","commit_id":"15ac128ee929f885a6180c39605942f784374c67"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"914092a81a80a7bc04dafb1b4118df8345ef517b","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        if k !\u003d \"id\":"},{"line_number":236,"context_line":"            translated_con_info[k] \u003d v"},{"line_number":237,"context_line":"        else:"},{"line_number":238,"context_line":"            translated_con_info[\u0027attachment_id\u0027] \u003d v"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    attachment_ref[\u0027connection_info\u0027] \u003d {}"},{"line_number":241,"context_line":"    attachment_ref[\u0027connection_info\u0027] \u003d translated_con_info"}],"source_content_type":"text/x-python","patch_set":118,"id":"9f436f4f_3744a146","line":238,"range":{"start_line":238,"start_character":12,"end_line":238,"end_character":52},"in_reply_to":"9f436f4f_92c808a6","updated":"2017-08-16 10:14:17.000000000","message":"As far as I saw we are not using the \u0027attachment_id\u0027 in the \u0027connection_info\u0027. I kept the attachment_ref with the translation which includes the \u0027id\u0027 on the top level which we use:\n\nhttps://review.openstack.org/#/c/493324/4/nova/tests/unit/volume/test_cinder.py\n\nI think for attachment_create when we just reserve the volume the connection info should be empty, so I will change that later. And I also think that it shouldn\u0027t contain \u0027attachment_id\u0027 at all because it\u0027s confusing. We are returning the \u0027id\u0027 in the attachment_ref and then we are using the attachment_id stored in the BDM everywhere.","commit_id":"15ac128ee929f885a6180c39605942f784374c67"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"62e05b7955c679758477334882efbda3622e4487","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        if k !\u003d \"id\":"},{"line_number":236,"context_line":"            translated_con_info[k] \u003d v"},{"line_number":237,"context_line":"        else:"},{"line_number":238,"context_line":"            translated_con_info[\u0027attachment_id\u0027] \u003d v"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    attachment_ref[\u0027connection_info\u0027] \u003d {}"},{"line_number":241,"context_line":"    attachment_ref[\u0027connection_info\u0027] \u003d translated_con_info"}],"source_content_type":"text/x-python","patch_set":118,"id":"9f436f4f_92c808a6","line":238,"range":{"start_line":238,"start_character":12,"end_line":238,"end_character":52},"in_reply_to":"9f436f4f_e38b15c0","updated":"2017-08-15 23:00:56.000000000","message":"It\u0027s needed because of the goofy differences between attachment_create and attachment_update; attachment_create doesn\u0027t give us the attachment_id key that we parsed out above so we use this to pick it up.  You can remove this if you like, but then everything falls back to old flow after initial attachment-create because... there\u0027s no attachment_id :(\n\nWe should probably put a warning/comment here noting that.","commit_id":"15ac128ee929f885a6180c39605942f784374c67"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    raise exception.CinderAPIVersionNotAvailable(version\u003dmicroversion)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def is_microversion_supported(context, microversion):"},{"line_number":83,"context_line":"    global _SESSION"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    if not _SESSION:"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_1c411f0c","line":82,"updated":"2017-11-22 15:30:04.000000000","message":"I think this is only used in one place, so you might be able to remove it now.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    raise exception.CinderAPIVersionNotAvailable(version\u003dmicroversion)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def is_microversion_supported(context, microversion):"},{"line_number":83,"context_line":"    global _SESSION"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    if not _SESSION:"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_99c1b6e7","line":82,"in_reply_to":"ff82abbf_1c411f0c","updated":"2017-11-23 02:34:54.000000000","message":"?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def is_microversion_supported(context, microversion):"},{"line_number":83,"context_line":"    global _SESSION"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    if not _SESSION:"},{"line_number":86,"context_line":"        _SESSION \u003d ks_loading.load_session_from_conf_options("},{"line_number":87,"context_line":"            CONF, nova.conf.cinder.cinder_group.name)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    url \u003d None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    auth \u003d service_auth.get_auth_plugin(context)"},{"line_number":92,"context_line":"    service_type, service_name, interface \u003d CONF.cinder.catalog_info.split(\u0027:\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    service_parameters \u003d {\u0027service_type\u0027: service_type,"},{"line_number":95,"context_line":"                          \u0027service_name\u0027: service_name,"},{"line_number":96,"context_line":"                          \u0027interface\u0027: interface,"},{"line_number":97,"context_line":"                          \u0027region_name\u0027: CONF.cinder.os_region_name}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    if CONF.cinder.endpoint_template:"},{"line_number":100,"context_line":"        url \u003d CONF.cinder.endpoint_template % context.to_dict()"},{"line_number":101,"context_line":"    else:"},{"line_number":102,"context_line":"        url \u003d _SESSION.get_endpoint(auth, **service_parameters)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    _check_microversion(url, microversion)"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_7cbf0bd0","line":102,"range":{"start_line":83,"start_character":0,"end_line":102,"end_character":63},"updated":"2017-11-22 15:30:04.000000000","message":"This looks like a bad cut and paste job, why do we need it?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a956196f2948556a8c736ee466ec0da70f0544fb","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def is_microversion_supported(context, microversion):"},{"line_number":83,"context_line":"    global _SESSION"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    if not _SESSION:"},{"line_number":86,"context_line":"        _SESSION \u003d ks_loading.load_session_from_conf_options("},{"line_number":87,"context_line":"            CONF, nova.conf.cinder.cinder_group.name)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    url \u003d None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    auth \u003d service_auth.get_auth_plugin(context)"},{"line_number":92,"context_line":"    service_type, service_name, interface \u003d CONF.cinder.catalog_info.split(\u0027:\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    service_parameters \u003d {\u0027service_type\u0027: service_type,"},{"line_number":95,"context_line":"                          \u0027service_name\u0027: service_name,"},{"line_number":96,"context_line":"                          \u0027interface\u0027: interface,"},{"line_number":97,"context_line":"                          \u0027region_name\u0027: CONF.cinder.os_region_name}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    if CONF.cinder.endpoint_template:"},{"line_number":100,"context_line":"        url \u003d CONF.cinder.endpoint_template % context.to_dict()"},{"line_number":101,"context_line":"    else:"},{"line_number":102,"context_line":"        url \u003d _SESSION.get_endpoint(auth, **service_parameters)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    _check_microversion(url, microversion)"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_cc93eca2","line":102,"range":{"start_line":83,"start_character":0,"end_line":102,"end_character":63},"in_reply_to":"ff82abbf_1984c6b0","updated":"2017-11-23 10:20:50.000000000","message":"Maybe just put the common bits together, into a function, although its a horrid set of return values...\n\nget _SESSION, auth, url maybe?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def is_microversion_supported(context, microversion):"},{"line_number":83,"context_line":"    global _SESSION"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    if not _SESSION:"},{"line_number":86,"context_line":"        _SESSION \u003d ks_loading.load_session_from_conf_options("},{"line_number":87,"context_line":"            CONF, nova.conf.cinder.cinder_group.name)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    url \u003d None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    auth \u003d service_auth.get_auth_plugin(context)"},{"line_number":92,"context_line":"    service_type, service_name, interface \u003d CONF.cinder.catalog_info.split(\u0027:\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    service_parameters \u003d {\u0027service_type\u0027: service_type,"},{"line_number":95,"context_line":"                          \u0027service_name\u0027: service_name,"},{"line_number":96,"context_line":"                          \u0027interface\u0027: interface,"},{"line_number":97,"context_line":"                          \u0027region_name\u0027: CONF.cinder.os_region_name}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    if CONF.cinder.endpoint_template:"},{"line_number":100,"context_line":"        url \u003d CONF.cinder.endpoint_template % context.to_dict()"},{"line_number":101,"context_line":"    else:"},{"line_number":102,"context_line":"        url \u003d _SESSION.get_endpoint(auth, **service_parameters)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    _check_microversion(url, microversion)"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_1984c6b0","line":102,"range":{"start_line":83,"start_character":0,"end_line":102,"end_character":63},"in_reply_to":"ff82abbf_7cbf0bd0","updated":"2017-11-23 02:34:54.000000000","message":"I only need to do a microversion check and I don\u0027t want to create a cinderclient, when I don\u0027t need its existence to determine the available highest microversion and do the checks.\n\nI need the \u0027url\u0027 though which I can make the global, but I still need to retrieve it in case it\u0027s not set.\n\nSo I\u0027m open to suggestions on how to do this nicer here. :)","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"341f22c47602149bb70ffe5452d3b56c93d57432","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def is_microversion_supported(context, microversion):"},{"line_number":83,"context_line":"    global _SESSION"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    if not _SESSION:"},{"line_number":86,"context_line":"        _SESSION \u003d ks_loading.load_session_from_conf_options("},{"line_number":87,"context_line":"            CONF, nova.conf.cinder.cinder_group.name)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    url \u003d None"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    auth \u003d service_auth.get_auth_plugin(context)"},{"line_number":92,"context_line":"    service_type, service_name, interface \u003d CONF.cinder.catalog_info.split(\u0027:\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    service_parameters \u003d {\u0027service_type\u0027: service_type,"},{"line_number":95,"context_line":"                          \u0027service_name\u0027: service_name,"},{"line_number":96,"context_line":"                          \u0027interface\u0027: interface,"},{"line_number":97,"context_line":"                          \u0027region_name\u0027: CONF.cinder.os_region_name}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    if CONF.cinder.endpoint_template:"},{"line_number":100,"context_line":"        url \u003d CONF.cinder.endpoint_template % context.to_dict()"},{"line_number":101,"context_line":"    else:"},{"line_number":102,"context_line":"        url \u003d _SESSION.get_endpoint(auth, **service_parameters)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    _check_microversion(url, microversion)"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_ec00306a","line":102,"range":{"start_line":83,"start_character":0,"end_line":102,"end_character":63},"in_reply_to":"ff82abbf_cc93eca2","updated":"2017-12-01 12:24:03.000000000","message":"Yeah, it seems to work, so I can do that now, it just seemed a little weird still... :/ :)\n\nWill upload it in a next version of the patch.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"7e61c2efd46af5525663a5c45d214fb972cac201","unresolved":false,"context_lines":[{"line_number":590,"context_line":"            return _translate_attachment_ref(attachment_ref)"},{"line_number":591,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":592,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":593,"context_line":"                LOG.error((\u0027Create attachment failed for volume \u0027"},{"line_number":594,"context_line":"                           \u0027%(volume_id)s. Error: %(msg)s Code: %(code)s\u0027),"},{"line_number":595,"context_line":"                          {\u0027volume_id\u0027: volume_id,"},{"line_number":596,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_5c37a7b1","line":593,"updated":"2017-11-22 15:30:04.000000000","message":"Do we want an error log when the version is simply not supported? We seem to be using that as an expected flow now.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"9547f623a59693d37ca43031200e747a0e754cc6","unresolved":false,"context_lines":[{"line_number":590,"context_line":"            return _translate_attachment_ref(attachment_ref)"},{"line_number":591,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":592,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":593,"context_line":"                LOG.error((\u0027Create attachment failed for volume \u0027"},{"line_number":594,"context_line":"                           \u0027%(volume_id)s. Error: %(msg)s Code: %(code)s\u0027),"},{"line_number":595,"context_line":"                          {\u0027volume_id\u0027: volume_id,"},{"line_number":596,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_9c720111","line":593,"in_reply_to":"ff82abbf_5c37a7b1","updated":"2017-11-23 02:34:54.000000000","message":"It\u0027s logged where we call attachment_create and fall back to the old flow.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a956196f2948556a8c736ee466ec0da70f0544fb","unresolved":false,"context_lines":[{"line_number":590,"context_line":"            return _translate_attachment_ref(attachment_ref)"},{"line_number":591,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":592,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":593,"context_line":"                LOG.error((\u0027Create attachment failed for volume \u0027"},{"line_number":594,"context_line":"                           \u0027%(volume_id)s. Error: %(msg)s Code: %(code)s\u0027),"},{"line_number":595,"context_line":"                          {\u0027volume_id\u0027: volume_id,"},{"line_number":596,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_acdd4871","line":593,"in_reply_to":"ff82abbf_9c720111","updated":"2017-11-23 10:20:50.000000000","message":"I am more worried about us also logging this error here, when its an expected error.","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"341f22c47602149bb70ffe5452d3b56c93d57432","unresolved":false,"context_lines":[{"line_number":590,"context_line":"            return _translate_attachment_ref(attachment_ref)"},{"line_number":591,"context_line":"        except cinder_exception.ClientException as ex:"},{"line_number":592,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":593,"context_line":"                LOG.error((\u0027Create attachment failed for volume \u0027"},{"line_number":594,"context_line":"                           \u0027%(volume_id)s. Error: %(msg)s Code: %(code)s\u0027),"},{"line_number":595,"context_line":"                          {\u0027volume_id\u0027: volume_id,"},{"line_number":596,"context_line":"                           \u0027msg\u0027: six.text_type(ex),"}],"source_content_type":"text/x-python","patch_set":153,"id":"ff82abbf_6cf42087","line":593,"in_reply_to":"ff82abbf_acdd4871","updated":"2017-12-01 12:24:03.000000000","message":"Hmmm, I\u0027m not sure I get your concern. It\u0027s the regular ClientException if there are connection issues or any other reason because of which the client is not available. So it is a completely different case, which we raise and log here for all the calls. What am I missing?","commit_id":"a99c61fe47e2880212c191cd51fed9e539adbaba"}]}
