)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"fa04371c940b6cdcaed991e74f643a54cf5ca9a9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"This patch modifies the migration API."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"APIImpact"},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":"    Add a \u0027host\u0027 parameter and \u0027force\u0027 parameter"},{"line_number":17,"context_line":"    in the cold migration action."},{"line_number":18,"context_line":"Change-Id: Iee356c4dd097c846b6ca8617ead6a061300c83f8"},{"line_number":19,"context_line":"Implements: blueprint cold-migration-with-target-ocata"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a71b18c_60fe6daf","line":17,"range":{"start_line":15,"start_character":0,"end_line":17,"end_character":33},"updated":"2016-12-11 12:48:22.000000000","message":"We needn\u0027t this flag, we should update the api-ref in this patch https://github.com/openstack/nova/api-ref","commit_id":"353295e3f6c6f5401813c21f411da1e46a42fa3b"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"daa03307f743ec018bd4c95b40d812a372fed1d5","unresolved":false,"context_lines":[{"line_number":12,"context_line":"This patch modifies the migration API."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"APIImpact"},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":"    Add a \u0027host\u0027 parameter and \u0027force\u0027 parameter"},{"line_number":17,"context_line":"    in the cold migration action."},{"line_number":18,"context_line":"Change-Id: Iee356c4dd097c846b6ca8617ead6a061300c83f8"},{"line_number":19,"context_line":"Implements: blueprint cold-migration-with-target-ocata"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a71b18c_6f480eb4","line":17,"range":{"start_line":15,"start_character":0,"end_line":17,"end_character":33},"in_reply_to":"3a71b18c_60fe6daf","updated":"2016-12-12 08:45:45.000000000","message":"I will do it in another patch.\nSo remove this flag.\nDone.","commit_id":"353295e3f6c6f5401813c21f411da1e46a42fa3b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5bd73cedac9fa8ed165492126062c499b654822d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"This patch modifies the migration API."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"APIImpact"},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":"    Add a \u0027host\u0027 parameter and \u0027force\u0027 parameter"},{"line_number":17,"context_line":"    in the cold migration action."},{"line_number":18,"context_line":"Change-Id: Iee356c4dd097c846b6ca8617ead6a061300c83f8"},{"line_number":19,"context_line":"Implements: blueprint cold-migration-with-target-ocata"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a71b18c_e028bd35","line":17,"range":{"start_line":15,"start_character":0,"end_line":17,"end_character":33},"in_reply_to":"3a71b18c_60fe6daf","updated":"2016-12-11 12:49:42.000000000","message":"oops, sorry, the correct link is https://github.com/openstack/nova/tree/master/api-ref/source","commit_id":"353295e3f6c6f5401813c21f411da1e46a42fa3b"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"02cfaa339803f0eedd7d8ab8ccd4385741e84fa3","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch modifies the migration API."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"APIImpact"},{"line_number":15,"context_line":"Change-Id: Iee356c4dd097c846b6ca8617ead6a061300c83f8"},{"line_number":16,"context_line":"Implements: blueprint cold-migration-with-target-ocata"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5a3905b3_cce0e2cf","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":9},"updated":"2017-01-24 20:56:00.000000000","message":"API change requires the corresponding Tempest test based on https://review.openstack.org/#/c/346080/4/doc/source/code-review.rst","commit_id":"af5ad746a8e675dd7bbda7dbf1bdbf9d8f256ed6"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"395ae51675d2c312b6e904e3b24f9c00e79b3f1b","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch modifies the migration API."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"APIImpact"},{"line_number":15,"context_line":"Change-Id: Iee356c4dd097c846b6ca8617ead6a061300c83f8"},{"line_number":16,"context_line":"Implements: blueprint cold-migration-with-target-ocata"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5a3905b3_e12920f4","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":9},"in_reply_to":"5a3905b3_cce0e2cf","updated":"2017-01-24 23:58:34.000000000","message":"It says \"If the microversion changes the response schema, a new schema and test for the microversion must be added to Tempest.\"\n\nBut this patch does not change the response schema.\nIt changes the request body only.\nSo tempest tests are not required.","commit_id":"af5ad746a8e675dd7bbda7dbf1bdbf9d8f256ed6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0cdb378858c451bc08117f074d8680c3178efb22","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch modifies the migration API."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Tempest Test: Ibd92189d168308483e193a62aa5ecc1a0f79cb0d"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"APIImpact"},{"line_number":17,"context_line":"    Add an optional parameter \u0027host\u0027 in cold migration action."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":111,"id":"ff82abbf_23ca1ea0","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":55},"updated":"2017-11-29 22:19:24.000000000","message":"I think we can remove this since I don\u0027t think we need the Tempest test.","commit_id":"9dffb23c7fae9c66b223dc3ee23c7239f05b963f"}],"api-ref/source/servers-admin-action.inc":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"42aa6c9c622b53c0796462eb2dc1b7fad9dfa95d","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":".. rest_method:: POST /servers/{server_id}/action"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Migrates a server to a host. The scheduler chooses the host."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Specify the ``migrate`` action in the request body."},{"line_number":62,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":95,"id":"5f4e5783_b9971091","line":59,"updated":"2017-10-11 13:08:51.000000000","message":"This conflicts somewhat with the statements at line 63. Maybe merge the two paragraphs into one?","commit_id":"bb685610fb4ab6ad48e784e6ac32570acc28f634"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"6f83c6e70c2478dfaac51f777184a280d1ec6fb1","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":".. rest_method:: POST /servers/{server_id}/action"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Migrates a server to a host. The scheduler chooses the host."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Specify the ``migrate`` action in the request body."},{"line_number":62,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":95,"id":"5f4e5783_9b1675f1","line":59,"in_reply_to":"5f4e5783_b9971091","updated":"2017-10-12 03:47:13.000000000","message":"Done","commit_id":"bb685610fb4ab6ad48e784e6ac32570acc28f634"}],"doc/api_samples/os-migrate-server/v2.56/migrate-server.json":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"b9c7e47cbf3c8bdc777028397426d183ff204c78","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"migrate\": {"},{"line_number":3,"context_line":"        \"host\": \"01c0cadef72d47e28a672a76060d492c\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":108,"id":"ff82abbf_de0c9d95","line":3,"range":{"start_line":3,"start_character":17,"end_line":3,"end_character":49},"updated":"2017-11-28 12:35:34.000000000","message":"This sample host name doesn\u0027t seem a host name, but current one is fine because the other host names also are inconsistent on the sample files and it is fine to follow them with another patches.\n\n ~/dev/openstack/nova/doc/api_samples$ grep \u0027\"host\"\u0027 * -R\nconsoles/consoles-get-resp.json:        \"host\": \"fake\",\nos-aggregates/aggregate-remove-host-post-req.json:        \"host\": \"bf1454b3d71145d49fca2101c56c728d\"\nos-aggregates/v2.41/aggregate-remove-host-post-req.json:        \"host\": \"compute\"\nos-aggregates/v2.41/aggregate-add-host-post-req.json:        \"host\": \"compute\"\nos-aggregates/aggregate-add-host-post-req.json:        \"host\": \"21549b2f665945baaa7101926a00143c\"\nos-baremetal-nodes/baremetal-node-get-resp.json:        \"host\": \"IRONIC MANAGED\",\nos-baremetal-nodes/baremetal-node-list-resp.json:            \"host\": \"IRONIC MANAGED\",\nos-baremetal-nodes/baremetal-node-list-resp.json:            \"host\": \"IRONIC MANAGED\",\nos-console-auth-tokens/get-console-connect-info-get-resp.json:        \"host\": \"localhost\",\nos-evacuate/v2.14/server-evacuate-req.json:        \"host\": \"testHost\",\nos-evacuate/server-evacuate-req.json:        \"host\": \"b419863b7d814906a68fb31703c0dbd6\",\nos-evacuate/v2.29/server-evacuate-req.json:        \"host\": \"testHost\",\nos-fixed-ips/fixedips-get-resp.json:        \"host\": \"host\",\nos-fixed-ips/v2.4/fixedips-get-resp.json:        \"host\": \"host\",\nos-hosts/host-get-reboot.json:    \"host\": \"9557750dbc464741a89c907921c1cb31\",\nos-hosts/host-get-resp.json:    \"host\": [\nos-hosts/host-get-resp.json:                \"host\": \"c1a7de0ac9d94e4baceae031d05caae3\",\nos-hosts/host-get-resp.json:                \"host\": \"c1a7de0ac9d94e4baceae031d05caae3\",\nos-hosts/host-get-resp.json:                \"host\": \"c1a7de0ac9d94e4baceae031d05caae3\",\nos-hosts/host-get-shutdown.json:    \"host\": \"77cfa0002e4d45fe97f185968111b27b\",\nos-hosts/host-get-startup.json:    \"host\": \"4b392b27930343bbaa27fd5d8328a564\",\nos-hosts/host-put-maintenance-resp.json:    \"host\": \"65c5d5b7e3bd44308e67fc50f362aee6\",\nos-hypervisors/v2.33/hypervisors-detail-resp.json:                \"host\": \"host1\",\nos-hypervisors/hypervisors-detail-resp.json:                \"host\": \"e6a37ee802d74863ab8b91ade8f12a67\",\nos-hypervisors/v2.28/hypervisors-detail-resp.json:                \"host\": \"e6a37ee802d74863ab8b91ade8f12a67\",\nos-hypervisors/v2.28/hypervisors-show-resp.json:            \"host\": \"043b3cacf6f34c90a7245151fc8ebcda\",\nos-hypervisors/v2.53/hypervisors-detail-resp.json:                \"host\": \"host1\",\nos-hypervisors/v2.53/hypervisors-detail-with-servers-resp.json:                \"host\": \"host1\",\nos-hypervisors/v2.53/hypervisors-show-resp.json:            \"host\": \"043b3cacf6f34c90a7245151fc8ebcda\",\nos-hypervisors/v2.53/hypervisors-show-with-servers-resp.json:            \"host\": \"043b3cacf6f34c90a7245151fc8ebcda\",\nos-hypervisors/hypervisors-show-resp.json:            \"host\": \"043b3cacf6f34c90a7245151fc8ebcda\",\nos-migrate-server/v2.30/live-migrate-server.json:        \"host\": \"01c0cadef72d47e28a672a76060d492c\",\nos-migrate-server/live-migrate-server.json:        \"host\": \"01c0cadef72d47e28a672a76060d492c\",\nos-migrate-server/v2.25/live-migrate-server.json:        \"host\": \"01c0cadef72d47e28a672a76060d492c\",\nos-networks/network-show-resp.json:        \"host\": \"nsokolov-desktop\",\nos-networks/networks-list-resp.json:            \"host\": \"nsokolov-desktop\",\nos-networks/networks-list-resp.json:            \"host\": null,\nos-networks/network-create-resp.json:        \"host\": null,\nos-services/service-disable-log-put-req.json:    \"host\": \"host1\",\nos-services/services-list-get-resp.json:            \"host\": \"host1\",\nos-services/services-list-get-resp.json:            \"host\": \"host1\",\nos-services/services-list-get-resp.json:            \"host\": \"host2\",\nos-services/services-list-get-resp.json:            \"host\": \"host2\",\nos-services/service-enable-put-req.json:    \"host\": \"host1\",\nos-services/service-enable-put-resp.json:        \"host\": \"host1\",\nos-services/service-disable-log-put-resp.json:        \"host\": \"host1\",\nos-services/v2.11/service-disable-log-put-req.json:    \"host\": \"host1\",\nos-services/v2.11/service-force-down-put-req.json:    \"host\": \"host1\",\nos-services/v2.11/services-list-get-resp.json:            \"host\": \"host1\",\nos-services/v2.11/services-list-get-resp.json:            \"host\": \"host1\",\nos-services/v2.11/services-list-get-resp.json:            \"host\": \"host2\",\nos-services/v2.11/services-list-get-resp.json:            \"host\": \"host2\",\nos-services/v2.11/service-enable-put-req.json:    \"host\": \"host1\",\nos-services/v2.11/service-force-down-put-resp.json:        \"host\": \"host1\",\nos-services/v2.11/service-enable-put-resp.json:        \"host\": \"host1\",\nos-services/v2.11/service-disable-log-put-resp.json:        \"host\": \"host1\",\nos-services/v2.11/service-disable-put-req.json:    \"host\": \"host1\",\nos-services/v2.11/service-disable-put-resp.json:        \"host\": \"host1\",\nos-services/service-disable-put-req.json:    \"host\": \"host1\",\nos-services/v2.53/services-list-get-resp.json:            \"host\": \"host1\",\nos-services/v2.53/services-list-get-resp.json:            \"host\": \"host1\",\nos-services/v2.53/services-list-get-resp.json:            \"host\": \"host2\",\nos-services/v2.53/services-list-get-resp.json:            \"host\": \"host2\",\nos-services/v2.53/service-force-down-put-resp.json:        \"host\": \"host1\",\nos-services/v2.53/service-enable-put-resp.json:        \"host\": \"host1\",\nos-services/v2.53/service-disable-log-put-resp.json:        \"host\": \"host1\",\nos-services/v2.53/service-disable-put-resp.json:        \"host\": \"host1\",\nos-services/service-disable-put-resp.json:        \"host\": \"host1\",\nserver-migrations/live-migrate-server.json:        \"host\": \"01c0cadef72d47e28a672a76060d492c\",","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"migrate\": {"},{"line_number":3,"context_line":"        \"host\": \"01c0cadef72d47e28a672a76060d492c\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":108,"id":"ff82abbf_93afd528","line":3,"range":{"start_line":3,"start_character":17,"end_line":3,"end_character":49},"in_reply_to":"ff82abbf_8467a2b7","updated":"2017-11-29 05:41:02.000000000","message":"I changed it to \u0027host1\u0027.\nDone.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"migrate\": {"},{"line_number":3,"context_line":"        \"host\": \"01c0cadef72d47e28a672a76060d492c\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":108,"id":"ff82abbf_8467a2b7","line":3,"range":{"start_line":3,"start_character":17,"end_line":3,"end_character":49},"in_reply_to":"ff82abbf_de0c9d95","updated":"2017-11-28 14:23:22.000000000","message":"If you look at the samples for os-hypervisors and os-services, the host names are like \"host1\", \"host2\", etc.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"}],"nova/api/openstack/api_version_request.py":[{"author":{"_account_id":12299,"name":"Paweł Koniszewski","email":"pawel.koniszewski@gmail.com","username":"pawel.koniszewski"},"change_message_id":"fed8844407786819b8807858954afd07c4705352","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    * 2.40 - Adds simple tenant usage pagination support."},{"line_number":100,"context_line":"    * 2.41 - Add a host parameter in migrate request body in order to"},{"line_number":101,"context_line":"             enable users to specify a target host in cold migration."},{"line_number":102,"context_line":"             Add a force flag in cold migrate request body and change the"},{"line_number":103,"context_line":"             behaviour for the host flag by calling the scheduler."},{"line_number":104,"context_line":"\"\"\""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_2868e6b8","line":103,"range":{"start_line":102,"start_character":59,"end_line":103,"end_character":66},"updated":"2017-01-05 10:58:30.000000000","message":"nit: I would remove this part. It was true for live migration API, as it supported target host before \u0027force\u0027 flag was introduced.","commit_id":"915754ed22df70fdca8fa81e924c754faa52e3eb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d2cec9ebb16b1a14878754dc50159d8e2998ea3f","unresolved":false,"context_lines":[{"line_number":104,"context_line":"             version 2.37 for network interfaces."},{"line_number":105,"context_line":"    * 2.43 - Add a host parameter in migrate request body in order to"},{"line_number":106,"context_line":"             enable users to specify a target host in cold migration."},{"line_number":107,"context_line":"             Add a force flag in cold migrate request body."},{"line_number":108,"context_line":"\"\"\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_8a873a62","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":58},"updated":"2017-04-07 10:02:48.000000000","message":"Add a force flag in cold migrate request body to bypass the scheduler.","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ac33b1ac1b57e550fc4ba80159b3ab417099725a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"             version 2.37 for network interfaces."},{"line_number":105,"context_line":"    * 2.43 - Add a host parameter in migrate request body in order to"},{"line_number":106,"context_line":"             enable users to specify a target host in cold migration."},{"line_number":107,"context_line":"             Add a force flag in cold migrate request body."},{"line_number":108,"context_line":"\"\"\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_eb3d73dd","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":58},"in_reply_to":"bff0334d_8a873a62","updated":"2017-04-10 12:04:18.000000000","message":"Done","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"}],"nova/api/openstack/compute/migrate_server.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"fa04371c940b6cdcaed991e74f643a54cf5ca9a9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        host_name \u003d None"},{"line_number":52,"context_line":"        force \u003d False"},{"line_number":53,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.40\u0027):"},{"line_number":54,"context_line":"            host_name \u003d body[\"migrate\"].get(\"host\")"},{"line_number":55,"context_line":"            force \u003d self._get_force_param(body[\"migrate\"], host_name)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_00df7969","line":54,"range":{"start_line":54,"start_character":24,"end_line":54,"end_character":51},"updated":"2016-12-11 12:48:22.000000000","message":"nit, the \u0027host\u0027 is required, so we can just use \u0027body[\u0027migrate\u0027][\u0027host\u0027]\u0027","commit_id":"353295e3f6c6f5401813c21f411da1e46a42fa3b"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"daa03307f743ec018bd4c95b40d812a372fed1d5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        host_name \u003d None"},{"line_number":52,"context_line":"        force \u003d False"},{"line_number":53,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.40\u0027):"},{"line_number":54,"context_line":"            host_name \u003d body[\"migrate\"].get(\"host\")"},{"line_number":55,"context_line":"            force \u003d self._get_force_param(body[\"migrate\"], host_name)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a71b18c_6f71ee0b","line":54,"range":{"start_line":54,"start_character":24,"end_line":54,"end_character":51},"in_reply_to":"3a71b18c_00df7969","updated":"2016-12-12 08:45:45.000000000","message":"Done","commit_id":"353295e3f6c6f5401813c21f411da1e46a42fa3b"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"8b10cc0cb87d1ee6cf0274e4e4ee79319d180270","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        host_name \u003d None"},{"line_number":52,"context_line":"        force \u003d False"},{"line_number":53,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.41\u0027):"},{"line_number":54,"context_line":"            host_name \u003d body[\u0027migrate\u0027][\u0027host\u0027]"},{"line_number":55,"context_line":"            force \u003d self._get_force_param(body[\u0027migrate\u0027], host_name)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_bb49d090","line":54,"range":{"start_line":54,"start_character":24,"end_line":54,"end_character":47},"updated":"2016-12-20 13:12:48.000000000","message":"can we live if host is not given? seems this should be optional param from spec","commit_id":"9d09ed572d842accf164cc70c98b8bd3fe4f0951"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"aec80588ac3fb674ea0842fd02cc26fd3b8c63ee","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        host_name \u003d None"},{"line_number":52,"context_line":"        force \u003d False"},{"line_number":53,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.41\u0027):"},{"line_number":54,"context_line":"            host_name \u003d body[\u0027migrate\u0027][\u0027host\u0027]"},{"line_number":55,"context_line":"            force \u003d self._get_force_param(body[\u0027migrate\u0027], host_name)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_9eda0f4a","line":54,"range":{"start_line":54,"start_character":24,"end_line":54,"end_character":47},"in_reply_to":"1a6eadb0_bb49d090","updated":"2016-12-21 11:53:00.000000000","message":"Spec says:\nThe ‘host’ parameter to specify a target host is required (not optional) because of consistency with a live migration API.\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/ocata/approved/cold-migration-with-target-ocata.html#rest-api-impact\n\nAnd you can specify \u0027host\u0027 is null(None).","commit_id":"9d09ed572d842accf164cc70c98b8bd3fe4f0951"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"52dc3a1f5e16a5427b59ca297538fa0a65ae68ef","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":67,"context_line":"                    \u0027migrate\u0027, id)"},{"line_number":68,"context_line":"        except (exception.InstanceNotFound,"},{"line_number":69,"context_line":"                exception.RequestSpecNotFound) as e:"},{"line_number":70,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":71,"context_line":"        except (exception.NoValidHost, exception.ComputeHostNotFound,"},{"line_number":72,"context_line":"                exception.ComputeServiceUnavailable) as e:"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_2c8b5d20","line":69,"range":{"start_line":69,"start_character":16,"end_line":69,"end_character":45},"updated":"2017-01-24 00:41:37.000000000","message":"Why do we need to catch this RequestSpecNotFound which is not in _migrate_live()?","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"0274049d01f95ad291040ca23db6aa2271bf4833","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":67,"context_line":"                    \u0027migrate\u0027, id)"},{"line_number":68,"context_line":"        except (exception.InstanceNotFound,"},{"line_number":69,"context_line":"                exception.RequestSpecNotFound) as e:"},{"line_number":70,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":71,"context_line":"        except (exception.NoValidHost, exception.ComputeHostNotFound,"},{"line_number":72,"context_line":"                exception.ComputeServiceUnavailable) as e:"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_f8002f04","line":69,"range":{"start_line":69,"start_character":16,"end_line":69,"end_character":45},"in_reply_to":"5a3905b3_2c8b5d20","updated":"2017-01-24 03:50:32.000000000","message":"I removed the following code in https://review.openstack.org/#/c/408955/17/nova/compute/api.py .\nSo RequestSpecNotFound should be cathced here.\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/api.py#L3140-L3143","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d2cec9ebb16b1a14878754dc50159d8e2998ea3f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":66,"context_line":"                    \u0027migrate\u0027, id)"},{"line_number":67,"context_line":"        except (exception.InstanceNotFound,"},{"line_number":68,"context_line":"                exception.RequestSpecNotFound) as e:"},{"line_number":69,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":70,"context_line":"        except (exception.NoValidHost, exception.ComputeHostNotFound,"},{"line_number":71,"context_line":"                exception.ComputeServiceUnavailable) as e:"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_a0bc5ddc","line":68,"range":{"start_line":68,"start_character":16,"end_line":68,"end_character":46},"updated":"2017-04-07 10:02:48.000000000","message":"as you are allowing to raise this exception as per https://review.openstack.org/#/c/408955/39/nova/compute/api.py\n\nwe should catch this in resize action API also otherwise it will end up with 500","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ac33b1ac1b57e550fc4ba80159b3ab417099725a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":66,"context_line":"                    \u0027migrate\u0027, id)"},{"line_number":67,"context_line":"        except (exception.InstanceNotFound,"},{"line_number":68,"context_line":"                exception.RequestSpecNotFound) as e:"},{"line_number":69,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":70,"context_line":"        except (exception.NoValidHost, exception.ComputeHostNotFound,"},{"line_number":71,"context_line":"                exception.ComputeServiceUnavailable) as e:"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_d6a7f20a","line":68,"range":{"start_line":68,"start_character":16,"end_line":68,"end_character":46},"in_reply_to":"bff0334d_a0bc5ddc","updated":"2017-04-10 12:04:18.000000000","message":"I removed \u0027RequestSpecNotFound\u0027 in PS43.\nOnly one version upgrade is supported,\nso basically \u0027RequestSpecNotFound\u0027 exception is not raised.","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f93e380ac8a9b4f28779f928c5111549a85f28ea","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        host_name \u003d None"},{"line_number":50,"context_line":"        force \u003d False"},{"line_number":51,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.53\u0027):"},{"line_number":52,"context_line":"            host_name \u003d body[\u0027migrate\u0027][\u0027host\u0027]"},{"line_number":53,"context_line":"            force \u003d self._get_force_param(body[\u0027migrate\u0027], host_name)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"}],"source_content_type":"text/x-python","patch_set":69,"id":"1f1a1f67_156cdecb","line":52,"updated":"2017-07-19 18:29:10.000000000","message":"FWIW, I don\u0027t believe the host field should be required (see note on the schema), so this should be:\n\n host_name \u003d body[\u0027migrate\u0027].get(\u0027host\u0027)","commit_id":"404bc38742346c35d9fae258d6c21a8d9e4141f9"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"61fd07403c615becb509c0c7756a91a49197b58b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        host_name \u003d None"},{"line_number":50,"context_line":"        force \u003d False"},{"line_number":51,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.53\u0027):"},{"line_number":52,"context_line":"            host_name \u003d body[\u0027migrate\u0027][\u0027host\u0027]"},{"line_number":53,"context_line":"            force \u003d self._get_force_param(body[\u0027migrate\u0027], host_name)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"}],"source_content_type":"text/x-python","patch_set":69,"id":"ff346bd7_686c5c08","line":52,"in_reply_to":"1f1a1f67_156cdecb","updated":"2017-07-22 10:48:50.000000000","message":"I changed the \u0027host\u0027 parameter to optional.\nDone.","commit_id":"404bc38742346c35d9fae258d6c21a8d9e4141f9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"},{"line_number":41,"context_line":"    @extensions.expected_errors((400, 403, 404, 409))"},{"line_number":42,"context_line":"    @wsgi.action(\u0027migrate\u0027)"},{"line_number":43,"context_line":"    @validation.schema(migrate_server.migrate_v2_56, \"2.56\")"},{"line_number":44,"context_line":"    def _migrate(self, req, id, body):"},{"line_number":45,"context_line":"        \"\"\"Permit admins to migrate a server to a new host.\"\"\""}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_a4fbc6be","line":42,"range":{"start_line":42,"start_character":4,"end_line":42,"end_character":27},"updated":"2017-11-28 14:23:22.000000000","message":"Does this ensure that the body has a \u0027migrate\u0027 key? Because if not, we\u0027d have a KeyError on L51.\n\nI guess the schema also validates that \u0027migrate\u0027 is in the request body.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"8567a521a65a6f5427ddad32ab6b37f0ee70331d","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"},{"line_number":41,"context_line":"    @extensions.expected_errors((400, 403, 404, 409))"},{"line_number":42,"context_line":"    @wsgi.action(\u0027migrate\u0027)"},{"line_number":43,"context_line":"    @validation.schema(migrate_server.migrate_v2_56, \"2.56\")"},{"line_number":44,"context_line":"    def _migrate(self, req, id, body):"},{"line_number":45,"context_line":"        \"\"\"Permit admins to migrate a server to a new host.\"\"\""}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_f2a0a2f6","line":42,"range":{"start_line":42,"start_character":4,"end_line":42,"end_character":27},"in_reply_to":"ff82abbf_a4fbc6be","updated":"2017-11-28 23:36:27.000000000","message":"@Matt\n\n\u003e Does this ensure that the body has a \u0027migrate\u0027 key?\n\nYeah, this means we have already ensured the body has the key because the API router selects a corresponding method(_migrate in this case) from the key..","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"},{"line_number":41,"context_line":"    @extensions.expected_errors((400, 403, 404, 409))"},{"line_number":42,"context_line":"    @wsgi.action(\u0027migrate\u0027)"},{"line_number":43,"context_line":"    @validation.schema(migrate_server.migrate_v2_56, \"2.56\")"},{"line_number":44,"context_line":"    def _migrate(self, req, id, body):"},{"line_number":45,"context_line":"        \"\"\"Permit admins to migrate a server to a new host.\"\"\""}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_ae55cefb","line":42,"range":{"start_line":42,"start_character":4,"end_line":42,"end_character":27},"in_reply_to":"ff82abbf_f2a0a2f6","updated":"2017-11-29 05:41:02.000000000","message":"Yes.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        except (exception.TooManyInstances, exception.QuotaError) as e:"},{"line_number":59,"context_line":"            raise exc.HTTPForbidden(explanation\u003de.format_message())"},{"line_number":60,"context_line":"        except (exception.InstanceIsLocked,"},{"line_number":61,"context_line":"                exception.CannotMigrateWithTargetHost) as e:"},{"line_number":62,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":63,"context_line":"        except exception.InstanceInvalidState as state_error:"},{"line_number":64,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_44951a32","line":61,"range":{"start_line":61,"start_character":26,"end_line":61,"end_character":53},"updated":"2017-11-28 14:23:22.000000000","message":"OK this is a 409 because we couldn\u0027t find a request spec for the instance, which is really some kind of internal error, but we just tell the user that they can\u0027t migrate with a target host and they can retry without specifying a host.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        except exception.InstanceNotFound as e:"},{"line_number":67,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.format_message())"},{"line_number":68,"context_line":"        except (exception.NoValidHost, exception.ComputeHostNotFound,"},{"line_number":69,"context_line":"                exception.CannotMigrateToSameHost) as e:"},{"line_number":70,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_84a6c2aa","line":69,"range":{"start_line":69,"start_character":26,"end_line":69,"end_character":49},"updated":"2017-11-28 14:23:22.000000000","message":"And this is a 400 because the specified host is the same as instance.host, which is invalid.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"}],"nova/api/openstack/compute/rest_api_version_history.rst":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"52dc3a1f5e16a5427b59ca297538fa0a65ae68ef","unresolved":false,"context_lines":[{"line_number":458,"context_line":"----"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"  Updates the POST request body for the ``migrate`` action to include the"},{"line_number":461,"context_line":"  ``host`` string field defaulted to ``None`` and the optional"},{"line_number":462,"context_line":"  ``force`` boolean field defaulted to False."},{"line_number":463,"context_line":"  And gets the ``migrate`` action behaviour to verify a provided host"},{"line_number":464,"context_line":"  by calling the nova scheduler when providing the ``host`` string field"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_2ce0bdcc","line":461,"range":{"start_line":461,"start_character":24,"end_line":461,"end_character":45},"updated":"2017-01-24 00:41:37.000000000","message":"host field is mandatory since this microversion and I am not sure what this \"default\" means here because Users should specify the value clearly..","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"0274049d01f95ad291040ca23db6aa2271bf4833","unresolved":false,"context_lines":[{"line_number":458,"context_line":"----"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"  Updates the POST request body for the ``migrate`` action to include the"},{"line_number":461,"context_line":"  ``host`` string field defaulted to ``None`` and the optional"},{"line_number":462,"context_line":"  ``force`` boolean field defaulted to False."},{"line_number":463,"context_line":"  And gets the ``migrate`` action behaviour to verify a provided host"},{"line_number":464,"context_line":"  by calling the nova scheduler when providing the ``host`` string field"}],"source_content_type":"text/x-rst","patch_set":19,"id":"5a3905b3_ec94f08b","line":461,"range":{"start_line":461,"start_character":24,"end_line":461,"end_character":45},"in_reply_to":"5a3905b3_2ce0bdcc","updated":"2017-01-24 03:50:32.000000000","message":"Done","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"42aa6c9c622b53c0796462eb2dc1b7fad9dfa95d","unresolved":false,"context_lines":[{"line_number":687,"context_line":"2.54"},{"line_number":688,"context_line":"----"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"  Updates the POST request body for the ``migrate`` action to include the"},{"line_number":691,"context_line":"  the optional ``host`` string field defaulted to ``null``."},{"line_number":692,"context_line":"  And gets the ``migrate`` action behaviour to verify a provided host"},{"line_number":693,"context_line":"  by calling the nova scheduler when providing the ``host`` string field."}],"source_content_type":"text/x-rst","patch_set":95,"id":"5f4e5783_59fffca9","line":693,"range":{"start_line":690,"start_character":2,"end_line":693,"end_character":72},"updated":"2017-10-11 13:08:51.000000000","message":"The two sentences don\u0027t go well together try something like:\n\nUpdates the [...] ``null``. If ``host`` is set the migrate action verifies the provided host with the nova scheduler and uses it as the destination for the migration.","commit_id":"bb685610fb4ab6ad48e784e6ac32570acc28f634"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"6f83c6e70c2478dfaac51f777184a280d1ec6fb1","unresolved":false,"context_lines":[{"line_number":687,"context_line":"2.54"},{"line_number":688,"context_line":"----"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"  Updates the POST request body for the ``migrate`` action to include the"},{"line_number":691,"context_line":"  the optional ``host`` string field defaulted to ``null``."},{"line_number":692,"context_line":"  And gets the ``migrate`` action behaviour to verify a provided host"},{"line_number":693,"context_line":"  by calling the nova scheduler when providing the ``host`` string field."}],"source_content_type":"text/x-rst","patch_set":95,"id":"5f4e5783_7b8f3923","line":693,"range":{"start_line":690,"start_character":2,"end_line":693,"end_character":72},"in_reply_to":"5f4e5783_59fffca9","updated":"2017-10-12 03:47:13.000000000","message":"Done. Thanks.","commit_id":"bb685610fb4ab6ad48e784e6ac32570acc28f634"}],"nova/api/openstack/compute/schemas/migrate_server.py":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"8b10cc0cb87d1ee6cf0274e4e4ee79319d180270","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                \u0027host\u0027: host,"},{"line_number":30,"context_line":"                \u0027force\u0027: parameter_types.boolean"},{"line_number":31,"context_line":"            },"},{"line_number":32,"context_line":"            \u0027required\u0027: [\u0027host\u0027],"},{"line_number":33,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":34,"context_line":"        },"},{"line_number":35,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_db65ac1d","line":32,"range":{"start_line":32,"start_character":12,"end_line":32,"end_character":33},"updated":"2016-12-20 13:12:48.000000000","message":"looks like this can be None from doc description\nwhy we make it \u0027required\u0027?","commit_id":"9d09ed572d842accf164cc70c98b8bd3fe4f0951"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"aec80588ac3fb674ea0842fd02cc26fd3b8c63ee","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                \u0027host\u0027: host,"},{"line_number":30,"context_line":"                \u0027force\u0027: parameter_types.boolean"},{"line_number":31,"context_line":"            },"},{"line_number":32,"context_line":"            \u0027required\u0027: [\u0027host\u0027],"},{"line_number":33,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":34,"context_line":"        },"},{"line_number":35,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_1ec6ff67","line":32,"range":{"start_line":32,"start_character":12,"end_line":32,"end_character":33},"in_reply_to":"1a6eadb0_db65ac1d","updated":"2016-12-21 11:53:00.000000000","message":"Because of consistency with a live migration API.","commit_id":"9d09ed572d842accf164cc70c98b8bd3fe4f0951"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"aec80588ac3fb674ea0842fd02cc26fd3b8c63ee","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                \u0027disk_over_commit\u0027: parameter_types.boolean,"},{"line_number":48,"context_line":"                \u0027host\u0027: host"},{"line_number":49,"context_line":"            },"},{"line_number":50,"context_line":"            \u0027required\u0027: [\u0027block_migration\u0027, \u0027disk_over_commit\u0027, \u0027host\u0027],"},{"line_number":51,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":52,"context_line":"        },"},{"line_number":53,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_1ec27f34","line":50,"range":{"start_line":50,"start_character":64,"end_line":50,"end_character":70},"updated":"2016-12-21 11:53:00.000000000","message":"Here","commit_id":"9d09ed572d842accf164cc70c98b8bd3fe4f0951"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f93e380ac8a9b4f28779f928c5111549a85f28ea","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                \u0027host\u0027: host,"},{"line_number":30,"context_line":"                \u0027force\u0027: parameter_types.boolean"},{"line_number":31,"context_line":"            },"},{"line_number":32,"context_line":"            \u0027required\u0027: [\u0027host\u0027],"},{"line_number":33,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":34,"context_line":"        },"},{"line_number":35,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":69,"id":"1f1a1f67_35711aa9","line":32,"updated":"2017-07-19 18:29:10.000000000","message":"Why are we setting the host parameter as required?","commit_id":"404bc38742346c35d9fae258d6c21a8d9e4141f9"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"176eead26de9e9087cc1ea496715f2a7747ee21d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                \u0027host\u0027: host,"},{"line_number":30,"context_line":"                \u0027force\u0027: parameter_types.boolean"},{"line_number":31,"context_line":"            },"},{"line_number":32,"context_line":"            \u0027required\u0027: [\u0027host\u0027],"},{"line_number":33,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":34,"context_line":"        },"},{"line_number":35,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":69,"id":"1f1a1f67_103735e6","line":32,"in_reply_to":"1f1a1f67_35711aa9","updated":"2017-07-20 11:01:47.000000000","message":"Please see the spec.\nThe ‘host’ parameter is required (not optional) because of consistency with a live migration API.\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/pike/approved/cold-migration-with-target-pike.html#rest-api-impact","commit_id":"404bc38742346c35d9fae258d6c21a8d9e4141f9"}],"nova/tests/functional/api/client.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            headers[\u0027Content-Type\u0027] \u003d \u0027application/json\u0027"},{"line_number":221,"context_line":"            kwargs[\u0027body\u0027] \u003d jsonutils.dumps(body)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        kwargs.setdefault(\u0027check_response_status\u0027, [200, 201, 202, 204])"},{"line_number":224,"context_line":"        return APIResponse(self.api_request(relative_uri, **kwargs))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def api_put(self, relative_uri, body, **kwargs):"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_3fa103f9","line":223,"range":{"start_line":223,"start_character":67,"end_line":223,"end_character":70},"updated":"2017-11-28 14:23:22.000000000","message":"Why is 204 needed here?","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            headers[\u0027Content-Type\u0027] \u003d \u0027application/json\u0027"},{"line_number":221,"context_line":"            kwargs[\u0027body\u0027] \u003d jsonutils.dumps(body)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        kwargs.setdefault(\u0027check_response_status\u0027, [200, 201, 202, 204])"},{"line_number":224,"context_line":"        return APIResponse(self.api_request(relative_uri, **kwargs))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def api_put(self, relative_uri, body, **kwargs):"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_3347e9be","line":223,"range":{"start_line":223,"start_character":67,"end_line":223,"end_character":70},"in_reply_to":"ff82abbf_3fa103f9","updated":"2017-11-29 05:41:02.000000000","message":"It is not necessary to change it.\nSo restored it.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"}],"nova/tests/functional/api_sample_tests/test_migrate_server.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ac33b1ac1b57e550fc4ba80159b3ab417099725a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":89,"context_line":"                                 \u0027live-migrate-server\u0027,"},{"line_number":90,"context_line":"                                 {\u0027hostname\u0027: hostname})"},{"line_number":91,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class MigrateServerSamplesJsonTestV225(MigrateServerSamplesJsonTest):"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_56fd22af","line":91,"range":{"start_line":91,"start_character":0,"end_line":91,"end_character":51},"updated":"2017-04-10 12:04:18.000000000","message":"Here","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ac33b1ac1b57e550fc4ba80159b3ab417099725a","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                                 \u0027live-migrate-server\u0027,"},{"line_number":142,"context_line":"                                 {\u0027hostname\u0027: hostname,"},{"line_number":143,"context_line":"                                  \u0027force\u0027: \u0027False\u0027})"},{"line_number":144,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class MigrateServerSamplesJsonTestV243(MigrateServerSamplesJsonTest):"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_d6113206","line":144,"range":{"start_line":144,"start_character":0,"end_line":144,"end_character":51},"updated":"2017-04-10 12:04:18.000000000","message":"Here","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d2cec9ebb16b1a14878754dc50159d8e2998ea3f","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class MigrateServerSamplesJsonTestV243(MigrateServerSamplesJsonTest):"},{"line_number":148,"context_line":"    sample_dir \u003d \"os-migrate-server\""},{"line_number":149,"context_line":"    microversion \u003d \u00272.43\u0027"},{"line_number":150,"context_line":"    scenarios \u003d [(\u0027v2_43\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_c51c13c3","line":147,"range":{"start_line":147,"start_character":41,"end_line":147,"end_character":67},"updated":"2017-04-07 10:02:48.000000000","message":"we can inherit from test_servers.ServersSampleBase\n\nit does not seems to be dependent on MigrateServerSamplesJsonTest","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ac33b1ac1b57e550fc4ba80159b3ab417099725a","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"class MigrateServerSamplesJsonTestV243(MigrateServerSamplesJsonTest):"},{"line_number":148,"context_line":"    sample_dir \u003d \"os-migrate-server\""},{"line_number":149,"context_line":"    microversion \u003d \u00272.43\u0027"},{"line_number":150,"context_line":"    scenarios \u003d [(\u0027v2_43\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_f6c9d6ab","line":147,"range":{"start_line":147,"start_character":41,"end_line":147,"end_character":67},"in_reply_to":"bff0334d_c51c13c3","updated":"2017-04-10 12:04:18.000000000","message":"Done","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d2cec9ebb16b1a14878754dc50159d8e2998ea3f","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":192,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027,"},{"line_number":193,"context_line":"                                  \u0027force\u0027: \u0027false\u0027})"},{"line_number":194,"context_line":"        self.assertEqual(404, response.status_code)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @mock.patch(\u0027nova.conductor.manager.ComputeTaskManager._cold_migrate\u0027)"},{"line_number":197,"context_line":"    def test_post_migrate_with_host_and_force_true(self, mock_cold_migrate):"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_0568bb1e","line":194,"range":{"start_line":194,"start_character":50,"end_line":194,"end_character":51},"updated":"2017-04-07 10:02:48.000000000","message":"may be we can move those negative tests under tests/functional api_sample tests can be just sample tests but no hard opinion.","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ac33b1ac1b57e550fc4ba80159b3ab417099725a","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":192,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027,"},{"line_number":193,"context_line":"                                  \u0027force\u0027: \u0027false\u0027})"},{"line_number":194,"context_line":"        self.assertEqual(404, response.status_code)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @mock.patch(\u0027nova.conductor.manager.ComputeTaskManager._cold_migrate\u0027)"},{"line_number":197,"context_line":"    def test_post_migrate_with_host_and_force_true(self, mock_cold_migrate):"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_76eee6ed","line":194,"range":{"start_line":194,"start_character":50,"end_line":194,"end_character":51},"in_reply_to":"bff0334d_0568bb1e","updated":"2017-04-10 12:04:18.000000000","message":"This file includes some negative tests.\nSee line 91 and line 144.\nI will leave it as it is.","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d2cec9ebb16b1a14878754dc50159d8e2998ea3f","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                                  \u0027force\u0027: \u0027true\u0027})"},{"line_number":209,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def test_post_live_migrate_server(self):"},{"line_number":212,"context_line":"        # no changes for live-migrate-server"},{"line_number":213,"context_line":"        pass"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def test_live_migrate_compute_host_not_found(self):"},{"line_number":216,"context_line":"        # no changes for live-migrate-server"},{"line_number":217,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_65354746","line":217,"range":{"start_line":211,"start_character":0,"end_line":217,"end_character":12},"updated":"2017-04-07 10:02:48.000000000","message":"we can just make this new class to avoid such dummpy tests,","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ac33b1ac1b57e550fc4ba80159b3ab417099725a","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                                  \u0027force\u0027: \u0027true\u0027})"},{"line_number":209,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def test_post_live_migrate_server(self):"},{"line_number":212,"context_line":"        # no changes for live-migrate-server"},{"line_number":213,"context_line":"        pass"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def test_live_migrate_compute_host_not_found(self):"},{"line_number":216,"context_line":"        # no changes for live-migrate-server"},{"line_number":217,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":42,"id":"bff0334d_36397ea3","line":217,"range":{"start_line":211,"start_character":0,"end_line":217,"end_character":12},"in_reply_to":"bff0334d_65354746","updated":"2017-04-10 12:04:18.000000000","message":"Done","commit_id":"b8b4558e205cb85e737b4495436da756cd875e73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    def test_post_migrate(self, mock_cold_migrate):"},{"line_number":161,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":162,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":163,"context_line":"                                 {\u0027hostname\u0027: \u0027null\u0027})"},{"line_number":164,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_84dec2d7","line":163,"range":{"start_line":163,"start_character":33,"end_line":163,"end_character":52},"updated":"2017-11-28 14:23:22.000000000","message":"We should have a 2.56 functional test where hostname is not specified to make sure it\u0027s backward compatible.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    def test_post_migrate(self, mock_cold_migrate):"},{"line_number":161,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":162,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":163,"context_line":"                                 {\u0027hostname\u0027: \u0027null\u0027})"},{"line_number":164,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_ee4f5668","line":163,"range":{"start_line":163,"start_character":33,"end_line":163,"end_character":52},"in_reply_to":"ff82abbf_84dec2d7","updated":"2017-11-29 05:41:02.000000000","message":"Done","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                                 {\u0027hostname\u0027: \u0027\"target-host\"\u0027})"},{"line_number":175,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":178,"context_line":"                side_effect\u003dexception.ComputeHostNotFound("},{"line_number":179,"context_line":"                    host\u003d\u0027dummy-host\u0027))"},{"line_number":180,"context_line":"    def test_post_migrate_compute_host_not_found(self, mock_get_all_by_host):"},{"line_number":181,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":182,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":183,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":184,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":187,"context_line":"                return_value\u003d[objects.ComputeNode("}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_8449e2b7","line":184,"range":{"start_line":177,"start_character":4,"end_line":184,"end_character":51},"updated":"2017-11-28 14:23:22.000000000","message":"We don\u0027t normally test negative scenarios in the API samples functional tests. This is better suited to a unit test.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"8567a521a65a6f5427ddad32ab6b37f0ee70331d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                                 {\u0027hostname\u0027: \u0027\"target-host\"\u0027})"},{"line_number":175,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":178,"context_line":"                side_effect\u003dexception.ComputeHostNotFound("},{"line_number":179,"context_line":"                    host\u003d\u0027dummy-host\u0027))"},{"line_number":180,"context_line":"    def test_post_migrate_compute_host_not_found(self, mock_get_all_by_host):"},{"line_number":181,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":182,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":183,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":184,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":187,"context_line":"                return_value\u003d[objects.ComputeNode("}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_d2eb1e10","line":184,"range":{"start_line":177,"start_character":4,"end_line":184,"end_character":51},"in_reply_to":"ff82abbf_8449e2b7","updated":"2017-11-28 23:36:27.000000000","message":"nice point, +1 to remove.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                                 {\u0027hostname\u0027: \u0027\"target-host\"\u0027})"},{"line_number":175,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":178,"context_line":"                side_effect\u003dexception.ComputeHostNotFound("},{"line_number":179,"context_line":"                    host\u003d\u0027dummy-host\u0027))"},{"line_number":180,"context_line":"    def test_post_migrate_compute_host_not_found(self, mock_get_all_by_host):"},{"line_number":181,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":182,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":183,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":184,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":187,"context_line":"                return_value\u003d[objects.ComputeNode("}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_137f45e0","line":184,"range":{"start_line":177,"start_character":4,"end_line":184,"end_character":51},"in_reply_to":"ff82abbf_d2eb1e10","updated":"2017-11-29 05:41:02.000000000","message":"Done","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":184,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":187,"context_line":"                return_value\u003d[objects.ComputeNode("},{"line_number":188,"context_line":"                    host\u003d\u0027dummy-host\u0027, hypervisor_hostname\u003d\u0027dummy-node\u0027)])"},{"line_number":189,"context_line":"    @mock.patch(\u0027nova.objects.RequestSpec.get_by_instance_uuid\u0027)"},{"line_number":190,"context_line":"    def test_post_migrate_compute_request_spec_not_found("},{"line_number":191,"context_line":"            self, mock_get_by_instance_uuid, mock_get_all_by_host):"},{"line_number":192,"context_line":"        mock_get_by_instance_uuid.side_effect \u003d exception.RequestSpecNotFound("},{"line_number":193,"context_line":"            instance_uuid\u003dself.uuid)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":196,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":197,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":198,"context_line":"        self.assertEqual(409, response.status_code)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def test_post_migrate_to_same_host(self):"},{"line_number":201,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_e4cf8e26","line":198,"range":{"start_line":186,"start_character":4,"end_line":198,"end_character":51},"updated":"2017-11-28 14:23:22.000000000","message":"Same, this should be a unit test.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":184,"context_line":"        self.assertEqual(400, response.status_code)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNodeList.get_all_by_host\u0027,"},{"line_number":187,"context_line":"                return_value\u003d[objects.ComputeNode("},{"line_number":188,"context_line":"                    host\u003d\u0027dummy-host\u0027, hypervisor_hostname\u003d\u0027dummy-node\u0027)])"},{"line_number":189,"context_line":"    @mock.patch(\u0027nova.objects.RequestSpec.get_by_instance_uuid\u0027)"},{"line_number":190,"context_line":"    def test_post_migrate_compute_request_spec_not_found("},{"line_number":191,"context_line":"            self, mock_get_by_instance_uuid, mock_get_all_by_host):"},{"line_number":192,"context_line":"        mock_get_by_instance_uuid.side_effect \u003d exception.RequestSpecNotFound("},{"line_number":193,"context_line":"            instance_uuid\u003dself.uuid)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":196,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":197,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":198,"context_line":"        self.assertEqual(409, response.status_code)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def test_post_migrate_to_same_host(self):"},{"line_number":201,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_b381b9c5","line":198,"range":{"start_line":186,"start_character":4,"end_line":198,"end_character":51},"in_reply_to":"ff82abbf_e4cf8e26","updated":"2017-11-29 05:41:02.000000000","message":"Done","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":198,"context_line":"        self.assertEqual(409, response.status_code)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def test_post_migrate_to_same_host(self):"},{"line_number":201,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":202,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":203,"context_line":"                                 {\u0027hostname\u0027: \u0027\"%s\"\u0027 % self.compute.host})"},{"line_number":204,"context_line":"        self.assertEqual(400, response.status_code)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_04d392d6","line":204,"range":{"start_line":200,"start_character":4,"end_line":204,"end_character":51},"updated":"2017-11-28 14:23:22.000000000","message":"unit test","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                                 {\u0027hostname\u0027: \u0027\"dummy-host\"\u0027})"},{"line_number":198,"context_line":"        self.assertEqual(409, response.status_code)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def test_post_migrate_to_same_host(self):"},{"line_number":201,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":202,"context_line":"                                 \u0027migrate-server\u0027,"},{"line_number":203,"context_line":"                                 {\u0027hostname\u0027: \u0027\"%s\"\u0027 % self.compute.host})"},{"line_number":204,"context_line":"        self.assertEqual(400, response.status_code)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_d3847dd5","line":204,"range":{"start_line":200,"start_character":4,"end_line":204,"end_character":51},"in_reply_to":"ff82abbf_04d392d6","updated":"2017-11-29 05:41:02.000000000","message":"Done","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"42aa6c9c622b53c0796462eb2dc1b7fad9dfa95d","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        server \u003d {}"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # We now have a valid imageId"},{"line_number":143,"context_line":"        server[self._image_ref_parameter] \u003d self.api.get_images()[0][\u0027id\u0027]"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        # Set a valid flavorId"},{"line_number":146,"context_line":"        flavor \u003d self.api.get_flavors()[0]"}],"source_content_type":"text/x-python","patch_set":95,"id":"5f4e5783_79c99876","side":"PARENT","line":143,"updated":"2017-10-11 13:08:51.000000000","message":"This change seems like it should be unrelated. Why wasn\u0027t this a problem before your changes? Is it because you\u0027ve increased the microversion that\u0027s happening?","commit_id":"5dd18980dce16892fa605a2e25f0c585a134d02f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"6f83c6e70c2478dfaac51f777184a280d1ec6fb1","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        server \u003d {}"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # We now have a valid imageId"},{"line_number":143,"context_line":"        server[self._image_ref_parameter] \u003d self.api.get_images()[0][\u0027id\u0027]"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        # Set a valid flavorId"},{"line_number":146,"context_line":"        flavor \u003d self.api.get_flavors()[0]"}],"source_content_type":"text/x-python","patch_set":95,"id":"5f4e5783_5bbb5dc3","side":"PARENT","line":143,"in_reply_to":"5f4e5783_79c99876","updated":"2017-10-12 03:47:13.000000000","message":"\u003e Why wasn\u0027t this a problem before your changes?\n\nBecause the tests in API version 2.36 or greater didn\u0027t use this method before this change.\n\n\u003e Is it because you\u0027ve increased the microversion that\u0027s happening?\n\nIt is related to testing in the latest microversion.","commit_id":"5dd18980dce16892fa605a2e25f0c585a134d02f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"42aa6c9c622b53c0796462eb2dc1b7fad9dfa95d","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        server \u003d {}"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # NOTE(takashin): In API version 2.36, image APIs were deprecated."},{"line_number":143,"context_line":"        # In API version 2.36 or greater, self.api.get_images() retruns"},{"line_number":144,"context_line":"        # a 404 error. In that case, \u0027image_uuid\u0027 should be specified."},{"line_number":145,"context_line":"        server[self._image_ref_parameter] \u003d (image_uuid or"},{"line_number":146,"context_line":"                                             self.api.get_images()[0][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":95,"id":"5f4e5783_d9e1ac00","line":143,"range":{"start_line":143,"start_character":64,"end_line":143,"end_character":71},"updated":"2017-10-11 13:08:51.000000000","message":"returns","commit_id":"bb685610fb4ab6ad48e784e6ac32570acc28f634"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"6f83c6e70c2478dfaac51f777184a280d1ec6fb1","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        server \u003d {}"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        # NOTE(takashin): In API version 2.36, image APIs were deprecated."},{"line_number":143,"context_line":"        # In API version 2.36 or greater, self.api.get_images() retruns"},{"line_number":144,"context_line":"        # a 404 error. In that case, \u0027image_uuid\u0027 should be specified."},{"line_number":145,"context_line":"        server[self._image_ref_parameter] \u003d (image_uuid or"},{"line_number":146,"context_line":"                                             self.api.get_images()[0][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":95,"id":"5f4e5783_fbd0c9f9","line":143,"range":{"start_line":143,"start_character":64,"end_line":143,"end_character":71},"in_reply_to":"5f4e5783_d9e1ac00","updated":"2017-10-12 03:47:13.000000000","message":"Done","commit_id":"bb685610fb4ab6ad48e784e6ac32570acc28f634"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79eaa3b2111ba62fd74adf59b7dd2b987d210d89","unresolved":false,"context_lines":[{"line_number":2794,"context_line":"        super(ServerTestV256, self).setUp()"},{"line_number":2795,"context_line":"        self.flags(allow_resize_to_same_host\u003dTrue)"},{"line_number":2796,"context_line":""},{"line_number":2797,"context_line":"    def test_migrate_server_to_same_host(self):"},{"line_number":2798,"context_line":"        server \u003d self._create_server()"},{"line_number":2799,"context_line":"        self.addCleanup(self._delete_server, server[\u0027id\u0027])"},{"line_number":2800,"context_line":"        found_server \u003d self._wait_for_state_change(server, \u0027BUILD\u0027)"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_64f25009","line":2797,"range":{"start_line":2797,"start_character":8,"end_line":2797,"end_character":40},"updated":"2017-11-20 18:04:18.000000000","message":"Why would we allow migrating to the same host without a resize?","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9ad6153e8999ec5d327704703e22559e7ce23e63","unresolved":false,"context_lines":[{"line_number":2794,"context_line":"        super(ServerTestV256, self).setUp()"},{"line_number":2795,"context_line":"        self.flags(allow_resize_to_same_host\u003dTrue)"},{"line_number":2796,"context_line":""},{"line_number":2797,"context_line":"    def test_migrate_server_to_same_host(self):"},{"line_number":2798,"context_line":"        server \u003d self._create_server()"},{"line_number":2799,"context_line":"        self.addCleanup(self._delete_server, server[\u0027id\u0027])"},{"line_number":2800,"context_line":"        found_server \u003d self._wait_for_state_change(server, \u0027BUILD\u0027)"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_e11a6b7b","line":2797,"range":{"start_line":2797,"start_character":8,"end_line":2797,"end_character":40},"in_reply_to":"ff82abbf_64f25009","updated":"2017-11-24 06:01:33.000000000","message":"Done","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79eaa3b2111ba62fd74adf59b7dd2b987d210d89","unresolved":false,"context_lines":[{"line_number":2823,"context_line":"        self.flags(group\u003d\u0027scheduler\u0027, driver\u003d\u0027filter_scheduler\u0027)"},{"line_number":2824,"context_line":"        return self.start_service(\u0027scheduler\u0027)"},{"line_number":2825,"context_line":""},{"line_number":2826,"context_line":"    @mock.patch.object(migrate.MigrationTask, \u0027_preallocate_migration\u0027)"},{"line_number":2827,"context_line":"    @mock.patch.object(filter_scheduler.FilterScheduler,"},{"line_number":2828,"context_line":"                       \u0027USES_ALLOCATION_CANDIDATES\u0027,"},{"line_number":2829,"context_line":"                       new_callable\u003dmock.PropertyMock(return_value\u003dFalse))"},{"line_number":2830,"context_line":"    @mock.patch.object(objects.ComputeNodeList, \u0027get_all_by_host\u0027,"},{"line_number":2831,"context_line":"                       return_value\u003d[objects.ComputeNode("},{"line_number":2832,"context_line":"                           host\u003d\u0027target_host\u0027,"},{"line_number":2833,"context_line":"                           hypervisor_hostname\u003d\u0027target_node\u0027)])"},{"line_number":2834,"context_line":"    def test_migrate_server_to_host_in_different_cell("},{"line_number":2835,"context_line":"            self, mock_get_all_by_host, mock_allocation_candidates,"},{"line_number":2836,"context_line":"            mock_preallocate_migration):"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_24c5288f","line":2833,"range":{"start_line":2826,"start_character":4,"end_line":2833,"end_character":63},"updated":"2017-11-20 18:04:18.000000000","message":"We shouldn\u0027t be mocking this much internal code in a functional test, it defeats the purpose of it being a functional test. Seems like this would be better suited as a unit test.","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9ad6153e8999ec5d327704703e22559e7ce23e63","unresolved":false,"context_lines":[{"line_number":2823,"context_line":"        self.flags(group\u003d\u0027scheduler\u0027, driver\u003d\u0027filter_scheduler\u0027)"},{"line_number":2824,"context_line":"        return self.start_service(\u0027scheduler\u0027)"},{"line_number":2825,"context_line":""},{"line_number":2826,"context_line":"    @mock.patch.object(migrate.MigrationTask, \u0027_preallocate_migration\u0027)"},{"line_number":2827,"context_line":"    @mock.patch.object(filter_scheduler.FilterScheduler,"},{"line_number":2828,"context_line":"                       \u0027USES_ALLOCATION_CANDIDATES\u0027,"},{"line_number":2829,"context_line":"                       new_callable\u003dmock.PropertyMock(return_value\u003dFalse))"},{"line_number":2830,"context_line":"    @mock.patch.object(objects.ComputeNodeList, \u0027get_all_by_host\u0027,"},{"line_number":2831,"context_line":"                       return_value\u003d[objects.ComputeNode("},{"line_number":2832,"context_line":"                           host\u003d\u0027target_host\u0027,"},{"line_number":2833,"context_line":"                           hypervisor_hostname\u003d\u0027target_node\u0027)])"},{"line_number":2834,"context_line":"    def test_migrate_server_to_host_in_different_cell("},{"line_number":2835,"context_line":"            self, mock_get_all_by_host, mock_allocation_candidates,"},{"line_number":2836,"context_line":"            mock_preallocate_migration):"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_b5249ab0","line":2833,"range":{"start_line":2826,"start_character":4,"end_line":2833,"end_character":63},"in_reply_to":"ff82abbf_24c5288f","updated":"2017-11-24 06:01:33.000000000","message":"Done","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79eaa3b2111ba62fd74adf59b7dd2b987d210d89","unresolved":false,"context_lines":[{"line_number":2877,"context_line":""},{"line_number":2878,"context_line":"        _do_test()"},{"line_number":2879,"context_line":""},{"line_number":2880,"context_line":"    @mock.patch.object(compute_manager.ComputeManager, \u0027_reschedule\u0027)"},{"line_number":2881,"context_line":"    @mock.patch.object(compute_manager.ComputeManager, \u0027_prep_resize\u0027,"},{"line_number":2882,"context_line":"                       side_effect\u003dexception.MigrationError("},{"line_number":2883,"context_line":"                           reason\u003d\u0027Test Exception\u0027))"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_e4be60fe","line":2880,"updated":"2017-11-20 18:04:18.000000000","message":"Why do you need to mock out _reschedule? You should only have to mock _prep_resize to trigger the failure.","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9ad6153e8999ec5d327704703e22559e7ce23e63","unresolved":false,"context_lines":[{"line_number":2877,"context_line":""},{"line_number":2878,"context_line":"        _do_test()"},{"line_number":2879,"context_line":""},{"line_number":2880,"context_line":"    @mock.patch.object(compute_manager.ComputeManager, \u0027_reschedule\u0027)"},{"line_number":2881,"context_line":"    @mock.patch.object(compute_manager.ComputeManager, \u0027_prep_resize\u0027,"},{"line_number":2882,"context_line":"                       side_effect\u003dexception.MigrationError("},{"line_number":2883,"context_line":"                           reason\u003d\u0027Test Exception\u0027))"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_553d0ec2","line":2880,"in_reply_to":"ff82abbf_e4be60fe","updated":"2017-11-24 06:01:33.000000000","message":"Done","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79eaa3b2111ba62fd74adf59b7dd2b987d210d89","unresolved":false,"context_lines":[{"line_number":2881,"context_line":"    @mock.patch.object(compute_manager.ComputeManager, \u0027_prep_resize\u0027,"},{"line_number":2882,"context_line":"                       side_effect\u003dexception.MigrationError("},{"line_number":2883,"context_line":"                           reason\u003d\u0027Test Exception\u0027))"},{"line_number":2884,"context_line":"    @mock.patch.object(migrate.MigrationTask, \u0027_preallocate_migration\u0027)"},{"line_number":2885,"context_line":"    @mock.patch.object(filter_scheduler.FilterScheduler,"},{"line_number":2886,"context_line":"                       \u0027USES_ALLOCATION_CANDIDATES\u0027,"},{"line_number":2887,"context_line":"                       new_callable\u003dmock.PropertyMock(return_value\u003dFalse))"},{"line_number":2888,"context_line":"    def test_migrate_server_not_reschedule("},{"line_number":2889,"context_line":"            self, mock_allocation_candidates, mock_preallocate_migration,"},{"line_number":2890,"context_line":"            mock_prep_resize, mock_reschedule):"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_04bca403","line":2887,"range":{"start_line":2884,"start_character":4,"end_line":2887,"end_character":74},"updated":"2017-11-20 18:04:18.000000000","message":"Why is this necessary?","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9ad6153e8999ec5d327704703e22559e7ce23e63","unresolved":false,"context_lines":[{"line_number":2881,"context_line":"    @mock.patch.object(compute_manager.ComputeManager, \u0027_prep_resize\u0027,"},{"line_number":2882,"context_line":"                       side_effect\u003dexception.MigrationError("},{"line_number":2883,"context_line":"                           reason\u003d\u0027Test Exception\u0027))"},{"line_number":2884,"context_line":"    @mock.patch.object(migrate.MigrationTask, \u0027_preallocate_migration\u0027)"},{"line_number":2885,"context_line":"    @mock.patch.object(filter_scheduler.FilterScheduler,"},{"line_number":2886,"context_line":"                       \u0027USES_ALLOCATION_CANDIDATES\u0027,"},{"line_number":2887,"context_line":"                       new_callable\u003dmock.PropertyMock(return_value\u003dFalse))"},{"line_number":2888,"context_line":"    def test_migrate_server_not_reschedule("},{"line_number":2889,"context_line":"            self, mock_allocation_candidates, mock_preallocate_migration,"},{"line_number":2890,"context_line":"            mock_prep_resize, mock_reschedule):"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_753a92cc","line":2887,"range":{"start_line":2884,"start_character":4,"end_line":2887,"end_character":74},"in_reply_to":"ff82abbf_04bca403","updated":"2017-11-24 06:01:33.000000000","message":"Done","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"79eaa3b2111ba62fd74adf59b7dd2b987d210d89","unresolved":false,"context_lines":[{"line_number":2896,"context_line":"            uuid\u003duuids.migration, migration_type\u003d\u0027migration\u0027,"},{"line_number":2897,"context_line":"            instance_uuid\u003dserver[\u0027id\u0027])"},{"line_number":2898,"context_line":""},{"line_number":2899,"context_line":"        target_host \u003d (\u0027host2\u0027 if found_server[\u0027OS-EXT-SRV-ATTR:host\u0027] \u003d\u003d"},{"line_number":2900,"context_line":"                       \u0027compute\u0027 else \u0027compute\u0027)"},{"line_number":2901,"context_line":""},{"line_number":2902,"context_line":"        self.api.post_server_action("},{"line_number":2903,"context_line":"            server[\u0027id\u0027], {\u0027migrate\u0027: {\u0027host\u0027: target_host}})"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_e453c0e1","line":2900,"range":{"start_line":2899,"start_character":8,"end_line":2900,"end_character":48},"updated":"2017-11-20 18:04:18.000000000","message":"If you only have 2 hosts to begin with, this isn\u0027t really a useful test, because we should be targeting a host that the instance is not already running on, which fails, and then assert that we don\u0027t end up on the other available host (the 3rd host).","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9ad6153e8999ec5d327704703e22559e7ce23e63","unresolved":false,"context_lines":[{"line_number":2896,"context_line":"            uuid\u003duuids.migration, migration_type\u003d\u0027migration\u0027,"},{"line_number":2897,"context_line":"            instance_uuid\u003dserver[\u0027id\u0027])"},{"line_number":2898,"context_line":""},{"line_number":2899,"context_line":"        target_host \u003d (\u0027host2\u0027 if found_server[\u0027OS-EXT-SRV-ATTR:host\u0027] \u003d\u003d"},{"line_number":2900,"context_line":"                       \u0027compute\u0027 else \u0027compute\u0027)"},{"line_number":2901,"context_line":""},{"line_number":2902,"context_line":"        self.api.post_server_action("},{"line_number":2903,"context_line":"            server[\u0027id\u0027], {\u0027migrate\u0027: {\u0027host\u0027: target_host}})"}],"source_content_type":"text/x-python","patch_set":106,"id":"ff82abbf_f5530216","line":2900,"range":{"start_line":2899,"start_character":8,"end_line":2900,"end_character":48},"in_reply_to":"ff82abbf_e453c0e1","updated":"2017-11-24 06:01:33.000000000","message":"Done","commit_id":"67a26c2be6847c2ea05b25ec649ad6a822e774da"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3021,"context_line":"    NUMBER_OF_CELLS \u003d 2"},{"line_number":3022,"context_line":""},{"line_number":3023,"context_line":"    def _setup_services(self):"},{"line_number":3024,"context_line":"        if \u0027cell1\u0027 in self.cell_mappings:"},{"line_number":3025,"context_line":"            self.flags(transport_url\u003dself.cell_mappings[\u0027cell1\u0027].transport_url)"},{"line_number":3026,"context_line":"        self.conductor \u003d self.start_service(\u0027conductor\u0027)"},{"line_number":3027,"context_line":"        self.consoleauth \u003d self.start_service(\u0027consoleauth\u0027)"},{"line_number":3028,"context_line":"        self.network \u003d self.start_service(\u0027network\u0027,"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_70deb93e","line":3025,"range":{"start_line":3024,"start_character":8,"end_line":3025,"end_character":79},"updated":"2017-11-29 16:14:52.000000000","message":"Why is this necessary? When you have multiple cells, the code should switch context properly based on the cell it\u0027s dealing with.","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c35698c66f55193b517483f14fd55a2c6199a45","unresolved":false,"context_lines":[{"line_number":3021,"context_line":"    NUMBER_OF_CELLS \u003d 2"},{"line_number":3022,"context_line":""},{"line_number":3023,"context_line":"    def _setup_services(self):"},{"line_number":3024,"context_line":"        if \u0027cell1\u0027 in self.cell_mappings:"},{"line_number":3025,"context_line":"            self.flags(transport_url\u003dself.cell_mappings[\u0027cell1\u0027].transport_url)"},{"line_number":3026,"context_line":"        self.conductor \u003d self.start_service(\u0027conductor\u0027)"},{"line_number":3027,"context_line":"        self.consoleauth \u003d self.start_service(\u0027consoleauth\u0027)"},{"line_number":3028,"context_line":"        self.network \u003d self.start_service(\u0027network\u0027,"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_41e4050d","line":3025,"range":{"start_line":3024,"start_character":8,"end_line":3025,"end_character":79},"in_reply_to":"ff82abbf_70deb93e","updated":"2017-11-29 16:19:55.000000000","message":"Oh I see this is copied from _IntegratedTestBase.","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3023,"context_line":"    def _setup_services(self):"},{"line_number":3024,"context_line":"        if \u0027cell1\u0027 in self.cell_mappings:"},{"line_number":3025,"context_line":"            self.flags(transport_url\u003dself.cell_mappings[\u0027cell1\u0027].transport_url)"},{"line_number":3026,"context_line":"        self.conductor \u003d self.start_service(\u0027conductor\u0027)"},{"line_number":3027,"context_line":"        self.consoleauth \u003d self.start_service(\u0027consoleauth\u0027)"},{"line_number":3028,"context_line":"        self.network \u003d self.start_service(\u0027network\u0027,"},{"line_number":3029,"context_line":"                                          manager\u003dCONF.network_manager)"},{"line_number":3030,"context_line":"        self.scheduler \u003d self._setup_scheduler_service()"},{"line_number":3031,"context_line":""},{"line_number":3032,"context_line":"        # Set up 2 compute services in deferrent cells"},{"line_number":3033,"context_line":"        # host1 is in cell1"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_663cbfe0","line":3030,"range":{"start_line":3026,"start_character":7,"end_line":3030,"end_character":56},"updated":"2017-11-29 16:14:52.000000000","message":"You shouldn\u0027t need any of this, it\u0027s part of _IntegratedTestBase which this test class eventually inherits from.","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1c35698c66f55193b517483f14fd55a2c6199a45","unresolved":false,"context_lines":[{"line_number":3023,"context_line":"    def _setup_services(self):"},{"line_number":3024,"context_line":"        if \u0027cell1\u0027 in self.cell_mappings:"},{"line_number":3025,"context_line":"            self.flags(transport_url\u003dself.cell_mappings[\u0027cell1\u0027].transport_url)"},{"line_number":3026,"context_line":"        self.conductor \u003d self.start_service(\u0027conductor\u0027)"},{"line_number":3027,"context_line":"        self.consoleauth \u003d self.start_service(\u0027consoleauth\u0027)"},{"line_number":3028,"context_line":"        self.network \u003d self.start_service(\u0027network\u0027,"},{"line_number":3029,"context_line":"                                          manager\u003dCONF.network_manager)"},{"line_number":3030,"context_line":"        self.scheduler \u003d self._setup_scheduler_service()"},{"line_number":3031,"context_line":""},{"line_number":3032,"context_line":"        # Set up 2 compute services in deferrent cells"},{"line_number":3033,"context_line":"        # host1 is in cell1"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_e1c75963","line":3030,"range":{"start_line":3026,"start_character":7,"end_line":3030,"end_character":56},"in_reply_to":"ff82abbf_663cbfe0","updated":"2017-11-29 16:19:55.000000000","message":"And I guess you\u0027re doing all of this because you\u0027ve overridden _setup_services from _IntegratedTestBase. I think we can target this to a much smaller set of things we need to do but just overriding _IntegratedTestBase._setup_compute_service.","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3029,"context_line":"                                          manager\u003dCONF.network_manager)"},{"line_number":3030,"context_line":"        self.scheduler \u003d self._setup_scheduler_service()"},{"line_number":3031,"context_line":""},{"line_number":3032,"context_line":"        # Set up 2 compute services in deferrent cells"},{"line_number":3033,"context_line":"        # host1 is in cell1"},{"line_number":3034,"context_line":"        self.compute1 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host1\u0027,"},{"line_number":3035,"context_line":"                                           cell\u003d\u0027cell1\u0027)"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_262237ba","line":3032,"range":{"start_line":3032,"start_character":39,"end_line":3032,"end_character":48},"updated":"2017-11-29 16:14:52.000000000","message":"different","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3036,"context_line":"        # host2 is in cell2"},{"line_number":3037,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027,"},{"line_number":3038,"context_line":"                                           cell\u003d\u0027cell2\u0027)"},{"line_number":3039,"context_line":"        self.api_fixture \u003d self.useFixture("},{"line_number":3040,"context_line":"            nova_fixtures.OSAPIFixture(self.api_major_version))"},{"line_number":3041,"context_line":""},{"line_number":3042,"context_line":"        # Cold migration is admin operation."},{"line_number":3043,"context_line":"        self.api \u003d self.api_fixture.admin_api"},{"line_number":3044,"context_line":""},{"line_number":3045,"context_line":"    def _get_other_host(self, host):"},{"line_number":3046,"context_line":"        other_hostname \u003d {\u0027host1\u0027: \u0027host2\u0027,"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_810a0d1d","line":3043,"range":{"start_line":3039,"start_character":8,"end_line":3043,"end_character":45},"updated":"2017-11-29 16:14:52.000000000","message":"This is already done in _IntegratedTestBase for you, if you need self.api to be the admin API, then set ADMIN_API \u003d True in the class.","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3049,"context_line":""},{"line_number":3050,"context_line":"    def test_migrate_server_to_host_in_different_cell(self):"},{"line_number":3051,"context_line":"        server \u003d self._create_server()"},{"line_number":3052,"context_line":"        self.addCleanup(self._delete_server, server[\u0027id\u0027])"},{"line_number":3053,"context_line":"        server \u003d self._wait_for_state_change(server, \u0027BUILD\u0027)"},{"line_number":3054,"context_line":""},{"line_number":3055,"context_line":"        target_host \u003d self._get_other_host(server[\u0027OS-EXT-SRV-ATTR:host\u0027])"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_e11af96c","line":3052,"range":{"start_line":3052,"start_character":8,"end_line":3052,"end_character":58},"updated":"2017-11-29 16:14:52.000000000","message":"I\u0027m not sure we actually need to care about this - the database is torn down between each test run.","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3065,"context_line":"class ServerTestV256RescheduleTestCase(ServerTestV256Common):"},{"line_number":3066,"context_line":""},{"line_number":3067,"context_line":"    def _setup_services(self):"},{"line_number":3068,"context_line":"        if \u0027cell1\u0027 in self.cell_mappings:"},{"line_number":3069,"context_line":"            self.flags(transport_url\u003dself.cell_mappings[\u0027cell1\u0027].transport_url)"},{"line_number":3070,"context_line":"        self.conductor \u003d self.start_service(\u0027conductor\u0027)"},{"line_number":3071,"context_line":"        self.consoleauth \u003d self.start_service(\u0027consoleauth\u0027)"},{"line_number":3072,"context_line":"        self.network \u003d self.start_service(\u0027network\u0027,"},{"line_number":3073,"context_line":"                                          manager\u003dCONF.network_manager)"},{"line_number":3074,"context_line":"        self.scheduler \u003d self._setup_scheduler_service()"},{"line_number":3075,"context_line":""},{"line_number":3076,"context_line":"        # Set up 3 compute services in the same cell"},{"line_number":3077,"context_line":"        # host1"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_6120299c","line":3074,"range":{"start_line":3068,"start_character":8,"end_line":3074,"end_character":56},"updated":"2017-11-29 16:14:52.000000000","message":"same as above","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3085,"context_line":"        fake.set_nodes([\u0027host3\u0027])"},{"line_number":3086,"context_line":"        self.compute3 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host3\u0027)"},{"line_number":3087,"context_line":""},{"line_number":3088,"context_line":"        self.api_fixture \u003d self.useFixture("},{"line_number":3089,"context_line":"            nova_fixtures.OSAPIFixture(self.api_major_version))"},{"line_number":3090,"context_line":""},{"line_number":3091,"context_line":"        # Cold migration is admin operation."},{"line_number":3092,"context_line":"        self.api \u003d self.api_fixture.admin_api"},{"line_number":3093,"context_line":""},{"line_number":3094,"context_line":"    def _get_target_and_other_hosts(self, host):"},{"line_number":3095,"context_line":"        target_other_hosts \u003d {\u0027host1\u0027: [\u0027host2\u0027, \u0027host3\u0027],"}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_213ea1c0","line":3092,"range":{"start_line":3088,"start_character":8,"end_line":3092,"end_character":45},"updated":"2017-11-29 16:14:52.000000000","message":"same as above; plus, if you need any of this stuff, it seems you should handle it in ServerTestV256Common since you have a common base class for common code.","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75c4bbb71db82e7c763bfd8441e5af6608e6d174","unresolved":false,"context_lines":[{"line_number":3102,"context_line":"                           reason\u003d\u0027Test Exception\u0027))"},{"line_number":3103,"context_line":"    def test_migrate_server_not_reschedule(self, mock_prep_resize):"},{"line_number":3104,"context_line":"        server \u003d self._create_server()"},{"line_number":3105,"context_line":"        self.addCleanup(self._delete_server, server[\u0027id\u0027])"},{"line_number":3106,"context_line":"        found_server \u003d self._wait_for_state_change(server, \u0027BUILD\u0027)"},{"line_number":3107,"context_line":""},{"line_number":3108,"context_line":"        target_host, other_host \u003d self._get_target_and_other_hosts("}],"source_content_type":"text/x-python","patch_set":109,"id":"ff82abbf_e16199d4","line":3105,"range":{"start_line":3105,"start_character":8,"end_line":3105,"end_character":58},"updated":"2017-11-29 16:14:52.000000000","message":"not necessary","commit_id":"408dd02e32b9b405bc653daaf85418ece243b4ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08b0280d0b627839fa52920468919e48db267606","unresolved":false,"context_lines":[{"line_number":3025,"context_line":"                                           cell\u003d\u0027cell1\u0027)"},{"line_number":3026,"context_line":"        # host2 is in cell2"},{"line_number":3027,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027,"},{"line_number":3028,"context_line":"                                           cell\u003d\u0027cell2\u0027)"},{"line_number":3029,"context_line":""},{"line_number":3030,"context_line":"    @staticmethod"},{"line_number":3031,"context_line":"    def _get_other_host(host):"}],"source_content_type":"text/x-python","patch_set":110,"id":"ff82abbf_c1301559","line":3028,"range":{"start_line":3028,"start_character":49,"end_line":3028,"end_character":54},"updated":"2017-11-29 16:27:29.000000000","message":"I changed this to cell1 and the test still passes, but likely means we\u0027re getting NoValidHost for a different reason, but also means the assertion in here isn\u0027t very good.","commit_id":"6346eeb25d3a3cb854a89ae4695d76e5b7b0e419"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e73f40c3014e3cd3946cb4362fabb99e60bab26c","unresolved":false,"context_lines":[{"line_number":3025,"context_line":"                                           cell\u003d\u0027cell1\u0027)"},{"line_number":3026,"context_line":"        # host2 is in cell2"},{"line_number":3027,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027,"},{"line_number":3028,"context_line":"                                           cell\u003d\u0027cell2\u0027)"},{"line_number":3029,"context_line":""},{"line_number":3030,"context_line":"    @staticmethod"},{"line_number":3031,"context_line":"    def _get_other_host(host):"}],"source_content_type":"text/x-python","patch_set":110,"id":"ff82abbf_bc2dfa95","line":3028,"range":{"start_line":3028,"start_character":49,"end_line":3028,"end_character":54},"in_reply_to":"ff82abbf_417405cf","updated":"2017-11-29 16:40:55.000000000","message":"Yeah the problem is you aren\u0027t setting the fake nodes like in ServerTestV256RescheduleTestCase when you have more than one compute service, which is something you need to do. When I set fake notes for host1 and host2 and both hosts are in cell1 then it successfully does the cold migration as expected.","commit_id":"6346eeb25d3a3cb854a89ae4695d76e5b7b0e419"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"077575f0ec7c4a02e98532d30d62398ad5624754","unresolved":false,"context_lines":[{"line_number":3025,"context_line":"                                           cell\u003d\u0027cell1\u0027)"},{"line_number":3026,"context_line":"        # host2 is in cell2"},{"line_number":3027,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027,"},{"line_number":3028,"context_line":"                                           cell\u003d\u0027cell2\u0027)"},{"line_number":3029,"context_line":""},{"line_number":3030,"context_line":"    @staticmethod"},{"line_number":3031,"context_line":"    def _get_other_host(host):"}],"source_content_type":"text/x-python","patch_set":110,"id":"ff82abbf_1c766671","line":3028,"range":{"start_line":3028,"start_character":49,"end_line":3028,"end_character":54},"in_reply_to":"ff82abbf_bc2dfa95","updated":"2017-11-29 16:51:28.000000000","message":"This also makes me realize we don\u0027t have a functional tests where we\u0027re successfully cold migrating from one host to another target host, regardless of number of cells. The API samples functional tests don\u0027t do that because they are mocking everything out.\n\nI will add a test for that in this class where we have 2 cells, 1 host in cell1 and 2 hosts in cell2 and make sure we create the server in cell2 and migrate to the other host in cell2.","commit_id":"6346eeb25d3a3cb854a89ae4695d76e5b7b0e419"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abd67daa0b513c80abc22d9d22cce3685267a51b","unresolved":false,"context_lines":[{"line_number":3025,"context_line":"                                           cell\u003d\u0027cell1\u0027)"},{"line_number":3026,"context_line":"        # host2 is in cell2"},{"line_number":3027,"context_line":"        self.compute2 \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027,"},{"line_number":3028,"context_line":"                                           cell\u003d\u0027cell2\u0027)"},{"line_number":3029,"context_line":""},{"line_number":3030,"context_line":"    @staticmethod"},{"line_number":3031,"context_line":"    def _get_other_host(host):"}],"source_content_type":"text/x-python","patch_set":110,"id":"ff82abbf_417405cf","line":3028,"range":{"start_line":3028,"start_character":49,"end_line":3028,"end_character":54},"in_reply_to":"ff82abbf_c1301559","updated":"2017-11-29 16:39:44.000000000","message":"If I make this cell1 and change the assertRaises below to not expect an error, it fails and I get the logs, which says:\n\n2017-11-29 11:29:13,673 INFO [nova.scheduler.host_manager] No hosts matched due to not matching requested destination (host2, host1)\n    2017-11-29 11:29:13,673 INFO [nova.scheduler.host_manager] Host filter ignoring hosts: \n    2017-11-29 11:29:13,687 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"PUT /placement/allocations/58ecba5e-aaca-4028-83aa-441b8718859f\" status: 204 len: 0 microversion: 1.8\n    2017-11-29 11:29:13,693 INFO [nova.api.openstack.placement.requestlog] 127.0.0.1 \"DELETE /placement/allocations/fa80fe7c-c651-438a-86c5-0bfdd4c34b80\" status: 204 len: 0 microversion: 1.0\n    2017-11-29 11:29:13,694 INFO [nova.scheduler.client.report] Deleted allocation for instance fa80fe7c-c651-438a-86c5-0bfdd4c34b80\n    2017-11-29 11:29:13,694 WARNING [nova.scheduler.utils] Failed to compute_task_migrate_server: No valid host was found. There are not enough hosts available.\n    2017-11-29 11:29:13,694 WARNING [nova.scheduler.utils] Setting instance to ACTIVE state.\n    2017-11-29 11:29:13,741 INFO [nova.api.openstack.wsgi] HTTP exception thrown: No valid host was found. No valid host found for cold migrate\n    2017-11-29 11:29:13,742 INFO [nova.api.openstack.requestlog] 127.0.0.1 \"POST /v2.1/6f70656e737461636b20342065766572/servers/58ecba5e-aaca-4028-83aa-441b8718859f/action\" status: 400 len: 105 microversion: 2.56 time: 0.266561\n\nMaybe a problem because you\u0027re not setting the fake nodes?","commit_id":"6346eeb25d3a3cb854a89ae4695d76e5b7b0e419"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4f60441b911346db3ffbd296a2433d6e13a984e4","unresolved":false,"context_lines":[{"line_number":3015,"context_line":"        return response[\u0027server\u0027]"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":""},{"line_number":3018,"context_line":"class ServerTestV256MultiCellTestCase(ServerTestV256Common):"},{"line_number":3019,"context_line":"    NUMBER_OF_CELLS \u003d 2"},{"line_number":3020,"context_line":""},{"line_number":3021,"context_line":"    def _setup_compute_service(self):"}],"source_content_type":"text/x-python","patch_set":111,"id":"ff82abbf_48a0a142","line":3018,"range":{"start_line":3018,"start_character":6,"end_line":3018,"end_character":37},"updated":"2017-11-29 22:03:29.000000000","message":"I\u0027m not sure why this is failing in CI, it\u0027s passing for me locally.","commit_id":"9dffb23c7fae9c66b223dc3ee23c7239f05b963f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cd6c4a4a45870fc414c5d498021d3420f56c65a","unresolved":false,"context_lines":[{"line_number":3026,"context_line":"            \u0027host1\u0027: \u0027cell1\u0027,"},{"line_number":3027,"context_line":"            \u0027host2\u0027: \u0027cell2\u0027}"},{"line_number":3028,"context_line":"        for host, cell in host_to_cell_mappings.items():"},{"line_number":3029,"context_line":"            # NOTE(mriedem): For some reason, if we use fake.set_nodes"},{"line_number":3030,"context_line":"            # in here it makes test_migrate_server_to_host_in_different_cell"},{"line_number":3031,"context_line":"            # fail because it doesn\u0027t find a compute node in a cell, but only"},{"line_number":3032,"context_line":"            # if we\u0027re doing the hosts in different cells. There is likely some"}],"source_content_type":"text/x-python","patch_set":111,"id":"ff82abbf_f7707b42","line":3029,"updated":"2017-11-29 17:39:20.000000000","message":"https://review.openstack.org/#/c/508432 might fix this, I\u0027m going to test that out, but for now these functional tests are working as expected so I think we\u0027re good for now.","commit_id":"9dffb23c7fae9c66b223dc3ee23c7239f05b963f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3673526ed0dfc954af4be3b03354e69e27c84cfa","unresolved":false,"context_lines":[{"line_number":3084,"context_line":"        for host in (\u0027host1\u0027, \u0027host2\u0027, \u0027host3\u0027):"},{"line_number":3085,"context_line":"            fake.set_nodes([host])"},{"line_number":3086,"context_line":"            self.addCleanup(fake.restore_nodes)"},{"line_number":3087,"context_line":"            self.compute1 \u003d self.start_service(\u0027compute\u0027, host\u003dhost)"},{"line_number":3088,"context_line":""},{"line_number":3089,"context_line":"    @staticmethod"},{"line_number":3090,"context_line":"    def _get_target_and_other_hosts(host):"}],"source_content_type":"text/x-python","patch_set":111,"id":"ff82abbf_881f896a","line":3087,"range":{"start_line":3087,"start_character":12,"end_line":3087,"end_character":28},"updated":"2017-11-29 22:08:53.000000000","message":"don\u0027t really need this","commit_id":"9dffb23c7fae9c66b223dc3ee23c7239f05b963f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b7f4f131b9ff1255de42da8ae120b5d4fd0b8d62","unresolved":false,"context_lines":[{"line_number":46,"context_line":"from nova import volume"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":50,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":113,"id":"ff82abbf_1b0c2292","line":49,"updated":"2017-11-30 01:46:45.000000000","message":"This isn\u0027t needed.","commit_id":"dab216319781771464ccc8113ffe9212a0935a89"}],"nova/tests/unit/api/openstack/compute/admin_only_action_common.py":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"035fb434e75a8b712a1025badc9aec9c66874d53","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    def _test_actions_with_non_existed_instance(self, actions, body_map\u003dNone):"},{"line_number":228,"context_line":"        body_map \u003d body_map or {}"},{"line_number":229,"context_line":"        for action in actions:"},{"line_number":230,"context_line":"            body \u003d body_map.get(action)"},{"line_number":231,"context_line":"            self._test_non_existing_instance(action, body\u003dbody)"},{"line_number":232,"context_line":"            # Re-mock this."},{"line_number":233,"context_line":"            self.mox.StubOutWithMock(self.compute_api, \u0027get\u0027)"}],"source_content_type":"text/x-python","patch_set":81,"id":"df3967d1_44169aaa","line":230,"range":{"start_line":230,"start_character":12,"end_line":230,"end_character":16},"updated":"2017-08-03 09:18:46.000000000","message":"not need to introduce new variable","commit_id":"5f09115647f84bf3bbde873449a05b19e152e17f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ad46973686f7c5a093b154b443b5d8e7e74459e7","unresolved":false,"context_lines":[{"line_number":227,"context_line":"    def _test_actions_with_non_existed_instance(self, actions, body_map\u003dNone):"},{"line_number":228,"context_line":"        body_map \u003d body_map or {}"},{"line_number":229,"context_line":"        for action in actions:"},{"line_number":230,"context_line":"            body \u003d body_map.get(action)"},{"line_number":231,"context_line":"            self._test_non_existing_instance(action, body\u003dbody)"},{"line_number":232,"context_line":"            # Re-mock this."},{"line_number":233,"context_line":"            self.mox.StubOutWithMock(self.compute_api, \u0027get\u0027)"}],"source_content_type":"text/x-python","patch_set":81,"id":"df3967d1_0b4c0840","line":230,"range":{"start_line":230,"start_character":12,"end_line":230,"end_character":16},"in_reply_to":"df3967d1_44169aaa","updated":"2017-08-03 21:58:12.000000000","message":"Done","commit_id":"5f09115647f84bf3bbde873449a05b19e152e17f"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"035fb434e75a8b712a1025badc9aec9c66874d53","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            exception_arg \u003d exception_args.get(action)"},{"line_number":245,"context_line":"            self.mox.StubOutWithMock(self.compute_api,"},{"line_number":246,"context_line":"                                     method or action.replace(\u0027_\u0027, \u0027\u0027))"},{"line_number":247,"context_line":"            body \u003d body_map.get(action)"},{"line_number":248,"context_line":"            self._test_invalid_state(action, method\u003dmethod,"},{"line_number":249,"context_line":"                                     body\u003dbody,"},{"line_number":250,"context_line":"                                     compute_api_args_map\u003dargs_map,"}],"source_content_type":"text/x-python","patch_set":81,"id":"df3967d1_241b96d0","line":247,"range":{"start_line":247,"start_character":12,"end_line":247,"end_character":16},"updated":"2017-08-03 09:18:46.000000000","message":"ditto","commit_id":"5f09115647f84bf3bbde873449a05b19e152e17f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ad46973686f7c5a093b154b443b5d8e7e74459e7","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            exception_arg \u003d exception_args.get(action)"},{"line_number":245,"context_line":"            self.mox.StubOutWithMock(self.compute_api,"},{"line_number":246,"context_line":"                                     method or action.replace(\u0027_\u0027, \u0027\u0027))"},{"line_number":247,"context_line":"            body \u003d body_map.get(action)"},{"line_number":248,"context_line":"            self._test_invalid_state(action, method\u003dmethod,"},{"line_number":249,"context_line":"                                     body\u003dbody,"},{"line_number":250,"context_line":"                                     compute_api_args_map\u003dargs_map,"}],"source_content_type":"text/x-python","patch_set":81,"id":"df3967d1_6b66f4c3","line":247,"range":{"start_line":247,"start_character":12,"end_line":247,"end_character":16},"in_reply_to":"df3967d1_241b96d0","updated":"2017-08-03 21:58:12.000000000","message":"Done","commit_id":"5f09115647f84bf3bbde873449a05b19e152e17f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            self.context, uuid, expected_attrs\u003dNone).AndRaise(exc_info)"},{"line_number":48,"context_line":"        return uuid"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _test_non_existing_instance(self, action, body_map\u003dNone):"},{"line_number":51,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":52,"context_line":"        self._stub_instance_get_failure("},{"line_number":53,"context_line":"                exception.InstanceNotFound(instance_id\u003duuid), uuid\u003duuid)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_64aa9e19","side":"PARENT","line":50,"range":{"start_line":50,"start_character":50,"end_line":50,"end_character":58},"updated":"2017-11-28 14:23:22.000000000","message":"Why does this need to be renamed in this change? Seems unrelated and could be done in a separate cleanup patch.","commit_id":"81ffd2065de22810f0d2e3f965763b70a6d48636"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            self.context, uuid, expected_attrs\u003dNone).AndRaise(exc_info)"},{"line_number":48,"context_line":"        return uuid"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _test_non_existing_instance(self, action, body_map\u003dNone):"},{"line_number":51,"context_line":"        uuid \u003d uuidutils.generate_uuid()"},{"line_number":52,"context_line":"        self._stub_instance_get_failure("},{"line_number":53,"context_line":"                exception.InstanceNotFound(instance_id\u003duuid), uuid\u003duuid)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_1552cd3b","side":"PARENT","line":50,"range":{"start_line":50,"start_character":50,"end_line":50,"end_character":58},"in_reply_to":"ff82abbf_64aa9e19","updated":"2017-11-29 05:41:02.000000000","message":"okay. I will do it in another patch.","commit_id":"81ffd2065de22810f0d2e3f965763b70a6d48636"}],"nova/tests/unit/api/openstack/compute/test_create_backup.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":320,"context_line":"    @mock.patch.object(api.API, \u0027backup\u0027)"},{"line_number":321,"context_line":"    def test_create_backup_raises_conflict_on_invalid_state(self,"},{"line_number":322,"context_line":"                                   mock_backup, mock_check_image):"},{"line_number":323,"context_line":"        body_map \u003d {"},{"line_number":324,"context_line":"            \u0027createBackup\u0027: {"},{"line_number":325,"context_line":"                \u0027name\u0027: \u0027Backup 1\u0027,"},{"line_number":326,"context_line":"                \u0027backup_type\u0027: \u0027daily\u0027,"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_e46b0eee","side":"PARENT","line":323,"range":{"start_line":323,"start_character":8,"end_line":323,"end_character":16},"updated":"2017-11-28 14:23:22.000000000","message":"same, I don\u0027t see why this should be renamed in this change.","commit_id":"81ffd2065de22810f0d2e3f965763b70a6d48636"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":320,"context_line":"    @mock.patch.object(api.API, \u0027backup\u0027)"},{"line_number":321,"context_line":"    def test_create_backup_raises_conflict_on_invalid_state(self,"},{"line_number":322,"context_line":"                                   mock_backup, mock_check_image):"},{"line_number":323,"context_line":"        body_map \u003d {"},{"line_number":324,"context_line":"            \u0027createBackup\u0027: {"},{"line_number":325,"context_line":"                \u0027name\u0027: \u0027Backup 1\u0027,"},{"line_number":326,"context_line":"                \u0027backup_type\u0027: \u0027daily\u0027,"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_229b1518","side":"PARENT","line":323,"range":{"start_line":323,"start_character":8,"end_line":323,"end_character":16},"in_reply_to":"ff82abbf_e46b0eee","updated":"2017-11-29 05:41:02.000000000","message":"okay. I will do it in another patch.","commit_id":"81ffd2065de22810f0d2e3f965763b70a6d48636"}],"nova/tests/unit/api/openstack/compute/test_migrate_server.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"0274049d01f95ad291040ca23db6aa2271bf4833","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                       _fake_controller)"},{"line_number":51,"context_line":"        self.mox.StubOutWithMock(self.compute_api, \u0027get\u0027)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _get_migration_body(self, **kwargs):"},{"line_number":54,"context_line":"        return {\u0027os-migrateLive\u0027: self._get_params(**kwargs)}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _get_cold_migration_body(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_0f55aec4","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":27},"updated":"2017-01-24 03:50:32.000000000","message":"Here","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"52dc3a1f5e16a5427b59ca297538fa0a65ae68ef","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def _get_migration_body(self, **kwargs):"},{"line_number":54,"context_line":"        return {\u0027os-migrateLive\u0027: self._get_params(**kwargs)}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _get_cold_migration_body(self, **kwargs):"},{"line_number":57,"context_line":"        return {\u0027migrate\u0027: None}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _get_params(self, **kwargs):"},{"line_number":60,"context_line":"        return {\u0027host\u0027: kwargs.get(\u0027host\u0027),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_2cca7d1b","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":32},"updated":"2017-01-24 00:41:37.000000000","message":"I can see this optimization but this way is tricky and makes code unreadable.\nSo please add different test cases for a new feature even if it adds some duplicated code.","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"0274049d01f95ad291040ca23db6aa2271bf4833","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def _get_migration_body(self, **kwargs):"},{"line_number":54,"context_line":"        return {\u0027os-migrateLive\u0027: self._get_params(**kwargs)}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _get_cold_migration_body(self, **kwargs):"},{"line_number":57,"context_line":"        return {\u0027migrate\u0027: None}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _get_params(self, **kwargs):"},{"line_number":60,"context_line":"        return {\u0027host\u0027: kwargs.get(\u0027host\u0027),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_2ffeeaad","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":32},"in_reply_to":"5a3905b3_2cca7d1b","updated":"2017-01-24 03:50:32.000000000","message":"In live migration cases, \u0027_get_migration_body\u0027 (Line 53) is used.\nSo IMO, it is good to make and utilize this private method for consistency with live migration case.","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"9d13d7514f6f8f6f212ade9bb4c213f475c36203","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def _get_migration_body(self, **kwargs):"},{"line_number":54,"context_line":"        return {\u0027os-migrateLive\u0027: self._get_params(**kwargs)}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _get_cold_migration_body(self, **kwargs):"},{"line_number":57,"context_line":"        return {\u0027migrate\u0027: None}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _get_params(self, **kwargs):"},{"line_number":60,"context_line":"        return {\u0027host\u0027: kwargs.get(\u0027host\u0027),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_4c78722c","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":32},"in_reply_to":"5a3905b3_2ffeeaad","updated":"2017-01-24 20:52:15.000000000","message":"The consistency of unreadable tests is not reasonable for me..","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"1d47fd42ad7f504b410c2a9a3223f540b9e5c54a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def _get_migration_body(self, **kwargs):"},{"line_number":54,"context_line":"        return {\u0027os-migrateLive\u0027: self._get_params(**kwargs)}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _get_cold_migration_body(self, **kwargs):"},{"line_number":57,"context_line":"        return {\u0027migrate\u0027: None}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _get_params(self, **kwargs):"},{"line_number":60,"context_line":"        return {\u0027host\u0027: kwargs.get(\u0027host\u0027),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_d59f7e63","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":32},"in_reply_to":"5a3905b3_4c78722c","updated":"2017-01-25 02:10:36.000000000","message":"Done","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"52dc3a1f5e16a5427b59ca297538fa0a65ae68ef","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        method_translations \u003d {\u0027_migrate\u0027: \u0027resize\u0027,"},{"line_number":66,"context_line":"                               \u0027_migrate_live\u0027: \u0027live_migrate\u0027}"},{"line_number":67,"context_line":"        body_map \u003d {\u0027_migrate_live\u0027: self._get_migration_body(host\u003d\u0027hostname\u0027),"},{"line_number":68,"context_line":"                    \u0027_migrate\u0027:"},{"line_number":69,"context_line":"                    self._get_cold_migration_body(host\u003dself.host_name,"},{"line_number":70,"context_line":"                                                  force\u003dself.migrate_force)}"},{"line_number":71,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit,"},{"line_number":72,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":73,"context_line":"                                      {}),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_4cf4295a","line":70,"range":{"start_line":68,"start_character":0,"end_line":70,"end_character":75},"updated":"2017-01-24 00:41:37.000000000","message":"ditto: This makes the original behavior unreadable on the test class.","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"0274049d01f95ad291040ca23db6aa2271bf4833","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        method_translations \u003d {\u0027_migrate\u0027: \u0027resize\u0027,"},{"line_number":66,"context_line":"                               \u0027_migrate_live\u0027: \u0027live_migrate\u0027}"},{"line_number":67,"context_line":"        body_map \u003d {\u0027_migrate_live\u0027: self._get_migration_body(host\u003d\u0027hostname\u0027),"},{"line_number":68,"context_line":"                    \u0027_migrate\u0027:"},{"line_number":69,"context_line":"                    self._get_cold_migration_body(host\u003dself.host_name,"},{"line_number":70,"context_line":"                                                  force\u003dself.migrate_force)}"},{"line_number":71,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit,"},{"line_number":72,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":73,"context_line":"                                      {}),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a3905b3_af281a34","line":70,"range":{"start_line":68,"start_character":0,"end_line":70,"end_character":75},"in_reply_to":"5a3905b3_4cf4295a","updated":"2017-01-24 03:50:32.000000000","message":"ditto","commit_id":"56b977844a5b285d27a85947e5808663478d0812"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit,"},{"line_number":67,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":68,"context_line":"                                      {}),"},{"line_number":69,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: self.host_name})}"},{"line_number":70,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":71,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":72,"context_line":"                           args_map\u003dargs_map)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_84280297","line":69,"range":{"start_line":69,"start_character":37,"end_line":69,"end_character":66},"updated":"2017-11-28 14:23:22.000000000","message":"I don\u0027t like this on the tests that are using microversion 2.1. I know that we don\u0027t validate the body schema before 2.56, but still, this could be confusing to new contributors that ever look at this code and think that this is valid for a request before 2.56. If you\u0027re just trying to make these tests re-usable for 2.56, then do something like:\n\n  body \u003d {}\n  if self.host_name:\n      body \u003d {\u0027host_name\u0027: self.host_name}\n\nYou might need to move this into a private helper method since I see you\u0027ll need to re-use this pattern in several tests.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit,"},{"line_number":67,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":68,"context_line":"                                      {}),"},{"line_number":69,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: self.host_name})}"},{"line_number":70,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":71,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":72,"context_line":"                           args_map\u003dargs_map)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_55ea95d7","line":69,"range":{"start_line":69,"start_character":37,"end_line":69,"end_character":66},"in_reply_to":"ff82abbf_84280297","updated":"2017-11-29 05:41:02.000000000","message":"It is not a request body. It is an argument of \u0027resize\u0027 method of compute API. So it is no problem.\nIf the request body is \u0027{\"migrate\": null}\u0027, the argument is \"host_name\u003dNone\".\n\nhttps://review.openstack.org/#/c/408964/108/nova/api/openstack/compute/migrate_server.py@56","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit, None,"},{"line_number":79,"context_line":"                                       self.force, self.async),"},{"line_number":80,"context_line":"                                      {}),"},{"line_number":81,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: None})}"},{"line_number":82,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":83,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":84,"context_line":"                           args_map\u003dargs_map)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_04163256","line":81,"updated":"2017-11-28 14:23:22.000000000","message":"same","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit, None,"},{"line_number":79,"context_line":"                                       self.force, self.async),"},{"line_number":80,"context_line":"                                      {}),"},{"line_number":81,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: None})}"},{"line_number":82,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":83,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":84,"context_line":"                           args_map\u003dargs_map)"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_15a72dbf","line":81,"in_reply_to":"ff82abbf_04163256","updated":"2017-11-29 05:41:02.000000000","message":"ditto","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit,"},{"line_number":98,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":99,"context_line":"                                      {}),"},{"line_number":100,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: self.host_name})}"},{"line_number":101,"context_line":"        exception_arg \u003d {\u0027_migrate\u0027: \u0027migrate\u0027,"},{"line_number":102,"context_line":"                         \u0027_migrate_live\u0027: \u0027os-migrateLive\u0027}"},{"line_number":103,"context_line":"        self._test_actions_raise_conflict_on_invalid_state("}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_8401e208","line":100,"updated":"2017-11-28 14:23:22.000000000","message":"same","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        args_map \u003d {\u0027_migrate_live\u0027: ((False, self.disk_over_commit,"},{"line_number":98,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":99,"context_line":"                                      {}),"},{"line_number":100,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: self.host_name})}"},{"line_number":101,"context_line":"        exception_arg \u003d {\u0027_migrate\u0027: \u0027migrate\u0027,"},{"line_number":102,"context_line":"                         \u0027_migrate_live\u0027: \u0027os-migrateLive\u0027}"},{"line_number":103,"context_line":"        self._test_actions_raise_conflict_on_invalid_state("}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_b5a9a190","line":100,"in_reply_to":"ff82abbf_8401e208","updated":"2017-11-29 05:41:02.000000000","message":"ditto","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                          self.req, instance.uuid, body\u003dbody)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"class MigrateServerTestsV256(MigrateServerTestsV234):"},{"line_number":454,"context_line":"    host_name \u003d \u0027fake-host\u0027"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_3f2ee391","line":453,"range":{"start_line":453,"start_character":29,"end_line":453,"end_character":51},"updated":"2017-11-28 14:23:22.000000000","message":"2.34 was all about live migration, so this doesn\u0027t seem like an appropriate base class for these cold migrate tests. Why not just extend MigrateServerTestsV21?","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                          self.req, instance.uuid, body\u003dbody)"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"class MigrateServerTestsV256(MigrateServerTestsV234):"},{"line_number":454,"context_line":"    host_name \u003d \u0027fake-host\u0027"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_f58c0937","line":453,"range":{"start_line":453,"start_character":29,"end_line":453,"end_character":51},"in_reply_to":"ff82abbf_3f2ee391","updated":"2017-11-29 05:41:02.000000000","message":"Because the following test cases fail if extending MigrateServerTestsV21.\n\n\n* test_migrate_live_compute_service_unavailable\n* test_migrate_live_invalid_hypervisor_type\n* test_migrate_live_migration_with_unexpected_error\n* test_migrate_live_compute_service_not_found\n* test_migrate_live_pre_check_error\n* test_migrate_live_invalid_local_storage\n* test_migrate_live_destination_hypervisor_too_old\n* test_migrate_live_enabled_with_string_param\n* test_migrate_live_without_disk_over_commit\n* test_migrate_live_hypervisor_unavailable\n* test_migrate_live_enabled\n* test_migrate_live_instance_not_active\n* test_migrate_live_no_valid_host\n* test_migrate_live_invalid_cpu_info\n* test_migrate_live_unable_to_migrate_to_self\n* test_migrate_live_invalid_shared_storage\n* test_migrate_live_migration_precheck_client_exception","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":484,"context_line":"                                      {}),"},{"line_number":485,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: self.host_name})}"},{"line_number":486,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":487,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":488,"context_line":"                           args_map\u003dargs_map)"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_3f534319","line":486,"range":{"start_line":486,"start_character":41,"end_line":486,"end_character":54},"updated":"2017-11-28 14:23:22.000000000","message":"I\u0027m not sure why we care about testing live migration in these cold migrate tests for 2.56.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                                       \u0027hostname\u0027, self.force, self.async),"},{"line_number":484,"context_line":"                                      {}),"},{"line_number":485,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: self.host_name})}"},{"line_number":486,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":487,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":488,"context_line":"                           args_map\u003dargs_map)"},{"line_number":489,"context_line":""}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_55bff5a8","line":486,"range":{"start_line":486,"start_character":41,"end_line":486,"end_character":54},"in_reply_to":"ff82abbf_3f534319","updated":"2017-11-29 05:41:02.000000000","message":"Done","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                                       self.force, self.async),"},{"line_number":497,"context_line":"                                      {}),"},{"line_number":498,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: None})}"},{"line_number":499,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":500,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":501,"context_line":"                           args_map\u003dargs_map)"},{"line_number":502,"context_line":""}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_df5577fb","line":499,"range":{"start_line":499,"start_character":41,"end_line":499,"end_character":54},"updated":"2017-11-28 14:23:22.000000000","message":"same","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                                       self.force, self.async),"},{"line_number":497,"context_line":"                                      {}),"},{"line_number":498,"context_line":"                    \u0027_migrate\u0027: ((), {\u0027host_name\u0027: None})}"},{"line_number":499,"context_line":"        self._test_actions([\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":500,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":501,"context_line":"                           args_map\u003dargs_map)"},{"line_number":502,"context_line":""}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_7562390c","line":499,"range":{"start_line":499,"start_character":41,"end_line":499,"end_character":54},"in_reply_to":"ff82abbf_df5577fb","updated":"2017-11-29 05:41:02.000000000","message":"Done","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":539,"context_line":"            [\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":540,"context_line":"            args_map\u003dargs_map, method_translations\u003dmethod_translations)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_migrate_without_migrate_object(self):"},{"line_number":543,"context_line":"        self._test_migrate_validation_error({})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_migrate_with_additional_property(self):"},{"line_number":546,"context_line":"        self._test_migrate_validation_error("}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_df6ed7c7","line":543,"range":{"start_line":542,"start_character":4,"end_line":543,"end_character":47},"updated":"2017-11-28 14:23:22.000000000","message":"How about a test where \u0027migrate\u0027 is specified but it\u0027s a string instead of an object, like:\n\nbody \u003d {\n    \u0027migrate\u0027: \u0027fake-host\u0027\n}","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":539,"context_line":"            [\u0027_migrate\u0027, \u0027_migrate_live\u0027], body_map\u003dbody_map,"},{"line_number":540,"context_line":"            args_map\u003dargs_map, method_translations\u003dmethod_translations)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_migrate_without_migrate_object(self):"},{"line_number":543,"context_line":"        self._test_migrate_validation_error({})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_migrate_with_additional_property(self):"},{"line_number":546,"context_line":"        self._test_migrate_validation_error("}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_955d7d48","line":543,"range":{"start_line":542,"start_character":4,"end_line":543,"end_character":47},"in_reply_to":"ff82abbf_df6ed7c7","updated":"2017-11-29 05:41:02.000000000","message":"Done","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9df56383e3215eb76419835bb89fddda0002828","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":560,"context_line":"                           args_map\u003dargs_map)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    def test_migrate_nonexistent_host(self):"},{"line_number":563,"context_line":"        exc_info \u003d exception.ComputeHostNotFound(host\u003d\u0027nonexistent_host\u0027)"},{"line_number":564,"context_line":"        self._test_migrate_exception(exc_info, webob.exc.HTTPBadRequest)"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"    def test_migrate_no_request_spec(self):"},{"line_number":567,"context_line":"        exc_info \u003d exception.CannotMigrateWithTargetHost()"},{"line_number":568,"context_line":"        self._test_migrate_exception(exc_info, webob.exc.HTTPConflict)"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    def test_migrate_to_same_host(self):"},{"line_number":571,"context_line":"        exc_info \u003d exception.CannotMigrateToSameHost()"},{"line_number":572,"context_line":"        self._test_migrate_exception(exc_info, webob.exc.HTTPBadRequest)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"class MigrateServerPolicyEnforcementV21(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_bf3e73b5","line":572,"range":{"start_line":562,"start_character":4,"end_line":572,"end_character":72},"updated":"2017-11-28 14:23:22.000000000","message":"These are what you had in that API samples functional test, so just remove those API samples functional tests since they are (1) duplicates and (2) we don\u0027t have negative scenario tests in the functional API samples tests.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4a32ca492758e95dcc0481e16b1c2715a26e53f6","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                           method_translations\u003dmethod_translations,"},{"line_number":560,"context_line":"                           args_map\u003dargs_map)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    def test_migrate_nonexistent_host(self):"},{"line_number":563,"context_line":"        exc_info \u003d exception.ComputeHostNotFound(host\u003d\u0027nonexistent_host\u0027)"},{"line_number":564,"context_line":"        self._test_migrate_exception(exc_info, webob.exc.HTTPBadRequest)"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"    def test_migrate_no_request_spec(self):"},{"line_number":567,"context_line":"        exc_info \u003d exception.CannotMigrateWithTargetHost()"},{"line_number":568,"context_line":"        self._test_migrate_exception(exc_info, webob.exc.HTTPConflict)"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    def test_migrate_to_same_host(self):"},{"line_number":571,"context_line":"        exc_info \u003d exception.CannotMigrateToSameHost()"},{"line_number":572,"context_line":"        self._test_migrate_exception(exc_info, webob.exc.HTTPBadRequest)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"class MigrateServerPolicyEnforcementV21(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":108,"id":"ff82abbf_d59a2560","line":572,"range":{"start_line":562,"start_character":4,"end_line":572,"end_character":72},"in_reply_to":"ff82abbf_bf3e73b5","updated":"2017-11-29 05:41:02.000000000","message":"Remove the tests in the functional tests.\nSo the tests in this file remains as they are.","commit_id":"141d2197881788ed3addbde7fc425e3f39a326fe"}],"releasenotes/notes/cold-migration-with-target-ocata-2dcd09c3a3414302.yaml":[{"author":{"_account_id":15293,"name":"Karen Bradshaw","email":"kbhawkey@gmail.com","username":"karenb"},"change_message_id":"a1dfb7b42994ed86de9d4d330ba458e0ee1fecd2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - When cold migrating a server, the ``host`` parameter is available"},{"line_number":4,"context_line":"    as of microversion 2.42."},{"line_number":5,"context_line":"    And in order not to call the scheduler when providing a destination,"},{"line_number":6,"context_line":"    a new request body field called ``force`` (defaulted to ``False``)"},{"line_number":7,"context_line":"    is added. Setting it to ``True`` makes the cold migrate operation"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9a57fde8_9058a058","line":4,"updated":"2017-01-12 15:21:40.000000000","message":"A few suggestions to reword this paragraph. Does this sound accurate? Is the last sentence true regarding the scheduler or even necessary? Does this API have feature parity with live migrate?\n\nWith microversion 2.42, two new fields have been added to the request body to support cold migration of a server. The ``host`` parameter is required. The ``force`` parameter is optional and defaults to ``False``. If the ``force`` parameter is set to ``True``, the cold migrate operation bypasses the scheduler.","commit_id":"08c79afe36d4bd102f346043c40e13624159d7c3"}],"releasenotes/notes/cold-migration-with-target-queens-2dcd09c3a3414302.yaml":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"035fb434e75a8b712a1025badc9aec9c66874d53","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - When cold migrating a server, the ``host`` parameter is available"},{"line_number":4,"context_line":"    as of microversion 2.54."},{"line_number":5,"context_line":"    And in order not to call the scheduler when providing a destination,"},{"line_number":6,"context_line":"    a new request body field called ``force`` (defaulted to ``False``)"}],"source_content_type":"text/x-yaml","patch_set":81,"id":"df3967d1_841fe2b5","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":3},"updated":"2017-08-03 09:18:46.000000000","message":"add | for multiple lines","commit_id":"5f09115647f84bf3bbde873449a05b19e152e17f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ad46973686f7c5a093b154b443b5d8e7e74459e7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - When cold migrating a server, the ``host`` parameter is available"},{"line_number":4,"context_line":"    as of microversion 2.54."},{"line_number":5,"context_line":"    And in order not to call the scheduler when providing a destination,"},{"line_number":6,"context_line":"    a new request body field called ``force`` (defaulted to ``False``)"}],"source_content_type":"text/x-yaml","patch_set":81,"id":"df3967d1_2b5c6ceb","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":3},"in_reply_to":"df3967d1_841fe2b5","updated":"2017-08-03 21:58:12.000000000","message":"No. It is not necessary.","commit_id":"5f09115647f84bf3bbde873449a05b19e152e17f"}]}
