)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b98e3aabba62b282e33196ae4e9e46c74c6960a5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Handle volume API failure in post_live_migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, if the call to Cinder in post_live_migration failed, the"},{"line_number":10,"context_line":"exception went unhandled and prevented us from calling"},{"line_number":11,"context_line":"_post_live_migration_at_destination - which is where we set instance"},{"line_number":12,"context_line":"host and task state. This left the system in an inconsistent state,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3f79a3b5_3dab65d7","line":9,"range":{"start_line":9,"start_character":37,"end_line":9,"end_character":56},"updated":"2018-10-12 16:18:05.000000000","message":"_post_live_migration","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b98e3aabba62b282e33196ae4e9e46c74c6960a5","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, if the call to Cinder in post_live_migration failed, the"},{"line_number":10,"context_line":"exception went unhandled and prevented us from calling"},{"line_number":11,"context_line":"_post_live_migration_at_destination - which is where we set instance"},{"line_number":12,"context_line":"host and task state. This left the system in an inconsistent state,"},{"line_number":13,"context_line":"with the instance actually running on the destination, but"},{"line_number":14,"context_line":"with instance.host still set to the source. This patch simply wraps"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3f79a3b5_7d68fdba","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":35},"updated":"2018-10-12 16:18:05.000000000","message":"post_live_migration_at_destination","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2c5f30339275b07b71685da40fe24c58d1082262","unresolved":false,"context_lines":[{"line_number":18,"context_line":"when, where and how we set instance host and task state to try to"},{"line_number":19,"context_line":"guarantee consistency is left as a TODO."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: 1628606"},{"line_number":22,"context_line":"Change-Id: Icb0bdaf454935b3713c35339394d260b33520de5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3f79a3b5_4b00f703","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":11},"updated":"2018-10-11 18:00:04.000000000","message":"i was a little conflicted on should this be closes bug\nas there is a networking related case also where we dont set the instance.host if there is a failure in post_live_migration_at_destination.\n\nbasically if you try to livemigrate a guest with neutron sriov port with vnic-type\u003dmacvtap it will actully live migrate today if the destination node hapes to have a pci device with the correct pci address free.\n\nafter the guest has been moved and is running on the destination post_live_migration_at_destination fails becasue we have not calimed the pci device on the destination node\nwhich is why i commented out this  https://review.openstack.org/#/c/608788/1/nova/network/neutronv2/api.py to allow me to prototype stuff in my sriov migration patches.\n\nif that exception is throw the guest goes into error state but its host is still pointing at the source node and it contiues to run fine on the destiation.\n\nso i think to close that bug we would have to handel the networkin case too. if this just addresses the volume case i think partial-bug is fine :) thanks for updating.","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62874518326e29d09d44efb43cd97b4e788c3fa4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Artom Lifshitz \u003califshit@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-10-12 14:34:23 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Handle volume API failure in post_live_migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, if the call to Cinder in _post_live_migration failed, the"},{"line_number":10,"context_line":"exception went unhandled and prevented us from calling"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_855d5b49","line":7,"range":{"start_line":7,"start_character":29,"end_line":7,"end_character":48},"updated":"2018-10-15 18:38:13.000000000","message":"nit: _post_live_migration","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Artom Lifshitz \u003califshit@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-10-12 14:34:23 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Handle volume API failure in post_live_migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously, if the call to Cinder in _post_live_migration failed, the"},{"line_number":10,"context_line":"exception went unhandled and prevented us from calling"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_085e42e8","line":7,"range":{"start_line":7,"start_character":29,"end_line":7,"end_character":48},"in_reply_to":"3f79a3b5_855d5b49","updated":"2018-10-15 19:54:54.000000000","message":"Done","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62874518326e29d09d44efb43cd97b4e788c3fa4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"with instance.host still set to the source. This patch simply wraps"},{"line_number":15,"context_line":"the Cinder API calls in a try/except, and logs the exception instead"},{"line_number":16,"context_line":"of blowing up. While \"dumb\", this has the virtue of being simple and"},{"line_number":17,"context_line":"minimizing potential side effects. A comprehensive refactoring of"},{"line_number":18,"context_line":"when, where and how we set instance host and task state to try to"},{"line_number":19,"context_line":"guarantee consistency is left as a TODO."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: 1628606"},{"line_number":22,"context_line":"Change-Id: Icb0bdaf454935b3713c35339394d260b33520de5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_654eff90","line":19,"range":{"start_line":17,"start_character":35,"end_line":19,"end_character":40},"updated":"2018-10-15 18:38:13.000000000","message":"We could just do it immediately in _post_live_migration but yeah, let\u0027s not muddy the waters here.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"with instance.host still set to the source. This patch simply wraps"},{"line_number":15,"context_line":"the Cinder API calls in a try/except, and logs the exception instead"},{"line_number":16,"context_line":"of blowing up. While \"dumb\", this has the virtue of being simple and"},{"line_number":17,"context_line":"minimizing potential side effects. A comprehensive refactoring of"},{"line_number":18,"context_line":"when, where and how we set instance host and task state to try to"},{"line_number":19,"context_line":"guarantee consistency is left as a TODO."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: 1628606"},{"line_number":22,"context_line":"Change-Id: Icb0bdaf454935b3713c35339394d260b33520de5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_e85666cd","line":19,"range":{"start_line":17,"start_character":35,"end_line":19,"end_character":40},"in_reply_to":"3f79a3b5_654eff90","updated":"2018-10-15 19:54:54.000000000","message":"So full disclosure: this has downstream pressure behind it - so I figured I\u0027d go for the quick win first, and then mess about with refactoring. I\u0027m afraid the latter might turn up weird side effects and/or races. I *do* actually intend to follow up, including Sean\u0027s Neutron thing, I just want to get this done first :)","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2af61c99f4a38252d35fb82f68acf8077bacf2b4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"with instance.host still set to the source. This patch simply wraps"},{"line_number":15,"context_line":"the Cinder API calls in a try/except, and logs the exception instead"},{"line_number":16,"context_line":"of blowing up. While \"dumb\", this has the virtue of being simple and"},{"line_number":17,"context_line":"minimizing potential side effects. A comprehensive refactoring of"},{"line_number":18,"context_line":"when, where and how we set instance host and task state to try to"},{"line_number":19,"context_line":"guarantee consistency is left as a TODO."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: 1628606"},{"line_number":22,"context_line":"Change-Id: Icb0bdaf454935b3713c35339394d260b33520de5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3f79a3b5_74cd4b84","line":19,"range":{"start_line":17,"start_character":35,"end_line":19,"end_character":40},"in_reply_to":"3f79a3b5_e85666cd","updated":"2018-10-15 22:01:59.000000000","message":"I\u0027m not advocating for a big refactor here, it would botch backports.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"}],"nova/compute/manager.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"02416cf141bccc8c59df00beb693e292ddbd49ba","unresolved":false,"context_lines":[{"line_number":6585,"context_line":"                                        migrate_data)"},{"line_number":6586,"context_line":""},{"line_number":6587,"context_line":"        try:"},{"line_number":6588,"context_line":"            # NOTE(artom) Detaching volumes is a call to an exernal API that"},{"line_number":6589,"context_line":"            # can fail. If it does, we need to handle it gracefully so that the"},{"line_number":6590,"context_line":"            # call to _post_live_migration_at_destination - where we set"},{"line_number":6591,"context_line":"            # instance host and task state - still happens. We need to rethink"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_cbf8877f","line":6588,"range":{"start_line":6588,"start_character":60,"end_line":6588,"end_character":67},"updated":"2018-10-11 17:35:39.000000000","message":"external","commit_id":"0c814f10abe382054af2d96d3af027e87bc35c45"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7c61f4078095e0fbeaa844d6ed714a06f6b96fcc","unresolved":false,"context_lines":[{"line_number":6585,"context_line":"                                        migrate_data)"},{"line_number":6586,"context_line":""},{"line_number":6587,"context_line":"        try:"},{"line_number":6588,"context_line":"            # NOTE(artom) Detaching volumes is a call to an exernal API that"},{"line_number":6589,"context_line":"            # can fail. If it does, we need to handle it gracefully so that the"},{"line_number":6590,"context_line":"            # call to _post_live_migration_at_destination - where we set"},{"line_number":6591,"context_line":"            # instance host and task state - still happens. We need to rethink"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_8b85afb0","line":6588,"range":{"start_line":6588,"start_character":60,"end_line":6588,"end_character":67},"in_reply_to":"3f79a3b5_cbf8877f","updated":"2018-10-11 17:48:00.000000000","message":"Done","commit_id":"0c814f10abe382054af2d96d3af027e87bc35c45"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"02416cf141bccc8c59df00beb693e292ddbd49ba","unresolved":false,"context_lines":[{"line_number":6614,"context_line":"                            migrate_data.old_vol_attachment_ids[bdm.volume_id]"},{"line_number":6615,"context_line":"                        self.volume_api.attachment_delete(ctxt,"},{"line_number":6616,"context_line":"                                                          old_attachment_id)"},{"line_number":6617,"context_line":"        except Exception as e:"},{"line_number":6618,"context_line":"            LOG.error(\u0027Volume attachments not cleaned up on source %s during \u0027"},{"line_number":6619,"context_line":"                      \u0027post_live_migration: %s\u0027, self.host, six.text_type(e),"},{"line_number":6620,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_4bec77bb","line":6617,"updated":"2018-10-11 17:35:39.000000000","message":"Do we really want to just punt on everything if we hit one volume in the middle that can\u0027t be detached? I would think we\u0027d want to detach whatever we can, especially since we\u0027re just logging the error and not reporting it up the stack.","commit_id":"0c814f10abe382054af2d96d3af027e87bc35c45"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7c61f4078095e0fbeaa844d6ed714a06f6b96fcc","unresolved":false,"context_lines":[{"line_number":6614,"context_line":"                            migrate_data.old_vol_attachment_ids[bdm.volume_id]"},{"line_number":6615,"context_line":"                        self.volume_api.attachment_delete(ctxt,"},{"line_number":6616,"context_line":"                                                          old_attachment_id)"},{"line_number":6617,"context_line":"        except Exception as e:"},{"line_number":6618,"context_line":"            LOG.error(\u0027Volume attachments not cleaned up on source %s during \u0027"},{"line_number":6619,"context_line":"                      \u0027post_live_migration: %s\u0027, self.host, six.text_type(e),"},{"line_number":6620,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_4b8b17c0","line":6617,"in_reply_to":"3f79a3b5_4bec77bb","updated":"2018-10-11 17:48:00.000000000","message":"Hrmm, yeah, should \"tighten\" the try/except. Done.","commit_id":"0c814f10abe382054af2d96d3af027e87bc35c45"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b98e3aabba62b282e33196ae4e9e46c74c6960a5","unresolved":false,"context_lines":[{"line_number":6584,"context_line":"        self.driver.post_live_migration(ctxt, instance, block_device_info,"},{"line_number":6585,"context_line":"                                        migrate_data)"},{"line_number":6586,"context_line":""},{"line_number":6587,"context_line":"        # Detaching volumes."},{"line_number":6588,"context_line":"        connector \u003d self.driver.get_volume_connector(instance)"},{"line_number":6589,"context_line":"        for bdm in bdms:"},{"line_number":6590,"context_line":"            if bdm.is_volume:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_fdb08d43","side":"PARENT","line":6587,"updated":"2018-10-12 16:18:05.000000000","message":"Why remove this?","commit_id":"2870e7a7116452276b25f5f75071b0f3d4a9b0f2"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2fa87dced813125d5bd982207209ec10c62ff3a0","unresolved":false,"context_lines":[{"line_number":6584,"context_line":"        self.driver.post_live_migration(ctxt, instance, block_device_info,"},{"line_number":6585,"context_line":"                                        migrate_data)"},{"line_number":6586,"context_line":""},{"line_number":6587,"context_line":"        # Detaching volumes."},{"line_number":6588,"context_line":"        connector \u003d self.driver.get_volume_connector(instance)"},{"line_number":6589,"context_line":"        for bdm in bdms:"},{"line_number":6590,"context_line":"            if bdm.is_volume:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_1d2469c2","side":"PARENT","line":6587,"in_reply_to":"3f79a3b5_fdb08d43","updated":"2018-10-12 17:17:17.000000000","message":"Bleah, previously I had the comment at the top, replacing and expanding on this.","commit_id":"2870e7a7116452276b25f5f75071b0f3d4a9b0f2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b98e3aabba62b282e33196ae4e9e46c74c6960a5","unresolved":false,"context_lines":[{"line_number":6596,"context_line":"                    # remove the volume connection without detaching from"},{"line_number":6597,"context_line":"                    # hypervisor because the instance is not running anymore"},{"line_number":6598,"context_line":"                    # on the current host"},{"line_number":6599,"context_line":""},{"line_number":6600,"context_line":"                    # Detaching volumes is a call to an external API that can"},{"line_number":6601,"context_line":"                    # fail. If it does, we need to handle it gracefully so that"},{"line_number":6602,"context_line":"                    # the call to _post_live_migration_at_destination - where"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_1d87895d","line":6599,"updated":"2018-10-12 16:18:05.000000000","message":"Can we just have a single try/except? Having it around both API calls is ugly...I\u0027m guessing you\u0027re going for minimal amount of blanket try/except handling here so we don\u0027t swallow something we otherwise shouldn\u0027t? If so, I guess we could follow up and just move this block of code out into another method because this method is already big and gross.","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2fa87dced813125d5bd982207209ec10c62ff3a0","unresolved":false,"context_lines":[{"line_number":6596,"context_line":"                    # remove the volume connection without detaching from"},{"line_number":6597,"context_line":"                    # hypervisor because the instance is not running anymore"},{"line_number":6598,"context_line":"                    # on the current host"},{"line_number":6599,"context_line":""},{"line_number":6600,"context_line":"                    # Detaching volumes is a call to an external API that can"},{"line_number":6601,"context_line":"                    # fail. If it does, we need to handle it gracefully so that"},{"line_number":6602,"context_line":"                    # the call to _post_live_migration_at_destination - where"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_e000e402","line":6599,"in_reply_to":"3f79a3b5_1d87895d","updated":"2018-10-12 17:17:17.000000000","message":"I had the try/except around the for loop, then Dan rightly pointed out that the first time we hit an error we bail on the loop and miss cleaning up any remaining BDMs, so I moved them around each API call and made 2 of them instead of one. I\u0027ll re-unify them, but keep it inside the loop.","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b98e3aabba62b282e33196ae4e9e46c74c6960a5","unresolved":false,"context_lines":[{"line_number":6599,"context_line":""},{"line_number":6600,"context_line":"                    # Detaching volumes is a call to an external API that can"},{"line_number":6601,"context_line":"                    # fail. If it does, we need to handle it gracefully so that"},{"line_number":6602,"context_line":"                    # the call to _post_live_migration_at_destination - where"},{"line_number":6603,"context_line":"                    # we set instance host and task state - still happens. We"},{"line_number":6604,"context_line":"                    # need to rethink the current approach of setting instance"},{"line_number":6605,"context_line":"                    # host and task state AFTER a whole bunch of things that"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_bde53540","line":6602,"range":{"start_line":6602,"start_character":34,"end_line":6602,"end_character":35},"updated":"2018-10-12 16:18:05.000000000","message":"nix","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2fa87dced813125d5bd982207209ec10c62ff3a0","unresolved":false,"context_lines":[{"line_number":6599,"context_line":""},{"line_number":6600,"context_line":"                    # Detaching volumes is a call to an external API that can"},{"line_number":6601,"context_line":"                    # fail. If it does, we need to handle it gracefully so that"},{"line_number":6602,"context_line":"                    # the call to _post_live_migration_at_destination - where"},{"line_number":6603,"context_line":"                    # we set instance host and task state - still happens. We"},{"line_number":6604,"context_line":"                    # need to rethink the current approach of setting instance"},{"line_number":6605,"context_line":"                    # host and task state AFTER a whole bunch of things that"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_804fb067","line":6602,"range":{"start_line":6602,"start_character":34,"end_line":6602,"end_character":35},"in_reply_to":"3f79a3b5_bde53540","updated":"2018-10-12 17:17:17.000000000","message":"Done","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2c5f30339275b07b71685da40fe24c58d1082262","unresolved":false,"context_lines":[{"line_number":6604,"context_line":"                    # need to rethink the current approach of setting instance"},{"line_number":6605,"context_line":"                    # host and task state AFTER a whole bunch of things that"},{"line_number":6606,"context_line":"                    # could fail in unhandled ways, but that is left as a"},{"line_number":6607,"context_line":"                    # TODO(artom)."},{"line_number":6608,"context_line":"                    try:"},{"line_number":6609,"context_line":"                        self.volume_api.terminate_connection(ctxt,"},{"line_number":6610,"context_line":"                                                             bdm.volume_id,"},{"line_number":6611,"context_line":"                                                             connector)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_1d5562f9","line":6608,"range":{"start_line":6607,"start_character":22,"end_line":6608,"end_character":24},"updated":"2018-10-11 18:00:04.000000000","message":"ya this is a good first step but the generic fix may be to update the instance host as the first post migration step\nbut haveing said that we still should try to do as much cleanup on the source as possible which this enables by catching the exceptions an contiueing to clean up the remaining volumes.","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b98e3aabba62b282e33196ae4e9e46c74c6960a5","unresolved":false,"context_lines":[{"line_number":6621,"context_line":"                        migrate_data.old_vol_attachment_ids[bdm.volume_id]"},{"line_number":6622,"context_line":"                    try:"},{"line_number":6623,"context_line":"                        self.volume_api.attachment_delete(ctxt,"},{"line_number":6624,"context_line":"                                                          old_attachment_id)"},{"line_number":6625,"context_line":"                    except Exception as e:"},{"line_number":6626,"context_line":"                        LOG.error(\u0027Attachment for volume %s not cleaned up \u0027"},{"line_number":6627,"context_line":"                                  \u0027on source %s during post_live_migration: \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_9dc959ac","line":6624,"range":{"start_line":6624,"start_character":58,"end_line":6624,"end_character":75},"updated":"2018-10-12 16:18:05.000000000","message":"nit: might be useful to log the volume attachment ID that we\u0027re trying to delete.","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2fa87dced813125d5bd982207209ec10c62ff3a0","unresolved":false,"context_lines":[{"line_number":6621,"context_line":"                        migrate_data.old_vol_attachment_ids[bdm.volume_id]"},{"line_number":6622,"context_line":"                    try:"},{"line_number":6623,"context_line":"                        self.volume_api.attachment_delete(ctxt,"},{"line_number":6624,"context_line":"                                                          old_attachment_id)"},{"line_number":6625,"context_line":"                    except Exception as e:"},{"line_number":6626,"context_line":"                        LOG.error(\u0027Attachment for volume %s not cleaned up \u0027"},{"line_number":6627,"context_line":"                                  \u0027on source %s during post_live_migration: \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_20401c32","line":6624,"range":{"start_line":6624,"start_character":58,"end_line":6624,"end_character":75},"in_reply_to":"3f79a3b5_9dc959ac","updated":"2018-10-12 17:17:17.000000000","message":"Done","commit_id":"0b5385280b183dfce0839cbbba3bda4d43c06568"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62874518326e29d09d44efb43cd97b4e788c3fa4","unresolved":false,"context_lines":[{"line_number":6611,"context_line":"                    else:"},{"line_number":6612,"context_line":"                        # cinder v3.44 api flow - delete the old attachment"},{"line_number":6613,"context_line":"                        # for the source host"},{"line_number":6614,"context_line":"                        volume_id \u003d \\"},{"line_number":6615,"context_line":"                            migrate_data.old_vol_attachment_ids[bdm.volume_id]"},{"line_number":6616,"context_line":"                        self.volume_api.attachment_delete(ctxt, volume_id)"},{"line_number":6617,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_c8028a08","line":6614,"range":{"start_line":6614,"start_character":24,"end_line":6614,"end_character":33},"updated":"2018-10-15 18:38:13.000000000","message":"This is not a volume resource, this is a volume attachment resource, which is a different thing. I guess you were trying to do this so you only needed on error message below which could handle both, but that\u0027s not really going to fly here since cleaning up the volume (old style) vs cleaning up the attachment record (new style) are different things.\n\nI\u0027m not sure what you\u0027d want to do here. The try/except for each API call is kind of gross, but saying volume in the message when it\u0027s an attachment record is also misleading. You could do something like this in the error message:\n\n\"Attachment (%s) for volume %s not cleaned up on...\"\n\nAnd then that variable is:\n\nbdm.attachment_id or \u0027n/a\u0027\n\nAnd then the volume substitution variable in the message is just bdm.volume_id.\n\nOr just do separate error messages depending on if bdm.attachment_id is None.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":6611,"context_line":"                    else:"},{"line_number":6612,"context_line":"                        # cinder v3.44 api flow - delete the old attachment"},{"line_number":6613,"context_line":"                        # for the source host"},{"line_number":6614,"context_line":"                        volume_id \u003d \\"},{"line_number":6615,"context_line":"                            migrate_data.old_vol_attachment_ids[bdm.volume_id]"},{"line_number":6616,"context_line":"                        self.volume_api.attachment_delete(ctxt, volume_id)"},{"line_number":6617,"context_line":"                except Exception as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_88f6d2d7","line":6614,"range":{"start_line":6614,"start_character":24,"end_line":6614,"end_character":33},"in_reply_to":"3f79a3b5_c8028a08","updated":"2018-10-15 19:54:54.000000000","message":"Yeah, I was trying to cheat and consolidate the code as much as possible. I think I\u0027ll just have two error messages.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1ff168241a961f0ed44f007a011dcdef11c9824","unresolved":false,"context_lines":[{"line_number":6605,"context_line":"                        # remove the volume connection without detaching from"},{"line_number":6606,"context_line":"                        # hypervisor because the instance is not running"},{"line_number":6607,"context_line":"                        # anymore on the current host"},{"line_number":6608,"context_line":"                            self.volume_api.terminate_connection(ctxt,"},{"line_number":6609,"context_line":"                                                                 bdm.volume_id,"},{"line_number":6610,"context_line":"                                                                 connector)"},{"line_number":6611,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_b4b1a393","line":6608,"range":{"start_line":6608,"start_character":24,"end_line":6608,"end_character":28},"updated":"2018-10-15 22:27:26.000000000","message":"oh dear","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":6605,"context_line":"                        # remove the volume connection without detaching from"},{"line_number":6606,"context_line":"                        # hypervisor because the instance is not running"},{"line_number":6607,"context_line":"                        # anymore on the current host"},{"line_number":6608,"context_line":"                            self.volume_api.terminate_connection(ctxt,"},{"line_number":6609,"context_line":"                                                                 bdm.volume_id,"},{"line_number":6610,"context_line":"                                                                 connector)"},{"line_number":6611,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_af7cf0e9","line":6608,"range":{"start_line":6608,"start_character":24,"end_line":6608,"end_character":28},"in_reply_to":"3f79a3b5_b4b1a393","updated":"2018-10-15 23:31:55.000000000","message":"Derp :(","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1ff168241a961f0ed44f007a011dcdef11c9824","unresolved":false,"context_lines":[{"line_number":6618,"context_line":"                except Exception as e:"},{"line_number":6619,"context_line":"                    if bdm.attachment_id is None:"},{"line_number":6620,"context_line":"                        LOG.error(\u0027Connection for volume %s not terminated on \u0027"},{"line_number":6621,"context_line":"                                 \u0027source %s during post_live_migration: %s\u0027,"},{"line_number":6622,"context_line":"                                 bdm.volume_id, self.host, six.text_type(e),"},{"line_number":6623,"context_line":"                                 instance\u003dinstance)"},{"line_number":6624,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_54f28f6a","line":6621,"range":{"start_line":6621,"start_character":34,"end_line":6621,"end_character":40},"updated":"2018-10-15 22:27:26.000000000","message":"source host","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":6618,"context_line":"                except Exception as e:"},{"line_number":6619,"context_line":"                    if bdm.attachment_id is None:"},{"line_number":6620,"context_line":"                        LOG.error(\u0027Connection for volume %s not terminated on \u0027"},{"line_number":6621,"context_line":"                                 \u0027source %s during post_live_migration: %s\u0027,"},{"line_number":6622,"context_line":"                                 bdm.volume_id, self.host, six.text_type(e),"},{"line_number":6623,"context_line":"                                 instance\u003dinstance)"},{"line_number":6624,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_cf7fecdb","line":6621,"range":{"start_line":6621,"start_character":34,"end_line":6621,"end_character":40},"in_reply_to":"3f79a3b5_54f28f6a","updated":"2018-10-15 23:31:55.000000000","message":"Done","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1ff168241a961f0ed44f007a011dcdef11c9824","unresolved":false,"context_lines":[{"line_number":6618,"context_line":"                except Exception as e:"},{"line_number":6619,"context_line":"                    if bdm.attachment_id is None:"},{"line_number":6620,"context_line":"                        LOG.error(\u0027Connection for volume %s not terminated on \u0027"},{"line_number":6621,"context_line":"                                 \u0027source %s during post_live_migration: %s\u0027,"},{"line_number":6622,"context_line":"                                 bdm.volume_id, self.host, six.text_type(e),"},{"line_number":6623,"context_line":"                                 instance\u003dinstance)"},{"line_number":6624,"context_line":"                    else:"},{"line_number":6625,"context_line":"                        LOG.error(\u0027Volume attachment %s not deleted on source \u0027"},{"line_number":6626,"context_line":"                                  \u0027%s during post_live_migration: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_f4eddb8d","line":6623,"range":{"start_line":6621,"start_character":32,"end_line":6623,"end_character":51},"updated":"2018-10-15 22:27:26.000000000","message":"ew alignment","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":6618,"context_line":"                except Exception as e:"},{"line_number":6619,"context_line":"                    if bdm.attachment_id is None:"},{"line_number":6620,"context_line":"                        LOG.error(\u0027Connection for volume %s not terminated on \u0027"},{"line_number":6621,"context_line":"                                 \u0027source %s during post_live_migration: %s\u0027,"},{"line_number":6622,"context_line":"                                 bdm.volume_id, self.host, six.text_type(e),"},{"line_number":6623,"context_line":"                                 instance\u003dinstance)"},{"line_number":6624,"context_line":"                    else:"},{"line_number":6625,"context_line":"                        LOG.error(\u0027Volume attachment %s not deleted on source \u0027"},{"line_number":6626,"context_line":"                                  \u0027%s during post_live_migration: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_8f65744b","line":6623,"range":{"start_line":6621,"start_character":32,"end_line":6623,"end_character":51},"in_reply_to":"3f79a3b5_f4eddb8d","updated":"2018-10-15 23:31:55.000000000","message":"Double derp :(","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1ff168241a961f0ed44f007a011dcdef11c9824","unresolved":false,"context_lines":[{"line_number":6622,"context_line":"                                 bdm.volume_id, self.host, six.text_type(e),"},{"line_number":6623,"context_line":"                                 instance\u003dinstance)"},{"line_number":6624,"context_line":"                    else:"},{"line_number":6625,"context_line":"                        LOG.error(\u0027Volume attachment %s not deleted on source \u0027"},{"line_number":6626,"context_line":"                                  \u0027%s during post_live_migration: %s\u0027,"},{"line_number":6627,"context_line":"                                  old_attachment_id, self.host,"},{"line_number":6628,"context_line":"                                  six.text_type(e), instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_f492bbfb","line":6625,"range":{"start_line":6625,"start_character":71,"end_line":6625,"end_character":77},"updated":"2018-10-15 22:27:26.000000000","message":"source host","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":6622,"context_line":"                                 bdm.volume_id, self.host, six.text_type(e),"},{"line_number":6623,"context_line":"                                 instance\u003dinstance)"},{"line_number":6624,"context_line":"                    else:"},{"line_number":6625,"context_line":"                        LOG.error(\u0027Volume attachment %s not deleted on source \u0027"},{"line_number":6626,"context_line":"                                  \u0027%s during post_live_migration: %s\u0027,"},{"line_number":6627,"context_line":"                                  old_attachment_id, self.host,"},{"line_number":6628,"context_line":"                                  six.text_type(e), instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_4f6bdc1a","line":6625,"range":{"start_line":6625,"start_character":71,"end_line":6625,"end_character":77},"in_reply_to":"3f79a3b5_f492bbfb","updated":"2018-10-15 23:31:55.000000000","message":"Done","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"}],"nova/tests/functional/compute/test_live_migration.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1ff168241a961f0ed44f007a011dcdef11c9824","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def __call__(self, *args, **kwargs):"},{"line_number":38,"context_line":"        self.call_count +\u003d 1"},{"line_number":39,"context_line":"        if self.raise_count \u003d\u003d 0:"},{"line_number":40,"context_line":"            self.raise_count + 1"},{"line_number":41,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_7486abbc","line":40,"range":{"start_line":40,"start_character":29,"end_line":40,"end_character":30},"updated":"2018-10-15 22:27:26.000000000","message":"+\u003d","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def __call__(self, *args, **kwargs):"},{"line_number":38,"context_line":"        self.call_count +\u003d 1"},{"line_number":39,"context_line":"        if self.raise_count \u003d\u003d 0:"},{"line_number":40,"context_line":"            self.raise_count + 1"},{"line_number":41,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_2f49c0b6","line":40,"range":{"start_line":40,"start_character":29,"end_line":40,"end_character":30},"in_reply_to":"3f79a3b5_54a04f36","updated":"2018-10-15 23:31:55.000000000","message":"Done","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d14c1376c5d044672fa8db6c351fb9d211ae7b78","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def __call__(self, *args, **kwargs):"},{"line_number":38,"context_line":"        self.call_count +\u003d 1"},{"line_number":39,"context_line":"        if self.raise_count \u003d\u003d 0:"},{"line_number":40,"context_line":"            self.raise_count + 1"},{"line_number":41,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_54a04f36","line":40,"range":{"start_line":40,"start_character":29,"end_line":40,"end_character":30},"in_reply_to":"3f79a3b5_7486abbc","updated":"2018-10-15 22:28:34.000000000","message":"Should probably assert the raise_count in each test.","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def __call__(self, *args, **kwargs):"},{"line_number":38,"context_line":"        self.call_count +\u003d 1"},{"line_number":39,"context_line":"        if self.raise_count \u003d\u003d 0:"},{"line_number":40,"context_line":"            self.raise_count + 1"},{"line_number":41,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_0f63a442","line":40,"range":{"start_line":40,"start_character":29,"end_line":40,"end_character":30},"in_reply_to":"3f79a3b5_7486abbc","updated":"2018-10-15 23:31:55.000000000","message":"Triple derp :(","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d14c1376c5d044672fa8db6c351fb9d211ae7b78","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._wait_for_server_parameter(self.api, server,"},{"line_number":104,"context_line":"                                        {\u0027OS-EXT-SRV-ATTR:host\u0027: dest,"},{"line_number":105,"context_line":"                                         \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":106,"context_line":"        self.assertEqual(stub_terminate_connection.call_count, 2)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def test_live_migrate_attachment_delete_fails(self):"},{"line_number":109,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_14641720","line":106,"range":{"start_line":106,"start_character":13,"end_line":106,"end_character":24},"updated":"2018-10-15 22:28:34.000000000","message":"switch the args: (expected, actual)","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        self._wait_for_server_parameter(self.api, server,"},{"line_number":104,"context_line":"                                        {\u0027OS-EXT-SRV-ATTR:host\u0027: dest,"},{"line_number":105,"context_line":"                                         \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":106,"context_line":"        self.assertEqual(stub_terminate_connection.call_count, 2)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def test_live_migrate_attachment_delete_fails(self):"},{"line_number":109,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_4f443c9f","line":106,"range":{"start_line":106,"start_character":13,"end_line":106,"end_character":24},"in_reply_to":"3f79a3b5_14641720","updated":"2018-10-15 23:31:55.000000000","message":"Done","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d14c1376c5d044672fa8db6c351fb9d211ae7b78","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self._wait_for_server_parameter(self.api, server,"},{"line_number":144,"context_line":"                                        {\u0027OS-EXT-SRV-ATTR:host\u0027: dest,"},{"line_number":145,"context_line":"                                         \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":146,"context_line":"        self.assertEqual(stub_attachment_delete.call_count, 2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_f4607b0f","line":146,"range":{"start_line":146,"start_character":13,"end_line":146,"end_character":24},"updated":"2018-10-15 22:28:34.000000000","message":"switch the args: (expected actual)","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"40bdc4bb42f14e0ad56a0ed2fd052b04e2c05871","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self._wait_for_server_parameter(self.api, server,"},{"line_number":144,"context_line":"                                        {\u0027OS-EXT-SRV-ATTR:host\u0027: dest,"},{"line_number":145,"context_line":"                                         \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":146,"context_line":"        self.assertEqual(stub_attachment_delete.call_count, 2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_efc42810","line":146,"range":{"start_line":146,"start_character":13,"end_line":146,"end_character":24},"in_reply_to":"3f79a3b5_f4607b0f","updated":"2018-10-15 23:31:55.000000000","message":"Done","commit_id":"2f0fe1ef1f287b21980c07a5d46aea06ad469fe5"}],"nova/tests/functional/regressions/test_bug_1628606.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"81fc38a4a3228b8784d86aa73432535ff71393dc","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":81,"context_line":"        self._wait_for_server_parameter(self.api, server,"},{"line_number":82,"context_line":"                                        {\u0027OS-EXT-SRV-ATTR:host\u0027: dest,"},{"line_number":83,"context_line":"                                         \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_live_migrate_attachment_delete_fails(self):"},{"line_number":86,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_e3d30e5e","line":83,"updated":"2018-10-12 18:01:32.000000000","message":"With no asserts here it\u0027s hard to know if what you actually intended to do was done. Since you\u0027re stubbing the terminate connection, maybe just make sure that got called?\n\nAlso, I think it\u0027d be good to ensure correctness in the behavior we want, which is that we continued to detach non-failed volumes before and after the failed one. Perhaps that would be better done as a unit test?","commit_id":"46970873eb1cf79a886f4fc9d3343fdd2789a659"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"924bab16a250fbd9cd7892232755d803b86ca8ea","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":81,"context_line":"        self._wait_for_server_parameter(self.api, server,"},{"line_number":82,"context_line":"                                        {\u0027OS-EXT-SRV-ATTR:host\u0027: dest,"},{"line_number":83,"context_line":"                                         \u0027status\u0027: \u0027ACTIVE\u0027})"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_live_migrate_attachment_delete_fails(self):"},{"line_number":86,"context_line":"        self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_e3322e0f","line":83,"in_reply_to":"3f79a3b5_e3d30e5e","updated":"2018-10-12 18:36:03.000000000","message":"\u003e With no asserts here it\u0027s hard to know if what you actually\n \u003e intended to do was done. Since you\u0027re stubbing the terminate\n \u003e connection, maybe just make sure that got called?\n\n_wait_for_server_parameter is sort of like an assert already? That\u0027s why I\u0027m counting on, anyways ;)\n\n \u003e Also, I think it\u0027d be good to ensure correctness in the behavior we\n \u003e want, which is that we continued to detach non-failed volumes\n \u003e before and after the failed one. Perhaps that would be better done\n \u003e as a unit test?\n\nThe amount of mocking I\u0027d have to do in unit tests is ludicrous. I did a thing here, hopefully it\u0027s not too hacky.","commit_id":"46970873eb1cf79a886f4fc9d3343fdd2789a659"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62874518326e29d09d44efb43cd97b4e788c3fa4","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def __init__(self):"},{"line_number":35,"context_line":"        self.call_count \u003d 0"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __call__(self, context, volume_id, connector\u003dNone):"},{"line_number":38,"context_line":"        self.call_count +\u003d 1"},{"line_number":39,"context_line":"        if volume_id \u003d\u003d uuids.broken_volume:"},{"line_number":40,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_883ed2b6","line":37,"range":{"start_line":37,"start_character":43,"end_line":37,"end_character":57},"updated":"2018-10-15 18:38:13.000000000","message":"How does this work for attachment_delete which doesn\u0027t have a connector arg? Why not just do:\n\ndef __call__(self, context, volume_id, *args, **kwargs)","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def __init__(self):"},{"line_number":35,"context_line":"        self.call_count \u003d 0"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __call__(self, context, volume_id, connector\u003dNone):"},{"line_number":38,"context_line":"        self.call_count +\u003d 1"},{"line_number":39,"context_line":"        if volume_id \u003d\u003d uuids.broken_volume:"},{"line_number":40,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_088de228","line":37,"range":{"start_line":37,"start_character":43,"end_line":37,"end_character":57},"in_reply_to":"3f79a3b5_883ed2b6","updated":"2018-10-15 19:54:54.000000000","message":"Done","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bb69c826bd9bfb50305e48c616f81648c13660b8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class LiveMigrationCinderFailure(integrated_helpers._IntegratedTestBase,"},{"line_number":44,"context_line":"                                 integrated_helpers.InstanceHelperMixin):"},{"line_number":45,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":46,"context_line":"    microversion \u003d \u0027latest\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_88c3328a","line":43,"range":{"start_line":43,"start_character":6,"end_line":43,"end_character":32},"updated":"2018-10-15 18:40:14.000000000","message":"You\u0027ve got this in the regressions subdirectory but this isn\u0027t really a regression bug, this is latent behavior. So it should probably live somewhere else.\n\nMaybe just: nova/tests/functional/compute/test_live_migration.py?","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            raise exception.CinderConnectionFailed(reason\u003d\u0027Fake Cinder error\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class LiveMigrationCinderFailure(integrated_helpers._IntegratedTestBase,"},{"line_number":44,"context_line":"                                 integrated_helpers.InstanceHelperMixin):"},{"line_number":45,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":46,"context_line":"    microversion \u003d \u0027latest\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_c8928a4a","line":43,"range":{"start_line":43,"start_character":6,"end_line":43,"end_character":32},"in_reply_to":"3f79a3b5_88c3328a","updated":"2018-10-15 19:54:54.000000000","message":"Done","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62874518326e29d09d44efb43cd97b4e788c3fa4","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # For whatever reason we need this mock to avoid Cinder complaining about"},{"line_number":60,"context_line":"    # auth."},{"line_number":61,"context_line":"    @mock.patch("},{"line_number":62,"context_line":"        \u0027nova.objects.service.get_minimum_version_all_cells\u0027,"},{"line_number":63,"context_line":"        return_value\u003dcompute_api.CINDER_V3_ATTACH_MIN_COMPUTE_VERSION - 1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_e8a186f7","line":60,"range":{"start_line":60,"start_character":6,"end_line":60,"end_character":10},"updated":"2018-10-15 18:38:13.000000000","message":"This is because this test isn\u0027t using CinderFixtureNewAttachFlow and that doesn\u0027t fake out terminate_connection. So update the comment to explain that for the old flow with terminate_connection, we hack the service version to indicate we have old computes.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # For whatever reason we need this mock to avoid Cinder complaining about"},{"line_number":60,"context_line":"    # auth."},{"line_number":61,"context_line":"    @mock.patch("},{"line_number":62,"context_line":"        \u0027nova.objects.service.get_minimum_version_all_cells\u0027,"},{"line_number":63,"context_line":"        return_value\u003dcompute_api.CINDER_V3_ATTACH_MIN_COMPUTE_VERSION - 1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_68a1f691","line":60,"range":{"start_line":60,"start_character":6,"end_line":60,"end_character":10},"in_reply_to":"3f79a3b5_e8a186f7","updated":"2018-10-15 19:54:54.000000000","message":"Thanks for the explanation, done.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62874518326e29d09d44efb43cd97b4e788c3fa4","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        server \u003d self.api.post_server({"},{"line_number":67,"context_line":"            \u0027server\u0027: {"},{"line_number":68,"context_line":"                \u0027flavorRef\u0027: 1,"},{"line_number":69,"context_line":"                \u0027imageRef\u0027: \u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":70,"context_line":"                \u0027name\u0027: \u0027live-migrate-terminate-connection-fail-test\u0027,"},{"line_number":71,"context_line":"                \u0027networks\u0027: \u0027none\u0027,"},{"line_number":72,"context_line":"                \u0027block_device_mapping_v2\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_0882c252","line":69,"range":{"start_line":69,"start_character":29,"end_line":69,"end_character":65},"updated":"2018-10-15 18:38:13.000000000","message":"If you mean for this to be a volume-backed server, then why specify an image? Shouldn\u0027t this just be \u0027\u0027?","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        server \u003d self.api.post_server({"},{"line_number":67,"context_line":"            \u0027server\u0027: {"},{"line_number":68,"context_line":"                \u0027flavorRef\u0027: 1,"},{"line_number":69,"context_line":"                \u0027imageRef\u0027: \u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":70,"context_line":"                \u0027name\u0027: \u0027live-migrate-terminate-connection-fail-test\u0027,"},{"line_number":71,"context_line":"                \u0027networks\u0027: \u0027none\u0027,"},{"line_number":72,"context_line":"                \u0027block_device_mapping_v2\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_28645e20","line":69,"range":{"start_line":69,"start_character":29,"end_line":69,"end_character":65},"in_reply_to":"3f79a3b5_0882c252","updated":"2018-10-15 19:54:54.000000000","message":"It wasn\u0027t meant to be a a volume backed server... should it have been? Does it matter? If an instance has volume(s), regardless of whether they\u0027re the root or not, Nova still has to handle updating connections/attachments during live migration, right?","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2af61c99f4a38252d35fb82f68acf8077bacf2b4","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        server \u003d self.api.post_server({"},{"line_number":67,"context_line":"            \u0027server\u0027: {"},{"line_number":68,"context_line":"                \u0027flavorRef\u0027: 1,"},{"line_number":69,"context_line":"                \u0027imageRef\u0027: \u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":70,"context_line":"                \u0027name\u0027: \u0027live-migrate-terminate-connection-fail-test\u0027,"},{"line_number":71,"context_line":"                \u0027networks\u0027: \u0027none\u0027,"},{"line_number":72,"context_line":"                \u0027block_device_mapping_v2\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_14a2d7ad","line":69,"range":{"start_line":69,"start_character":29,"end_line":69,"end_character":65},"in_reply_to":"3f79a3b5_28645e20","updated":"2018-10-15 22:01:59.000000000","message":"Yeah, it doesn\u0027t have to be volume-backed, it\u0027s just weird because with boot_index\u003d0 that means volume-backed to me which means the imageRef is ignored. It doesn\u0027t matter for the test, just my delicate bdm sensibilities.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62874518326e29d09d44efb43cd97b4e788c3fa4","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        server \u003d self.api.post_server({"},{"line_number":109,"context_line":"            \u0027server\u0027: {"},{"line_number":110,"context_line":"                \u0027flavorRef\u0027: 1,"},{"line_number":111,"context_line":"                \u0027imageRef\u0027: \u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":112,"context_line":"                \u0027name\u0027: \u0027live-migrate-attachment-delete-fail-test\u0027,"},{"line_number":113,"context_line":"                \u0027networks\u0027: \u0027none\u0027,"},{"line_number":114,"context_line":"                \u0027block_device_mapping_v2\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_8895728a","line":111,"updated":"2018-10-15 18:38:13.000000000","message":"same","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4279a8bd26a2e4e390d816829ca303cd99e27d4b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            }"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        stub_attachment_delete \u003d FakeCinderError()"},{"line_number":138,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attachment_delete\u0027,"},{"line_number":139,"context_line":"                      stub_attachment_delete)"},{"line_number":140,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":141,"context_line":"        self._wait_for_server_parameter(self.api, server,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_a8f14ee0","line":138,"updated":"2018-10-15 18:46:03.000000000","message":"Something is wrong with this. I moved the try/except in the code to only be on the terminate_connection call and the test still passed.\n\nosboxes@osboxes:~/git/nova$ git diff\ndiff --git a/nova/compute/manager.py b/nova/compute/manager.py\nindex be0946c..7422395 100644\n--- a/nova/compute/manager.py\n+++ b/nova/compute/manager.py\n@@ -6595,30 +6595,30 @@ class ComputeManager(manager.Manager):\n                 # current approach of setting instance host and task state\n                 # AFTER a whole bunch of things that could fail in unhandled\n                 # ways, but that is left as a TODO(artom).\n-                try:\n-                    if bdm.attachment_id is None:\n-                        # Prior to cinder v3.44:\n-                        # We don\u0027t want to actually mark the volume detached,\n-                        # or delete the bdm, just remove the connection from\n-                        # this host.\n-                        #\n-                        # remove the volume connection without detaching from\n-                        # hypervisor because the instance is not running\n-                        # anymore on the current host\n-                        volume_id \u003d bdm.volume_id\n+                if bdm.attachment_id is None:\n+                    # Prior to cinder v3.44:\n+                    # We don\u0027t want to actually mark the volume detached,\n+                    # or delete the bdm, just remove the connection from\n+                    # this host.\n+                    #\n+                    # remove the volume connection without detaching from\n+                    # hypervisor because the instance is not running\n+                    # anymore on the current host\n+                    volume_id \u003d bdm.volume_id\n+                    try:\n                         self.volume_api.terminate_connection(ctxt, volume_id,\n                                                              connector)\n-                    else:\n-                        # cinder v3.44 api flow - delete the old attachment\n-                        # for the source host\n-                        volume_id \u003d \\\n-                            migrate_data.old_vol_attachment_ids[bdm.volume_id]\n-                        self.volume_api.attachment_delete(ctxt, volume_id)\n-                except Exception as e:\n-                    LOG.error(\u0027Attachment for volume %s not cleaned up on \u0027\n-                              \u0027source %s during post_live_migration: %s\u0027,\n-                              volume_id, self.host, six.text_type(e),\n-                              instance\u003dinstance)\n+                    except Exception as e:\n+                        LOG.error(\u0027Attachment for volume %s not cleaned up on \u0027\n+                                  \u0027source %s during post_live_migration: %s\u0027,\n+                                  volume_id, self.host, six.text_type(e),\n+                                  instance\u003dinstance)\n+                else:\n+                    # cinder v3.44 api flow - delete the old attachment\n+                    # for the source host\n+                    volume_id \u003d \\\n+                        migrate_data.old_vol_attachment_ids[bdm.volume_id]\n+                    self.volume_api.attachment_delete(ctxt, volume_id)\n \n         # Releasing vlan.\n         # (not necessary in current implementation?)","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71683aeceebb15584c67a3c7b6bbeeda15416f6b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            }"},{"line_number":136,"context_line":"        }"},{"line_number":137,"context_line":"        stub_attachment_delete \u003d FakeCinderError()"},{"line_number":138,"context_line":"        self.stub_out(\u0027nova.volume.cinder.API.attachment_delete\u0027,"},{"line_number":139,"context_line":"                      stub_attachment_delete)"},{"line_number":140,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":141,"context_line":"        self._wait_for_server_parameter(self.api, server,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_3b1b46cb","line":138,"in_reply_to":"3f79a3b5_a8f14ee0","updated":"2018-10-15 19:54:54.000000000","message":"Ah, it\u0027s because my poor man\u0027s mock checks for volume_id, but is called with an attachment_id. I\u0027ve changed it to just raise the first time it\u0027s called.","commit_id":"06117d1a36bd145394a643b89d3874d8f09e371e"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"6a423d33ce6d27447f8d9edf044b5a6bb77d6560","unresolved":false,"context_lines":[{"line_number":2838,"context_line":""},{"line_number":2839,"context_line":"        self._delete_and_check_allocations(server)"},{"line_number":2840,"context_line":""},{"line_number":2841,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.terminate_connection\u0027,"},{"line_number":2842,"context_line":"                side_effect\u003dexception.CinderConnectionFailed("},{"line_number":2843,"context_line":"                    reason\u003d\u0027Fake Cinder API error\u0027))"},{"line_number":2844,"context_line":"    def test_live_migrate_terminate_connection_fails(self, _):"},{"line_number":2845,"context_line":"        self.test_live_migrate()"},{"line_number":2846,"context_line":""},{"line_number":2847,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.attachment_delete\u0027,"},{"line_number":2848,"context_line":"                side_effect\u003dexception.CinderConnectionFailed("},{"line_number":2849,"context_line":"                    reason\u003d\u0027Fake Cinder API error\u0027))"},{"line_number":2850,"context_line":"    def test_live_migrate_attachment_delete_fails(self, _):"},{"line_number":2851,"context_line":"        self.test_live_migrate()"},{"line_number":2852,"context_line":""},{"line_number":2853,"context_line":"    def test_live_migrate_pre_check_fails(self):"},{"line_number":2854,"context_line":"        \"\"\"Tests the case that the LiveMigrationTask in conductor has"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_cd10b1ae","line":2851,"range":{"start_line":2841,"start_character":0,"end_line":2851,"end_character":32},"updated":"2018-10-11 01:02:19.000000000","message":"These tests are successful even if there is no change in nova/compute/manager.py.\nThey are not adequate. Probably some assertions (server status ,task state?) should be added.","commit_id":"b63590736a8ef157753a77d256667e1d07d06df8"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"36df70577498ca6ca6b0498c854533a455cf8d0e","unresolved":false,"context_lines":[{"line_number":2838,"context_line":""},{"line_number":2839,"context_line":"        self._delete_and_check_allocations(server)"},{"line_number":2840,"context_line":""},{"line_number":2841,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.terminate_connection\u0027,"},{"line_number":2842,"context_line":"                side_effect\u003dexception.CinderConnectionFailed("},{"line_number":2843,"context_line":"                    reason\u003d\u0027Fake Cinder API error\u0027))"},{"line_number":2844,"context_line":"    def test_live_migrate_terminate_connection_fails(self, _):"},{"line_number":2845,"context_line":"        self.test_live_migrate()"},{"line_number":2846,"context_line":""},{"line_number":2847,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.attachment_delete\u0027,"},{"line_number":2848,"context_line":"                side_effect\u003dexception.CinderConnectionFailed("},{"line_number":2849,"context_line":"                    reason\u003d\u0027Fake Cinder API error\u0027))"},{"line_number":2850,"context_line":"    def test_live_migrate_attachment_delete_fails(self, _):"},{"line_number":2851,"context_line":"        self.test_live_migrate()"},{"line_number":2852,"context_line":""},{"line_number":2853,"context_line":"    def test_live_migrate_pre_check_fails(self):"},{"line_number":2854,"context_line":"        \"\"\"Tests the case that the LiveMigrationTask in conductor has"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_3363c2ad","line":2851,"range":{"start_line":2841,"start_character":0,"end_line":2851,"end_character":32},"in_reply_to":"3f79a3b5_cd10b1ae","updated":"2018-10-11 03:08:21.000000000","message":"Yep, looks like I took off the WIP tag too early. I\u0027ve re-WIP\u0027ed this, and changed the tests to something that I *think* should actually check the new exception handling, but for now I can\u0027t even get an instance with volumes to live migrate correctly in functional tests.","commit_id":"b63590736a8ef157753a77d256667e1d07d06df8"}]}
