)]}'
{"api-ref/source/servers-admin-action.inc":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"6ea3b355ae7899ed0535c60e072b486808f1a93d","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Normal response codes: 202"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":161,"context_line":"itemNotFound(404), conflict(409)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":9,"id":"7aa08908_7bc2da54","side":"PARENT","line":160,"range":{"start_line":160,"start_character":36,"end_line":160,"end_character":38},"updated":"2016-06-16 15:32:37.000000000","message":"from the code ,seems still able to raise 400?","commit_id":"dadd9168cb88bc9b332e1f5630e5d3d0ab548c28"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"fc732635212fbb11b7f7f4bef478c4d245beb838","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Normal response codes: 202"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":161,"context_line":"itemNotFound(404), conflict(409)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":9,"id":"5a9d85d2_b0fca03f","side":"PARENT","line":160,"range":{"start_line":160,"start_character":36,"end_line":160,"end_character":38},"in_reply_to":"7aa08908_7bc2da54","updated":"2016-06-20 10:22:31.000000000","message":"I treat this doc as valid for las microversion, if it\u0027s not I could restore badRequest","commit_id":"dadd9168cb88bc9b332e1f5630e5d3d0ab548c28"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a940b9c826e76b75946c82bb331880136cffe348","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Normal response codes: 202"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":161,"context_line":"itemNotFound(404), conflict(409)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"3aaa91ec_08298de6","side":"PARENT","line":160,"range":{"start_line":160,"start_character":33,"end_line":160,"end_character":36},"updated":"2016-06-23 20:51:00.000000000","message":"Everything before 2.31 can raise a 400 right? So we can\u0027t just drop this. We might need to make a note that after 2.31 we don\u0027t return a 400?","commit_id":"15f5aa013ee9bad7a6e0d2ae46856932a41ef107"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"1e54f7880b4832616946e12e5e08937ae67dddd4","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Normal response codes: 202"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":161,"context_line":"itemNotFound(404), conflict(409)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"3aaa91ec_b9d4ad46","side":"PARENT","line":160,"range":{"start_line":160,"start_character":33,"end_line":160,"end_character":36},"in_reply_to":"3aaa91ec_08298de6","updated":"2016-07-01 14:31:32.000000000","message":"Done","commit_id":"15f5aa013ee9bad7a6e0d2ae46856932a41ef107"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d9d8e7d6fd745a21bbc139993c283383f31bab59","unresolved":false,"context_lines":[{"line_number":156,"context_line":"through the ``policy.json`` file."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Starting from REST API version 2.34 pre-live-migration checks are done"},{"line_number":159,"context_line":"asynchronously, results of these checks are available in ``instance-actions``."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Normal response codes: 202"},{"line_number":162,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":14,"id":"1aa78d24_58b915ec","line":159,"updated":"2016-07-08 13:00:11.000000000","message":"I think we might want to explain that on a failed live-migrate the instance does not go into an error sate, and no error code is returned from the API. You must go and check instance-actions to see if the live-migrate completed with no errors.","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"6553d47540e4fcfedd6dcb3f8ad72aeae6a6fe80","unresolved":false,"context_lines":[{"line_number":156,"context_line":"through the ``policy.json`` file."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Starting from REST API version 2.34 pre-live-migration checks are done"},{"line_number":159,"context_line":"asynchronously, results of these checks are available in ``instance-actions``."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Normal response codes: 202"},{"line_number":162,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":14,"id":"1aa78d24_67fe976c","line":159,"in_reply_to":"1aa78d24_58b915ec","updated":"2016-07-11 16:56:16.000000000","message":"Done","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"387bf774334891d5bd00997c0c041d481e15ef80","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Starting from REST API version 2.34 pre-live-migration checks are done"},{"line_number":159,"context_line":"asynchronously, results of these checks are available in ``instance-actions``."},{"line_number":160,"context_line":"Nova responses immediately, and no pre-live-migration checks are returned."},{"line_number":161,"context_line":"Instance doesn\u0027t change state to ``ERROR`` in this case."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Normal response codes: 202"}],"source_content_type":"text/x-c++src","patch_set":16,"id":"1aa78d24_e471e00d","line":160,"updated":"2016-07-11 18:11:24.000000000","message":"s/responses/responds/","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ccd01a05a76acdb2457fb4c6f956f709a53fffb5","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Starting from REST API version 2.34 pre-live-migration checks are done"},{"line_number":159,"context_line":"asynchronously, results of these checks are available in ``instance-actions``."},{"line_number":160,"context_line":"Nova responses immediately, and no pre-live-migration checks are returned."},{"line_number":161,"context_line":"Instance doesn\u0027t change state to ``ERROR`` in this case."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Normal response codes: 202"}],"source_content_type":"text/x-c++src","patch_set":16,"id":"1aa78d24_af7a1122","line":160,"in_reply_to":"1aa78d24_e471e00d","updated":"2016-07-11 19:04:13.000000000","message":"Done","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"387bf774334891d5bd00997c0c041d481e15ef80","unresolved":false,"context_lines":[{"line_number":158,"context_line":"Starting from REST API version 2.34 pre-live-migration checks are done"},{"line_number":159,"context_line":"asynchronously, results of these checks are available in ``instance-actions``."},{"line_number":160,"context_line":"Nova responses immediately, and no pre-live-migration checks are returned."},{"line_number":161,"context_line":"Instance doesn\u0027t change state to ``ERROR`` in this case."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Normal response codes: 202"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":16,"id":"1aa78d24_4461d438","line":161,"updated":"2016-07-11 18:11:24.000000000","message":"s/Instance doesn\u0027t change/The instance will not immediately change/\ns/in this case/if a failure of the live-migration checks occurs/","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ccd01a05a76acdb2457fb4c6f956f709a53fffb5","unresolved":false,"context_lines":[{"line_number":158,"context_line":"Starting from REST API version 2.34 pre-live-migration checks are done"},{"line_number":159,"context_line":"asynchronously, results of these checks are available in ``instance-actions``."},{"line_number":160,"context_line":"Nova responses immediately, and no pre-live-migration checks are returned."},{"line_number":161,"context_line":"Instance doesn\u0027t change state to ``ERROR`` in this case."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Normal response codes: 202"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":16,"id":"1aa78d24_0f740534","line":161,"in_reply_to":"1aa78d24_4461d438","updated":"2016-07-11 19:04:13.000000000","message":"Done","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"}],"nova/api/openstack/api_version_request.py":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"6ea3b355ae7899ed0535c60e072b486808f1a93d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    * 2.30 - Add a force flag in live-migrate request body and change the"},{"line_number":81,"context_line":"             behaviour for the host flag by calling the scheduler."},{"line_number":82,"context_line":"    * 2.31 - Checks before live-migration are made in background."},{"line_number":83,"context_line":"             Os-Migratelive Action is not throwing badRequest."},{"line_number":84,"context_line":"\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_7bb81a12","line":83,"range":{"start_line":83,"start_character":13,"end_line":83,"end_character":15},"updated":"2016-06-16 15:32:37.000000000","message":"nit: os-migrateLive","commit_id":"64fd0b3ed63d12d2b0479d2c46098db9e4e7bb42"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"fc732635212fbb11b7f7f4bef478c4d245beb838","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    * 2.30 - Add a force flag in live-migrate request body and change the"},{"line_number":81,"context_line":"             behaviour for the host flag by calling the scheduler."},{"line_number":82,"context_line":"    * 2.31 - Checks before live-migration are made in background."},{"line_number":83,"context_line":"             Os-Migratelive Action is not throwing badRequest."},{"line_number":84,"context_line":"\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a9d85d2_30d1d0ce","line":83,"range":{"start_line":83,"start_character":13,"end_line":83,"end_character":15},"in_reply_to":"7aa08908_7bb81a12","updated":"2016-06-20 10:22:31.000000000","message":"Done","commit_id":"64fd0b3ed63d12d2b0479d2c46098db9e4e7bb42"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"d5cad6088f2a9218cccd06da07effa94485b7174","unresolved":false,"context_lines":[{"line_number":84,"context_line":"             request body."},{"line_number":85,"context_line":"    * 2.33 - Add pagination support for hypervisors."},{"line_number":86,"context_line":"    * 2.34 - Checks before live-migration are made in background."},{"line_number":87,"context_line":"             os-Migratelive Action is not throwing badRequest."},{"line_number":88,"context_line":"\"\"\""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_b626f3cb","line":87,"updated":"2016-07-05 20:53:54.000000000","message":"Probably more clear to just say that the API response will now indicate success in more cases and later errors will be exposed in instance-actions.","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"4b013f2183e436a30dffeffeedc36a238d60397d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"             request body."},{"line_number":85,"context_line":"    * 2.33 - Add pagination support for hypervisors."},{"line_number":86,"context_line":"    * 2.34 - Checks before live-migration are made in background."},{"line_number":87,"context_line":"             os-Migratelive Action is not throwing badRequest."},{"line_number":88,"context_line":"\"\"\""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_f1ae4080","line":87,"in_reply_to":"1aa78d24_b626f3cb","updated":"2016-07-07 21:30:47.000000000","message":"Done","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"387bf774334891d5bd00997c0c041d481e15ef80","unresolved":false,"context_lines":[{"line_number":84,"context_line":"             request body."},{"line_number":85,"context_line":"    * 2.33 - Add pagination support for hypervisors."},{"line_number":86,"context_line":"    * 2.34 - Checks before live-migration are made in asynchronous way."},{"line_number":87,"context_line":"             os-Migratelive Action is not throwing badRequest in case of"},{"line_number":88,"context_line":"             pre-checks failure. Verification result is available over"},{"line_number":89,"context_line":"             instance-actions."},{"line_number":90,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_84573c59","line":87,"updated":"2016-07-11 18:11:24.000000000","message":"s/is not throwing/does not throw/","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ccd01a05a76acdb2457fb4c6f956f709a53fffb5","unresolved":false,"context_lines":[{"line_number":84,"context_line":"             request body."},{"line_number":85,"context_line":"    * 2.33 - Add pagination support for hypervisors."},{"line_number":86,"context_line":"    * 2.34 - Checks before live-migration are made in asynchronous way."},{"line_number":87,"context_line":"             os-Migratelive Action is not throwing badRequest in case of"},{"line_number":88,"context_line":"             pre-checks failure. Verification result is available over"},{"line_number":89,"context_line":"             instance-actions."},{"line_number":90,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_0fab6576","line":87,"in_reply_to":"1aa78d24_84573c59","updated":"2016-07-11 19:04:13.000000000","message":"Done","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"}],"nova/api/openstack/compute/migrate_server.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"3b23447474b0df9b167f581f6f7f3178491c464c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    @extensions.expected_errors((400, 404, 409))"},{"line_number":64,"context_line":"    @wsgi.action(\u0027os-migrateLive\u0027)"},{"line_number":65,"context_line":"    @validation.schema(migrate_server.migrate_live, \"2.1\", \"2.24\")"},{"line_number":66,"context_line":"    @validation.schema(migrate_server.migrate_live_v2_25, \"2.25\", \"2.27\")"},{"line_number":67,"context_line":"    def _migrate_live(self, req, id, body):"},{"line_number":68,"context_line":"        \"\"\"Permit admins to (live) migrate a server to a new host.\"\"\""},{"line_number":69,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"dab17558_e1c22052","line":66,"updated":"2016-05-11 13:01:47.000000000","message":"This can\u0027t be right, what happens for 2.28?","commit_id":"3091af5f803266431db5723a3f925798cffa36fb"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"8532bcf3abf132a2fbfca3ae3297b1975f685b91","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    @extensions.expected_errors((400, 404, 409))"},{"line_number":64,"context_line":"    @wsgi.action(\u0027os-migrateLive\u0027)"},{"line_number":65,"context_line":"    @validation.schema(migrate_server.migrate_live, \"2.1\", \"2.24\")"},{"line_number":66,"context_line":"    @validation.schema(migrate_server.migrate_live_v2_25, \"2.25\", \"2.27\")"},{"line_number":67,"context_line":"    def _migrate_live(self, req, id, body):"},{"line_number":68,"context_line":"        \"\"\"Permit admins to (live) migrate a server to a new host.\"\"\""},{"line_number":69,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_b6481cce","line":66,"in_reply_to":"dab17558_e1c22052","updated":"2016-06-02 14:20:34.000000000","message":"yes, actually I shouldn\u0027t change this at all","commit_id":"3091af5f803266431db5723a3f925798cffa36fb"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"27993a65c4810c00403d10b06d7f0884af6d0241","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        except exception.InstanceUnknownCell as e:"},{"line_number":106,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":107,"context_line":"        # TODO(tdurakov): remove this on compute_task_api version switched to"},{"line_number":108,"context_line":"        # Newton EOL."},{"line_number":109,"context_line":"        except (exception.NoValidHost,"},{"line_number":110,"context_line":"                exception.ComputeServiceUnavailable,"},{"line_number":111,"context_line":"                exception.InvalidHypervisorType,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_91ade58a","line":108,"updated":"2016-06-10 16:48:43.000000000","message":"This needs to be supported as long as async can be False right? And that will be as long as the API \u003c 2.31 is supported, i.e. essentially forever.","commit_id":"0c8746059fe23c4a0dd074e01e51e1388757e231"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"5e4b38c75650c49e0ed8006c588987d025da137c","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        except exception.InstanceUnknownCell as e:"},{"line_number":106,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":107,"context_line":"        # TODO(tdurakov): remove this on compute_task_api version switched to"},{"line_number":108,"context_line":"        # Newton EOL."},{"line_number":109,"context_line":"        except (exception.NoValidHost,"},{"line_number":110,"context_line":"                exception.ComputeServiceUnavailable,"},{"line_number":111,"context_line":"                exception.InvalidHypervisorType,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_909d74be","line":108,"in_reply_to":"7aa08908_91ade58a","updated":"2016-06-14 09:11:22.000000000","message":"Done","commit_id":"0c8746059fe23c4a0dd074e01e51e1388757e231"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"6ea3b355ae7899ed0535c60e072b486808f1a93d","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":116,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":117,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":118,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":119,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":120,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":121,"context_line":"        except exception.InstanceInvalidState as state_error:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_3be172fd","line":118,"range":{"start_line":118,"start_character":22,"end_line":118,"end_character":36},"updated":"2016-06-16 15:32:37.000000000","message":"we still raise BadRequest?","commit_id":"64fd0b3ed63d12d2b0479d2c46098db9e4e7bb42"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"fc732635212fbb11b7f7f4bef478c4d245beb838","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":116,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":117,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":118,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":119,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":120,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":121,"context_line":"        except exception.InstanceInvalidState as state_error:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a9d85d2_b0e5c0a9","line":118,"range":{"start_line":118,"start_character":22,"end_line":118,"end_character":36},"in_reply_to":"7aa08908_3be172fd","updated":"2016-06-20 10:22:31.000000000","message":"for previous microversions it\u0027s still valid","commit_id":"64fd0b3ed63d12d2b0479d2c46098db9e4e7bb42"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a940b9c826e76b75946c82bb331880136cffe348","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                                          disk_over_commit, host, force, async)"},{"line_number":105,"context_line":"        except exception.InstanceUnknownCell as e:"},{"line_number":106,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":107,"context_line":"        except (exception.NoValidHost,"},{"line_number":108,"context_line":"                exception.ComputeServiceUnavailable,"},{"line_number":109,"context_line":"                exception.InvalidHypervisorType,"},{"line_number":110,"context_line":"                exception.InvalidCPUInfo,"},{"line_number":111,"context_line":"                exception.UnableToMigrateToSelf,"},{"line_number":112,"context_line":"                exception.DestinationHypervisorTooOld,"},{"line_number":113,"context_line":"                exception.InvalidLocalStorage,"},{"line_number":114,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":115,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":116,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":117,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":118,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":119,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":120,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":121,"context_line":"        except exception.InstanceInvalidState as state_error:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3aaa91ec_88c9fd28","line":118,"range":{"start_line":107,"start_character":8,"end_line":118,"end_character":69},"updated":"2016-06-23 20:51:00.000000000","message":"If we can\u0027t hit any of these \u003e\u003d2.31, I\u0027m wondering if we should split into two methods for handling this based on async or not, which could also modify the expected_errors decorator value. It might make the code messier though, I\u0027d have to see it.","commit_id":"d8f891f1e578ea21ff736140dd5b2ccfc90e3c5a"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"1e54f7880b4832616946e12e5e08937ae67dddd4","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                                          disk_over_commit, host, force, async)"},{"line_number":105,"context_line":"        except exception.InstanceUnknownCell as e:"},{"line_number":106,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":107,"context_line":"        except (exception.NoValidHost,"},{"line_number":108,"context_line":"                exception.ComputeServiceUnavailable,"},{"line_number":109,"context_line":"                exception.InvalidHypervisorType,"},{"line_number":110,"context_line":"                exception.InvalidCPUInfo,"},{"line_number":111,"context_line":"                exception.UnableToMigrateToSelf,"},{"line_number":112,"context_line":"                exception.DestinationHypervisorTooOld,"},{"line_number":113,"context_line":"                exception.InvalidLocalStorage,"},{"line_number":114,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":115,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":116,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":117,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":118,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":119,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":120,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":121,"context_line":"        except exception.InstanceInvalidState as state_error:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3aaa91ec_a0a3c2b0","line":118,"range":{"start_line":107,"start_character":8,"end_line":118,"end_character":69},"in_reply_to":"3aaa91ec_88c9fd28","updated":"2016-07-01 14:31:32.000000000","message":"I\u0027d not separating this, as method still could return 400, e.g. line 85. I\u0027ve updated release notes and api refs to highlight explicitly that nova stops responding with bad request for pre-checks failures only.","commit_id":"d8f891f1e578ea21ff736140dd5b2ccfc90e3c5a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be41e6212206e5424c3a82e4688558ee396aefe3","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        force \u003d None"},{"line_number":75,"context_line":"        async \u003d False"},{"line_number":76,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.34\u0027):"},{"line_number":77,"context_line":"            async \u003d True"},{"line_number":78,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.30\u0027):"},{"line_number":79,"context_line":"            force \u003d body[\"os-migrateLive\"].get(\"force\", False)"},{"line_number":80,"context_line":"            force \u003d strutils.bool_from_string(force, strict\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_0f7017a3","line":77,"updated":"2016-07-07 16:26:17.000000000","message":"I don\u0027t see a unit test that validates that we do the right thing for older versions. Am I missing it?","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"4b013f2183e436a30dffeffeedc36a238d60397d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        force \u003d None"},{"line_number":75,"context_line":"        async \u003d False"},{"line_number":76,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.34\u0027):"},{"line_number":77,"context_line":"            async \u003d True"},{"line_number":78,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.30\u0027):"},{"line_number":79,"context_line":"            force \u003d body[\"os-migrateLive\"].get(\"force\", False)"},{"line_number":80,"context_line":"            force \u003d strutils.bool_from_string(force, strict\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_f1248061","line":77,"in_reply_to":"1aa78d24_0f7017a3","updated":"2016-07-07 21:30:47.000000000","message":"Done","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1b065eb859c1ba4f782d98556108390abe56acb0","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":113,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":114,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":115,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":116,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":117,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":118,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_d19fb2b2","line":115,"updated":"2016-07-03 10:24:39.000000000","message":"There should be a set of exceptions won\u0027t be raised any more, due to we  aync call to the conductor. We should only catch the expected exception. For unexpected exception, the wsgi base code will return 500 for them. So we should catch different exception set in old  and new version api.","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"d5cad6088f2a9218cccd06da07effa94485b7174","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":113,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":114,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":115,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":116,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":117,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":118,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_d1474949","line":115,"in_reply_to":"1aa78d24_1bc6279a","updated":"2016-07-05 20:53:54.000000000","message":"I agree that we should be clear about which errors are expected for which microversion. At the very least it will make later cleanup easier. But if the async call raises an exception it shouldn\u0027t we should be able to note that.","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"76446cc9a3eabbf7f97ceffd4efe8fff6bbfeceb","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":113,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":114,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":115,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":116,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":117,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":118,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_e77c9474","line":115,"in_reply_to":"1aa78d24_493ca993","updated":"2016-07-04 14:10:56.000000000","message":"This is a valid point, but might decrease readability a lot. I\u0027d leave it as it is.","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"4b013f2183e436a30dffeffeedc36a238d60397d","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":113,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":114,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":115,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":116,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":117,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":118,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_31e60817","line":115,"in_reply_to":"1aa78d24_afb8e32a","updated":"2016-07-07 21:30:47.000000000","message":"Done","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"be41e6212206e5424c3a82e4688558ee396aefe3","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":113,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":114,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":115,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":116,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":117,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":118,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_afb8e32a","line":115,"in_reply_to":"1aa78d24_d1474949","updated":"2016-07-07 16:26:17.000000000","message":"I would disagree with this if it weren\u0027t so easy to split this into two handler clauses and note that if we hit the only-if-not-async one and async\u003dTrue then make a stink.","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"bdcd57d865c7e68a41f883e19bf119f2f63af410","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":113,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":114,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":115,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":116,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":117,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":118,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_493ca993","line":115,"in_reply_to":"1aa78d24_d19fb2b2","updated":"2016-07-04 09:17:42.000000000","message":"Until microversions below 2.34 are supported we couldn\u0027t remove these raise, and had to maintain old behaviour","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0fe10cb162455acb224d16e5bce27ec9eeacb468","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":113,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":114,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":115,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":116,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":117,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":118,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":13,"id":"1aa78d24_1bc6279a","line":115,"in_reply_to":"1aa78d24_e77c9474","updated":"2016-07-05 13:33:05.000000000","message":"How about we add variable called \u0027expected_bad_request_exps\u0027, it has a list of different exceptions based on the Microversion.","commit_id":"2057c4751b358f3bfbad56c3083d313906b3ce5b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"25a9daec0303dce163a4b930a3d8cc5c64964572","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    @validation.schema(migrate_server.migrate_live_v2_30, \"2.30\")"},{"line_number":127,"context_line":"    def _migrate_live(self, req, id, body):"},{"line_number":128,"context_line":"        \"\"\"Permit admins to (live) migrate a server to a new host.\"\"\""},{"line_number":129,"context_line":"        context \u003d req.environ[\"nova.context\"]"},{"line_number":130,"context_line":"        context.can(ms_policies.POLICY_ROOT % \u0027migrate_live\u0027)"},{"line_number":131,"context_line":"        async \u003d True"},{"line_number":132,"context_line":"        host \u003d body[\"os-migrateLive\"][\"host\"]"},{"line_number":133,"context_line":"        force \u003d body[\"os-migrateLive\"].get(\"force\", False)"},{"line_number":134,"context_line":"        force \u003d strutils.bool_from_string(force, strict\u003dTrue)"},{"line_number":135,"context_line":"        if force is True and not host:"},{"line_number":136,"context_line":"            message \u003d _(\"Can\u0027t force to a non-provided destination\")"},{"line_number":137,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmessage)"},{"line_number":138,"context_line":"        block_migration \u003d body[\"os-migrateLive\"][\"block_migration\"]"},{"line_number":139,"context_line":"        if block_migration \u003d\u003d \u0027auto\u0027:"},{"line_number":140,"context_line":"            block_migration \u003d None"},{"line_number":141,"context_line":"        else:"},{"line_number":142,"context_line":"            block_migration \u003d strutils.bool_from_string(block_migration,"},{"line_number":143,"context_line":"                                                            strict\u003dTrue)"},{"line_number":144,"context_line":"        disk_over_commit \u003d None"},{"line_number":145,"context_line":"        try:"},{"line_number":146,"context_line":"            instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":147,"context_line":"            self.compute_api.live_migrate(context, instance, block_migration,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_958228c7","line":144,"range":{"start_line":129,"start_character":0,"end_line":144,"end_character":31},"updated":"2016-07-08 12:58:19.000000000","message":"This really needs to be extracted into a common method. We will suck at maintaining the API if we have this level of duplication.\n\nMaybe a get_args(...) method that is able to get that arguments for the live_migrate call would do the trick?","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"6553d47540e4fcfedd6dcb3f8ad72aeae6a6fe80","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    @validation.schema(migrate_server.migrate_live_v2_30, \"2.30\")"},{"line_number":127,"context_line":"    def _migrate_live(self, req, id, body):"},{"line_number":128,"context_line":"        \"\"\"Permit admins to (live) migrate a server to a new host.\"\"\""},{"line_number":129,"context_line":"        context \u003d req.environ[\"nova.context\"]"},{"line_number":130,"context_line":"        context.can(ms_policies.POLICY_ROOT % \u0027migrate_live\u0027)"},{"line_number":131,"context_line":"        async \u003d True"},{"line_number":132,"context_line":"        host \u003d body[\"os-migrateLive\"][\"host\"]"},{"line_number":133,"context_line":"        force \u003d body[\"os-migrateLive\"].get(\"force\", False)"},{"line_number":134,"context_line":"        force \u003d strutils.bool_from_string(force, strict\u003dTrue)"},{"line_number":135,"context_line":"        if force is True and not host:"},{"line_number":136,"context_line":"            message \u003d _(\"Can\u0027t force to a non-provided destination\")"},{"line_number":137,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dmessage)"},{"line_number":138,"context_line":"        block_migration \u003d body[\"os-migrateLive\"][\"block_migration\"]"},{"line_number":139,"context_line":"        if block_migration \u003d\u003d \u0027auto\u0027:"},{"line_number":140,"context_line":"            block_migration \u003d None"},{"line_number":141,"context_line":"        else:"},{"line_number":142,"context_line":"            block_migration \u003d strutils.bool_from_string(block_migration,"},{"line_number":143,"context_line":"                                                            strict\u003dTrue)"},{"line_number":144,"context_line":"        disk_over_commit \u003d None"},{"line_number":145,"context_line":"        try:"},{"line_number":146,"context_line":"            instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":147,"context_line":"            self.compute_api.live_migrate(context, instance, block_migration,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_8cc9287c","line":144,"range":{"start_line":129,"start_character":0,"end_line":144,"end_character":31},"in_reply_to":"1aa78d24_958228c7","updated":"2016-07-11 16:56:16.000000000","message":"I think we could remove duplication for force param here, but leave things as is for other params, e.g. common get_args method will add microversion checks for block_migration param, see lines 83-97, which I\u0027d like to leave for microversion 2.34, because it\u0027s already supports \u0027auto\u0027 for block_migration. So this small dup will help to make things cleaner for subsequent changes.","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"387bf774334891d5bd00997c0c041d481e15ef80","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                                          disk_over_commit, host, force, async)"},{"line_number":98,"context_line":"        except exception.InstanceUnknownCell as e:"},{"line_number":99,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":100,"context_line":"        except (exception.NoValidHost,"},{"line_number":101,"context_line":"                exception.ComputeServiceUnavailable,"},{"line_number":102,"context_line":"                exception.InvalidHypervisorType,"},{"line_number":103,"context_line":"                exception.InvalidCPUInfo,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_24664851","line":100,"updated":"2016-07-11 18:11:24.000000000","message":"Instead of duplicating most of the _migrate_live() method below just for the 2.34 microversion, it would be perfectly fine to just add a code comment right here stating these error messages are not caught/translated when microversion 2.34+ is specified. That way you can just add a single line of change in this method:\n\n async \u003d api_version_request.is_supported(req, min_version\u003d\u00272.34\u0027)","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ad70311050c01de7d984e3264fc4489092b3290a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                                          disk_over_commit, host, force, async)"},{"line_number":98,"context_line":"        except exception.InstanceUnknownCell as e:"},{"line_number":99,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":100,"context_line":"        except (exception.NoValidHost,"},{"line_number":101,"context_line":"                exception.ComputeServiceUnavailable,"},{"line_number":102,"context_line":"                exception.InvalidHypervisorType,"},{"line_number":103,"context_line":"                exception.InvalidCPUInfo,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_2fef411f","line":100,"in_reply_to":"1aa78d24_24664851","updated":"2016-07-11 18:28:15.000000000","message":"That was ruled out in earlier reviews, but it feels like there is still too much duplication here.","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ccd01a05a76acdb2457fb4c6f956f709a53fffb5","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                                          disk_over_commit, host, force, async)"},{"line_number":98,"context_line":"        except exception.InstanceUnknownCell as e:"},{"line_number":99,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":100,"context_line":"        except (exception.NoValidHost,"},{"line_number":101,"context_line":"                exception.ComputeServiceUnavailable,"},{"line_number":102,"context_line":"                exception.InvalidHypervisorType,"},{"line_number":103,"context_line":"                exception.InvalidCPUInfo,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_aa231fbc","line":100,"in_reply_to":"1aa78d24_2fef411f","updated":"2016-07-11 19:04:13.000000000","message":"removed second method","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"05829233608a95a264326a1a45738704ffda1e43","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":109,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":110,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":111,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":112,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":113,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":114,"context_line":"        except exception.InstanceInvalidState as state_error:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_4f644d21","line":111,"updated":"2016-07-11 18:44:54.000000000","message":"@johnthetubaguy: Yeah, that was my thinking exactly. And/or do a LOG.warning() if async\u003dTrue and we got one of these exceptions?","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ad70311050c01de7d984e3264fc4489092b3290a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":109,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":110,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":111,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":112,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":113,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":114,"context_line":"        except exception.InstanceInvalidState as state_error:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_0fe52537","line":111,"updated":"2016-07-11 18:28:15.000000000","message":"Looking more closely, I guess we could just re-raise the exception if async\u003dFalse?","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ccd01a05a76acdb2457fb4c6f956f709a53fffb5","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":109,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":110,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":111,"context_line":"            raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":112,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":113,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":114,"context_line":"        except exception.InstanceInvalidState as state_error:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_0a2d13a8","line":111,"in_reply_to":"1aa78d24_4f644d21","updated":"2016-07-11 19:04:13.000000000","message":"Done","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"532d1f6c37ea283ef47f5f3b63ad6511ea11caaa","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        force \u003d None"},{"line_number":78,"context_line":"        async \u003d api_version_request.is_supported(req, min_version\u003d\u00272.34\u0027)"},{"line_number":79,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.30\u0027):"},{"line_number":80,"context_line":"            force \u003d self._get_force_param_for_live_migration(body, host)"},{"line_number":81,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.25\u0027):"},{"line_number":82,"context_line":"            if block_migration \u003d\u003d \u0027auto\u0027:"},{"line_number":83,"context_line":"                block_migration \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_470b91d6","line":80,"updated":"2016-07-11 20:32:28.000000000","message":"Where is this method defined? Did this get lost in a rebase?","commit_id":"4183ebb34824c66ce8d1b1a84a534b4af0f8c5e9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"145d05dae84ce8dc43dc9d16992a3e693eee97c8","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                exception.InvalidSharedStorage,"},{"line_number":110,"context_line":"                exception.HypervisorUnavailable,"},{"line_number":111,"context_line":"                exception.MigrationPreCheckError,"},{"line_number":112,"context_line":"                exception.LiveMigrationWithOldNovaNotSupported) as ex:"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"            if async:"},{"line_number":115,"context_line":"                with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_f0eb56da","line":112,"updated":"2016-07-11 19:53:12.000000000","message":"When I asked to have this split before, I was thinking some of these would be legit for the async case and some would not. Despite my desire to -1 this over that, I think all of these should be 500s if they happen with async, which the reraise below will trigger.","commit_id":"4183ebb34824c66ce8d1b1a84a534b4af0f8c5e9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"145d05dae84ce8dc43dc9d16992a3e693eee97c8","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":116,"context_line":"                    LOG.error(_LE(\"Unexpected exception received from \""},{"line_number":117,"context_line":"                                  \"conductor during pre-live-migration checks \""},{"line_number":118,"context_line":"                                  \"\u0027%(ex)s\u0027\"), {\u0027ex\u0027: ex})"},{"line_number":119,"context_line":"            else:"},{"line_number":120,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dex.format_message())"},{"line_number":121,"context_line":"        except exception.InstanceIsLocked as e:"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_f0707642","line":118,"updated":"2016-07-11 19:53:12.000000000","message":"Where is the test that will trigger this 500 and run over this code?","commit_id":"4183ebb34824c66ce8d1b1a84a534b4af0f8c5e9"}],"nova/tests/unit/api/openstack/compute/test_migrate_server.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"25a9daec0303dce163a4b930a3d8cc5c64964572","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            self.compute_api.live_migrate(self.context, instance, False,"},{"line_number":210,"context_line":"                                          self.disk_over_commit,"},{"line_number":211,"context_line":"                                          \u0027hostname\u0027, self.force, self.async"},{"line_number":212,"context_line":"                                          )"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        self.mox.ReplayAll()"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_f5028c0a","line":212,"updated":"2016-07-08 12:58:19.000000000","message":"Erm, what about InstanceIsLocked that still needs to be raised, I don\u0027t see tests for that?","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"6553d47540e4fcfedd6dcb3f8ad72aeae6a6fe80","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            self.compute_api.live_migrate(self.context, instance, False,"},{"line_number":210,"context_line":"                                          self.disk_over_commit,"},{"line_number":211,"context_line":"                                          \u0027hostname\u0027, self.force, self.async"},{"line_number":212,"context_line":"                                          )"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        self.mox.ReplayAll()"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_07ecf327","line":212,"in_reply_to":"1aa78d24_f5028c0a","updated":"2016-07-11 16:56:16.000000000","message":"it\u0027s being tested in  test_actions_with_locked_instance, see line 99","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"25a9daec0303dce163a4b930a3d8cc5c64964572","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        self.mox.ReplayAll()"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        body \u003d self._get_migration_body(host\u003d\u0027hostname\u0027)"},{"line_number":217,"context_line":"        if not self.async:"},{"line_number":218,"context_line":"            ex \u003d self.assertRaises(expected_exc,"},{"line_number":219,"context_line":"                                   self.controller._migrate_live,"},{"line_number":220,"context_line":"                                   self.req, instance.uuid, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_35c094e0","line":217,"updated":"2016-07-08 12:58:19.000000000","message":"I really don\u0027t like this style myself. Can\u0027t we just override these methods in MigrateServerTestsV234? That seems way more obvious to me.\n\nActually, I think just over-riding the cases that are not valid with a pass is probably more informational, like override: test_migrate_live_compute_service_unavailable, and just turn it into a pass method.","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"6553d47540e4fcfedd6dcb3f8ad72aeae6a6fe80","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        self.mox.ReplayAll()"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        body \u003d self._get_migration_body(host\u003d\u0027hostname\u0027)"},{"line_number":217,"context_line":"        if not self.async:"},{"line_number":218,"context_line":"            ex \u003d self.assertRaises(expected_exc,"},{"line_number":219,"context_line":"                                   self.controller._migrate_live,"},{"line_number":220,"context_line":"                                   self.req, instance.uuid, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_e7be07fe","line":217,"in_reply_to":"1aa78d24_35c094e0","updated":"2016-07-11 16:56:16.000000000","message":"ok, let\u0027s make it explicit, will override these methods in next ps","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"25a9daec0303dce163a4b930a3d8cc5c64964572","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            live_migrate_method \u003d self.controller._migrate_live"},{"line_number":225,"context_line":"            live_migrate_method(self.req, instance.uuid,"},{"line_number":226,"context_line":"                                body\u003dbody)"},{"line_number":227,"context_line":"            self.assertEqual(202, live_migrate_method.wsgi_code)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_migrate_live_compute_service_unavailable(self):"},{"line_number":230,"context_line":"        self._test_migrate_live_failed_with_exception("}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_b86479e5","line":227,"updated":"2016-07-08 12:58:19.000000000","message":"Actually, this seems to just run the exact same scenario over and over for no reason. It would be better just overriding the irrelevant test methods, I feel.","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"6553d47540e4fcfedd6dcb3f8ad72aeae6a6fe80","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            live_migrate_method \u003d self.controller._migrate_live"},{"line_number":225,"context_line":"            live_migrate_method(self.req, instance.uuid,"},{"line_number":226,"context_line":"                                body\u003dbody)"},{"line_number":227,"context_line":"            self.assertEqual(202, live_migrate_method.wsgi_code)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def test_migrate_live_compute_service_unavailable(self):"},{"line_number":230,"context_line":"        self._test_migrate_live_failed_with_exception("}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_e7e7273e","line":227,"in_reply_to":"1aa78d24_b86479e5","updated":"2016-07-11 16:56:16.000000000","message":"Done","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"25a9daec0303dce163a4b930a3d8cc5c64964572","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        body_map \u003d {\u0027_migrate_live\u0027: {\u0027os-migrateLive\u0027: {\u0027host\u0027: \u0027hostname\u0027,"},{"line_number":356,"context_line":"                                      \u0027block_migration\u0027: \u0027auto\u0027,"},{"line_number":357,"context_line":"                                      \u0027force\u0027: litteral_force}}}"},{"line_number":358,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((None, None, \u0027hostname\u0027, force, async),"},{"line_number":359,"context_line":"                                      {})}"},{"line_number":360,"context_line":"        self._test_actions([\u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":361,"context_line":"                           method_translations\u003dmethod_translations,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_58e8f516","line":358,"updated":"2016-07-08 12:58:19.000000000","message":"if you have self.async ,why not just have that here? why add all those params?","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"6553d47540e4fcfedd6dcb3f8ad72aeae6a6fe80","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        body_map \u003d {\u0027_migrate_live\u0027: {\u0027os-migrateLive\u0027: {\u0027host\u0027: \u0027hostname\u0027,"},{"line_number":356,"context_line":"                                      \u0027block_migration\u0027: \u0027auto\u0027,"},{"line_number":357,"context_line":"                                      \u0027force\u0027: litteral_force}}}"},{"line_number":358,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((None, None, \u0027hostname\u0027, force, async),"},{"line_number":359,"context_line":"                                      {})}"},{"line_number":360,"context_line":"        self._test_actions([\u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":361,"context_line":"                           method_translations\u003dmethod_translations,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1aa78d24_6c6ddc03","line":358,"in_reply_to":"1aa78d24_58e8f516","updated":"2016-07-11 16:56:16.000000000","message":"Done","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ad70311050c01de7d984e3264fc4489092b3290a","unresolved":false,"context_lines":[{"line_number":371,"context_line":"            \u00272.34\u0027)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def test_migrate_live_compute_service_unavailable(self):"},{"line_number":374,"context_line":"        pass"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def test_migrate_live_invalid_hypervisor_type(self):"},{"line_number":377,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_afc21183","line":374,"updated":"2016-07-11 18:28:15.000000000","message":"Thanks, I find this easier.\n\nBut I think its worth at least one comment to explain that this case isn\u0027t valid for v2.30.","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"ccd01a05a76acdb2457fb4c6f956f709a53fffb5","unresolved":false,"context_lines":[{"line_number":371,"context_line":"            \u00272.34\u0027)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def test_migrate_live_compute_service_unavailable(self):"},{"line_number":374,"context_line":"        pass"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def test_migrate_live_invalid_hypervisor_type(self):"},{"line_number":377,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":16,"id":"1aa78d24_efd539e5","line":374,"in_reply_to":"1aa78d24_afc21183","updated":"2016-07-11 19:04:13.000000000","message":"Done","commit_id":"44515b71076d2ca2d326339d3f5ed248fd53a0d4"}],"releasenotes/notes/async-live-migration-rest-check-675ec309a9ccc28e.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a940b9c826e76b75946c82bb331880136cffe348","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Starting from REST API microversion 2.31 checks before accepting request to"},{"line_number":4,"context_line":"    live-migrate instance are done in asynchronous way. ``instance-actions``"},{"line_number":5,"context_line":"    should be used for getting information about the checks results."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3aaa91ec_a8a2f948","line":4,"range":{"start_line":3,"start_character":45,"end_line":4,"end_character":55},"updated":"2016-06-23 20:51:00.000000000","message":"This is a bit hard to read for me. Maybe something like this would be more clear?\n\n\"pre-live-migration checks are now performed asynchronously.\"","commit_id":"d8f891f1e578ea21ff736140dd5b2ccfc90e3c5a"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"1e54f7880b4832616946e12e5e08937ae67dddd4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Starting from REST API microversion 2.31 checks before accepting request to"},{"line_number":4,"context_line":"    live-migrate instance are done in asynchronous way. ``instance-actions``"},{"line_number":5,"context_line":"    should be used for getting information about the checks results."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"3aaa91ec_f941150b","line":4,"range":{"start_line":3,"start_character":45,"end_line":4,"end_character":55},"in_reply_to":"3aaa91ec_a8a2f948","updated":"2016-07-01 14:31:32.000000000","message":"Done","commit_id":"d8f891f1e578ea21ff736140dd5b2ccfc90e3c5a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d9d8e7d6fd745a21bbc139993c283383f31bab59","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Starting from REST API microversion 2.34 pre-live-migration checks are"},{"line_number":4,"context_line":"    performed asynchronously. ``instance-actions`` should be used for getting"},{"line_number":5,"context_line":"    information about the checks results."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"1aa78d24_b86e3994","line":5,"updated":"2016-07-08 13:00:11.000000000","message":"We should probably explain why its better that way. live-migrate returning quicker, etc.","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"6553d47540e4fcfedd6dcb3f8ad72aeae6a6fe80","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Starting from REST API microversion 2.34 pre-live-migration checks are"},{"line_number":4,"context_line":"    performed asynchronously. ``instance-actions`` should be used for getting"},{"line_number":5,"context_line":"    information about the checks results."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"1aa78d24_071b5381","line":5,"in_reply_to":"1aa78d24_b86e3994","updated":"2016-07-11 16:56:16.000000000","message":"Done","commit_id":"f1d17927b02e20943309c8c5e351fbe3a8d41552"}]}
