)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0cc3203e2e480270205296fc57ebc89b04ff3d47","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In microversion 2.80, the ``GET /os-migrations`` API will have"},{"line_number":10,"context_line":"optional ``user_id`` and ``project_id`` query parameters for"},{"line_number":11,"context_line":"filtering migrations by user and/or project::"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"* GET /os-migrations?user_id\u003def9d34b4-45d0-4530-871b-3fb535988394"},{"line_number":14,"context_line":"* GET /os-migrations?project_id\u003d011ee9f4-8f16-4c38-8633-a254d420fd54"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":29,"id":"5faad753_2d96f194","line":11,"range":{"start_line":11,"start_character":44,"end_line":11,"end_character":45},"updated":"2019-09-13 21:32:16.000000000","message":"nit: you can remove this","commit_id":"aecfaf5b7e00019cf4f9455d60eb7376ea49af10"}],"api-ref/source/os-migrations.inc":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":64,"context_line":"  - links: migration_links_2_23"},{"line_number":65,"context_line":"  - uuid: migration_uuid"},{"line_number":66,"context_line":"  - migrations_links: migration_next_links_2_59"},{"line_number":67,"context_line":"  - user_id: user_id_server_action"},{"line_number":68,"context_line":"  - project_id: project_id_server_action"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"**Example List Migrations: JSON response**"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":23,"id":"5faad753_753d0fba","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":40},"updated":"2019-09-09 05:43:25.000000000","message":"Minimum version (\"New in version 2.80\") should be described.","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":64,"context_line":"  - links: migration_links_2_23"},{"line_number":65,"context_line":"  - uuid: migration_uuid"},{"line_number":66,"context_line":"  - migrations_links: migration_next_links_2_59"},{"line_number":67,"context_line":"  - user_id: user_id_server_action"},{"line_number":68,"context_line":"  - project_id: project_id_server_action"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"**Example List Migrations: JSON response**"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":23,"id":"5faad753_553ed329","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":40},"in_reply_to":"5faad753_753d0fba","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"  - links: migration_links_2_23"},{"line_number":65,"context_line":"  - uuid: migration_uuid"},{"line_number":66,"context_line":"  - migrations_links: migration_next_links_2_59"},{"line_number":67,"context_line":"  - user_id: user_id_server_action_2_80"},{"line_number":68,"context_line":"  - project_id: project_id_server_action_2_80"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"**Example List Migrations: JSON response**"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":25,"id":"5faad753_e4f8414a","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":45},"updated":"2019-09-10 22:55:25.000000000","message":"This doesn\u0027t look right. This change is about adding user_id and project_id to the migrations API, not the server actions API.\n\nShouldn\u0027t this be something more like:\nuser_id: migration_user_id_2_80\nproject_id: migration_project_id_2_80\nor\nuser_id: user_id_migration_2_80\nproject_id: project_id_migration_2_80\n?","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":64,"context_line":"  - links: migration_links_2_23"},{"line_number":65,"context_line":"  - uuid: migration_uuid"},{"line_number":66,"context_line":"  - migrations_links: migration_next_links_2_59"},{"line_number":67,"context_line":"  - user_id: user_id_server_action_2_80"},{"line_number":68,"context_line":"  - project_id: project_id_server_action_2_80"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"**Example List Migrations: JSON response**"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":25,"id":"5faad753_18093e30","line":68,"range":{"start_line":67,"start_character":0,"end_line":68,"end_character":45},"in_reply_to":"5faad753_e4f8414a","updated":"2019-09-11 07:12:30.000000000","message":"s/user_id_migration_2_80,project_id_migration_2_80","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0cc3203e2e480270205296fc57ebc89b04ff3d47","unresolved":false,"context_lines":[{"line_number":72,"context_line":".. literalinclude:: ../../doc/api_samples/os-migrations/migrations-get.json"},{"line_number":73,"context_line":"   :language: javascript"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"**Example List Migrations (v2.59):**"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":".. literalinclude:: ../../doc/api_samples/os-migrations/v2.59/migrations-get.json"},{"line_number":78,"context_line":"   :language: javascript"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"**Example List Migrations With Paging (v2.59):**"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":".. literalinclude:: ../../doc/api_samples/os-migrations/v2.59/migrations-get-with-limit.json"},{"line_number":83,"context_line":"   :language: javascript"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"**Example List Migrations (v2.80):**"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":29,"id":"5faad753_8dd36560","line":83,"range":{"start_line":75,"start_character":0,"end_line":83,"end_character":24},"updated":"2019-09-13 21:32:16.000000000","message":"This is an open question to the API team (gmann and alex_xu really) but should we remove these in-between samples if we are showing the base (2.1) and latest? Could be done in a follow up.","commit_id":"aecfaf5b7e00019cf4f9455d60eb7376ea49af10"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"1938ed8c9f55a5142ca8af1095911d2f30ba4037","unresolved":false,"context_lines":[{"line_number":72,"context_line":".. literalinclude:: ../../doc/api_samples/os-migrations/migrations-get.json"},{"line_number":73,"context_line":"   :language: javascript"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"**Example List Migrations (v2.59):**"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":".. literalinclude:: ../../doc/api_samples/os-migrations/v2.59/migrations-get.json"},{"line_number":78,"context_line":"   :language: javascript"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"**Example List Migrations With Paging (v2.59):**"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":".. literalinclude:: ../../doc/api_samples/os-migrations/v2.59/migrations-get-with-limit.json"},{"line_number":83,"context_line":"   :language: javascript"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"**Example List Migrations (v2.80):**"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":29,"id":"5faad753_8ccd9e32","line":83,"range":{"start_line":75,"start_character":0,"end_line":83,"end_character":24},"in_reply_to":"5faad753_8dd36560","updated":"2019-09-14 07:12:52.000000000","message":"Will be fixed by https://review.opendev.org/#/c/682198/","commit_id":"aecfaf5b7e00019cf4f9455d60eb7376ea49af10"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":5709,"context_line":"  type: string"},{"line_number":5710,"context_line":"project_id_query_migrations:"},{"line_number":5711,"context_line":"  description: |"},{"line_number":5712,"context_line":"    The UUID of the project that this server belongs to."},{"line_number":5713,"context_line":"  in: body"},{"line_number":5714,"context_line":"  required: false"},{"line_number":5715,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5faad753_1535bbda","line":5712,"range":{"start_line":5712,"start_character":4,"end_line":5712,"end_character":56},"updated":"2019-09-09 05:43:25.000000000","message":"Filter the migrations by the given project ID?","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":5709,"context_line":"  type: string"},{"line_number":5710,"context_line":"project_id_query_migrations:"},{"line_number":5711,"context_line":"  description: |"},{"line_number":5712,"context_line":"    The UUID of the project that this server belongs to."},{"line_number":5713,"context_line":"  in: body"},{"line_number":5714,"context_line":"  required: false"},{"line_number":5715,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5faad753_95ff6b66","line":5712,"range":{"start_line":5712,"start_character":4,"end_line":5712,"end_character":56},"in_reply_to":"5faad753_1535bbda","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":5710,"context_line":"project_id_query_migrations:"},{"line_number":5711,"context_line":"  description: |"},{"line_number":5712,"context_line":"    The UUID of the project that this server belongs to."},{"line_number":5713,"context_line":"  in: body"},{"line_number":5714,"context_line":"  required: false"},{"line_number":5715,"context_line":"  type: string"},{"line_number":5716,"context_line":"  min_version: 2.80"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5faad753_f52c9f9a","line":5713,"range":{"start_line":5713,"start_character":6,"end_line":5713,"end_character":10},"updated":"2019-09-09 05:43:25.000000000","message":"query","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":5710,"context_line":"project_id_query_migrations:"},{"line_number":5711,"context_line":"  description: |"},{"line_number":5712,"context_line":"    The UUID of the project that this server belongs to."},{"line_number":5713,"context_line":"  in: body"},{"line_number":5714,"context_line":"  required: false"},{"line_number":5715,"context_line":"  type: string"},{"line_number":5716,"context_line":"  min_version: 2.80"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5faad753_b504e77c","line":5713,"range":{"start_line":5713,"start_character":6,"end_line":5713,"end_character":10},"in_reply_to":"5faad753_f52c9f9a","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":5726,"context_line":"  in: body"},{"line_number":5727,"context_line":"  required: true"},{"line_number":5728,"context_line":"  type: string"},{"line_number":5729,"context_line":"project_id_server_action_2_80:"},{"line_number":5730,"context_line":"  description: |"},{"line_number":5731,"context_line":"    The ID of the project which initiated the server action."},{"line_number":5732,"context_line":"  in: body"},{"line_number":5733,"context_line":"  required: true"},{"line_number":5734,"context_line":"  type: string"},{"line_number":5735,"context_line":"  min_version: 2.80"},{"line_number":5736,"context_line":"project_id_server_group:"},{"line_number":5737,"context_line":"  description: |"},{"line_number":5738,"context_line":"    The project ID who owns the server group."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_446d9502","line":5735,"range":{"start_line":5729,"start_character":0,"end_line":5735,"end_character":19},"updated":"2019-09-10 22:55:25.000000000","message":"There shouldn\u0027t be anything added having to do with server actions. This is also a duplicate of post_id_server_action except it requires microversion 2.80? I don\u0027t understand this.\n\nShouldn\u0027t this be something like: \"The ID of the project which initiated the server migration.\" ?","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":5726,"context_line":"  in: body"},{"line_number":5727,"context_line":"  required: true"},{"line_number":5728,"context_line":"  type: string"},{"line_number":5729,"context_line":"project_id_server_action_2_80:"},{"line_number":5730,"context_line":"  description: |"},{"line_number":5731,"context_line":"    The ID of the project which initiated the server action."},{"line_number":5732,"context_line":"  in: body"},{"line_number":5733,"context_line":"  required: true"},{"line_number":5734,"context_line":"  type: string"},{"line_number":5735,"context_line":"  min_version: 2.80"},{"line_number":5736,"context_line":"project_id_server_group:"},{"line_number":5737,"context_line":"  description: |"},{"line_number":5738,"context_line":"    The project ID who owns the server group."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_130e0132","line":5735,"range":{"start_line":5729,"start_character":0,"end_line":5735,"end_character":19},"in_reply_to":"5faad753_446d9502","updated":"2019-09-11 07:12:30.000000000","message":"Yeah, migration is suitable than action, my error.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":7137,"context_line":"  in: body"},{"line_number":7138,"context_line":"  required: true"},{"line_number":7139,"context_line":"  type: string"},{"line_number":7140,"context_line":"user_id_server_action_2_80:"},{"line_number":7141,"context_line":"  description: |"},{"line_number":7142,"context_line":"    The ID of the user which initiated the server action."},{"line_number":7143,"context_line":"  in: body"},{"line_number":7144,"context_line":"  required: true"},{"line_number":7145,"context_line":"  type: string"},{"line_number":7146,"context_line":"  min_version: 2.80"},{"line_number":7147,"context_line":"user_id_server_group:"},{"line_number":7148,"context_line":"  description: |"},{"line_number":7149,"context_line":"    The user ID who owns the server group."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_6470d1dd","line":7146,"range":{"start_line":7140,"start_character":0,"end_line":7146,"end_character":19},"updated":"2019-09-10 22:55:25.000000000","message":"Same.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":7137,"context_line":"  in: body"},{"line_number":7138,"context_line":"  required: true"},{"line_number":7139,"context_line":"  type: string"},{"line_number":7140,"context_line":"user_id_server_action_2_80:"},{"line_number":7141,"context_line":"  description: |"},{"line_number":7142,"context_line":"    The ID of the user which initiated the server action."},{"line_number":7143,"context_line":"  in: body"},{"line_number":7144,"context_line":"  required: true"},{"line_number":7145,"context_line":"  type: string"},{"line_number":7146,"context_line":"  min_version: 2.80"},{"line_number":7147,"context_line":"user_id_server_group:"},{"line_number":7148,"context_line":"  description: |"},{"line_number":7149,"context_line":"    The user ID who owns the server group."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_b335addc","line":7146,"range":{"start_line":7140,"start_character":0,"end_line":7146,"end_character":19},"in_reply_to":"5faad753_6470d1dd","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6c8a64e1250baa755447bfcf0adb44fd4bcf8999","unresolved":false,"context_lines":[{"line_number":1419,"context_line":"user_id_query_migrations:"},{"line_number":1420,"context_line":"  description: |"},{"line_number":1421,"context_line":"    Filter the migrations by the given user ID."},{"line_number":1422,"context_line":""},{"line_number":1423,"context_line":"    This parameter is only valid when specified by administrators."},{"line_number":1424,"context_line":"    If non-admin users specify this parameter, a 403 error is returned."},{"line_number":1425,"context_line":"  in: query"},{"line_number":1426,"context_line":"  required: false"},{"line_number":1427,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"5faad753_541d28bb","line":1424,"range":{"start_line":1422,"start_character":0,"end_line":1424,"end_character":71},"updated":"2019-09-12 00:56:33.000000000","message":"Sorry I didn\u0027t notice this last time, but I\u0027m not sure whether this sentence is helpful, considering that the API access is controlled by policy. If you can access the API, you can access the query parameter, right?\n\nIf we did want to keep this sentence (I tend to think don\u0027t keep it), then the other project_id_query_migrations should have the same sentence to match, at least.","commit_id":"9e050b8cb14bed5350b9d50a0c4489ef119aa56e"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d3a3578be7d7e60fae8432f5d79732f03d9a4193","unresolved":false,"context_lines":[{"line_number":1419,"context_line":"user_id_query_migrations:"},{"line_number":1420,"context_line":"  description: |"},{"line_number":1421,"context_line":"    Filter the migrations by the given user ID."},{"line_number":1422,"context_line":""},{"line_number":1423,"context_line":"    This parameter is only valid when specified by administrators."},{"line_number":1424,"context_line":"    If non-admin users specify this parameter, a 403 error is returned."},{"line_number":1425,"context_line":"  in: query"},{"line_number":1426,"context_line":"  required: false"},{"line_number":1427,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"5faad753_7ccb6671","line":1424,"range":{"start_line":1422,"start_character":0,"end_line":1424,"end_character":71},"in_reply_to":"5faad753_541d28bb","updated":"2019-09-12 07:03:11.000000000","message":"Yeah, need to be unified user_id and project_id.\nAs an user, I think keep this sentence in is friendly, so I keep this, if remove it I also agree.","commit_id":"9e050b8cb14bed5350b9d50a0c4489ef119aa56e"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dd6bcb2021e1699c3f2d0082152e9688ee07c398","unresolved":false,"context_lines":[{"line_number":1419,"context_line":"user_id_query_migrations:"},{"line_number":1420,"context_line":"  description: |"},{"line_number":1421,"context_line":"    Filter the migrations by the given user ID."},{"line_number":1422,"context_line":""},{"line_number":1423,"context_line":"    This parameter is only valid when specified by administrators."},{"line_number":1424,"context_line":"    If non-admin users specify this parameter, a 403 error is returned."},{"line_number":1425,"context_line":"  in: query"},{"line_number":1426,"context_line":"  required: false"},{"line_number":1427,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"5faad753_9cb2e2e5","line":1424,"range":{"start_line":1422,"start_character":0,"end_line":1424,"end_character":71},"in_reply_to":"5faad753_7ccb6671","updated":"2019-09-12 07:07:51.000000000","message":"https://docs.openstack.org/api-ref/compute/?expanded\u003dshow-a-detail-of-a-volume-attachment-detail,migrate-server-migrate-action-detail,live-migrate-server-os-migratelive-action-detail,list-migrations-detail#list-migrations\n\n\u003e Policy defaults enable only users with the administrative \n\u003e role to perform this operation. Cloud providers can change \n\u003e these permissions through the policy.json file.\n\nIn api docs descripted this, it\u0027s duplicate. So removed this sentence.","commit_id":"9e050b8cb14bed5350b9d50a0c4489ef119aa56e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":5713,"context_line":"  type: string"},{"line_number":5714,"context_line":"project_id_migration_2_80:"},{"line_number":5715,"context_line":"  description: |"},{"line_number":5716,"context_line":"    The ID of the project which initiated the server migration."},{"line_number":5717,"context_line":"  in: body"},{"line_number":5718,"context_line":"  required: true"},{"line_number":5719,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_32b973cb","line":5716,"updated":"2019-10-10 19:22:16.000000000","message":"For existing migrations created before Train, the value could be ``null`` correct? If so, we should probably say something to that effect, e.g. \"The ID of the project which initiated the server migration. The value may be ``null`` for older migration records.\"","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":5713,"context_line":"  type: string"},{"line_number":5714,"context_line":"project_id_migration_2_80:"},{"line_number":5715,"context_line":"  description: |"},{"line_number":5716,"context_line":"    The ID of the project which initiated the server migration."},{"line_number":5717,"context_line":"  in: body"},{"line_number":5718,"context_line":"  required: true"},{"line_number":5719,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_872ee440","line":5716,"in_reply_to":"3fa7e38b_32b973cb","updated":"2019-10-11 04:39:11.000000000","message":"Yeah, it\u0027s ok.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":7130,"context_line":"  type: string"},{"line_number":7131,"context_line":"user_id_migration_2_80:"},{"line_number":7132,"context_line":"  description: |"},{"line_number":7133,"context_line":"    The ID of the user which initiated the server migration."},{"line_number":7134,"context_line":"  in: body"},{"line_number":7135,"context_line":"  required: true"},{"line_number":7136,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_b2cc836a","line":7133,"updated":"2019-10-10 19:22:16.000000000","message":"Same as above about null values.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":7130,"context_line":"  type: string"},{"line_number":7131,"context_line":"user_id_migration_2_80:"},{"line_number":7132,"context_line":"  description: |"},{"line_number":7133,"context_line":"    The ID of the user which initiated the server migration."},{"line_number":7134,"context_line":"  in: body"},{"line_number":7135,"context_line":"  required: true"},{"line_number":7136,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_a733e0aa","line":7133,"in_reply_to":"3fa7e38b_b2cc836a","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"api-ref/source/server-migrations.inc":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":53,"context_line":"  - status: migrate_status"},{"line_number":54,"context_line":"  - updated_at: updated"},{"line_number":55,"context_line":"  - uuid: migration_uuid"},{"line_number":56,"context_line":"  - user_id: user_id_query_migrations"},{"line_number":57,"context_line":"  - project_id: project_id_query_migrations"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"**Example List Migrations (2.59)**"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":23,"id":"5faad753_5569f3bb","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":43},"updated":"2019-09-09 05:43:25.000000000","message":"These are not query parameters but body parameters.","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":53,"context_line":"  - status: migrate_status"},{"line_number":54,"context_line":"  - updated_at: updated"},{"line_number":55,"context_line":"  - uuid: migration_uuid"},{"line_number":56,"context_line":"  - user_id: user_id_query_migrations"},{"line_number":57,"context_line":"  - project_id: project_id_query_migrations"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"**Example List Migrations (2.59)**"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":23,"id":"5faad753_95b76b87","line":57,"range":{"start_line":56,"start_character":0,"end_line":57,"end_character":43},"in_reply_to":"5faad753_5569f3bb","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":114,"context_line":"  - status: migrate_status"},{"line_number":115,"context_line":"  - updated_at: updated"},{"line_number":116,"context_line":"  - uuid: migration_uuid"},{"line_number":117,"context_line":"  - user_id: user_id_query_migrations"},{"line_number":118,"context_line":"  - project_id: project_id_query_migrations"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"**Example Show Migration Details (2.59)**"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":23,"id":"5faad753_75666ff0","line":118,"range":{"start_line":117,"start_character":0,"end_line":118,"end_character":43},"updated":"2019-09-09 05:43:25.000000000","message":"ditto","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":114,"context_line":"  - status: migrate_status"},{"line_number":115,"context_line":"  - updated_at: updated"},{"line_number":116,"context_line":"  - uuid: migration_uuid"},{"line_number":117,"context_line":"  - user_id: user_id_query_migrations"},{"line_number":118,"context_line":"  - project_id: project_id_query_migrations"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"**Example Show Migration Details (2.59)**"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":23,"id":"5faad753_b5bce769","line":118,"range":{"start_line":117,"start_character":0,"end_line":118,"end_character":43},"in_reply_to":"5faad753_75666ff0","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0cc3203e2e480270205296fc57ebc89b04ff3d47","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  - user_id: user_id_migration_2_80"},{"line_number":57,"context_line":"  - project_id: project_id_migration_2_80"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"**Example List Migrations (2.59)**"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":".. literalinclude:: ../../doc/api_samples/server-migrations/v2.59/migrations-index.json"},{"line_number":62,"context_line":"   :language: javascript"}],"source_content_type":"text/x-c++src","patch_set":29,"id":"5faad753_2dc4b190","line":59,"updated":"2019-09-13 21:32:16.000000000","message":"Similarly I wonder if we should just change this to the earliest supported microversion for this API. Could be done in a follow up.","commit_id":"aecfaf5b7e00019cf4f9455d60eb7376ea49af10"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"1938ed8c9f55a5142ca8af1095911d2f30ba4037","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  - user_id: user_id_migration_2_80"},{"line_number":57,"context_line":"  - project_id: project_id_migration_2_80"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"**Example List Migrations (2.59)**"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":".. literalinclude:: ../../doc/api_samples/server-migrations/v2.59/migrations-index.json"},{"line_number":62,"context_line":"   :language: javascript"}],"source_content_type":"text/x-c++src","patch_set":29,"id":"5faad753_6cc86221","line":59,"in_reply_to":"5faad753_2dc4b190","updated":"2019-09-14 07:12:52.000000000","message":"Will be fixed by https://review.opendev.org/#/c/682198/","commit_id":"aecfaf5b7e00019cf4f9455d60eb7376ea49af10"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0cc3203e2e480270205296fc57ebc89b04ff3d47","unresolved":false,"context_lines":[{"line_number":117,"context_line":"  - user_id: user_id_migration_2_80"},{"line_number":118,"context_line":"  - project_id: project_id_migration_2_80"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"**Example Show Migration Details (2.59)**"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":".. literalinclude:: ../../doc/api_samples/server-migrations/v2.59/migrations-get.json"},{"line_number":123,"context_line":"   :language: javascript"}],"source_content_type":"text/x-c++src","patch_set":29,"id":"5faad753_cdbcfd07","line":120,"updated":"2019-09-13 21:32:16.000000000","message":"same","commit_id":"aecfaf5b7e00019cf4f9455d60eb7376ea49af10"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"1938ed8c9f55a5142ca8af1095911d2f30ba4037","unresolved":false,"context_lines":[{"line_number":117,"context_line":"  - user_id: user_id_migration_2_80"},{"line_number":118,"context_line":"  - project_id: project_id_migration_2_80"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"**Example Show Migration Details (2.59)**"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":".. literalinclude:: ../../doc/api_samples/server-migrations/v2.59/migrations-get.json"},{"line_number":123,"context_line":"   :language: javascript"}],"source_content_type":"text/x-c++src","patch_set":29,"id":"5faad753_ec28d2e2","line":120,"in_reply_to":"5faad753_cdbcfd07","updated":"2019-09-14 07:12:52.000000000","message":"Done","commit_id":"aecfaf5b7e00019cf4f9455d60eb7376ea49af10"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":".. rest_parameters:: parameters.yaml"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"  - server_id: server_id_path"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Response"},{"line_number":34,"context_line":"--------"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"3fa7e38b_122a372b","line":31,"updated":"2019-10-10 19:22:16.000000000","message":"I just realized we don\u0027t have any query/filter parameters on this API like we have for GET /os-migrations. I\u0027m not sure why that is. Maybe because this is much more selective in that it\u0027s only in-progress live migrations?\n\nIn fact we don\u0027t even have schema validation on this API:\n\nhttps://github.com/openstack/nova/blob/27818dd607936209d8d73f534d64ba74fb2dd7f0/nova/api/openstack/compute/server_migrations.py#L91\n\nSo I could do:\n\n  GET /servers/{server_id}/migrations?dest_compute\u003dfake-host\n\nAnd it just silently ignores the filter parameters. That\u0027s not really a bug, but something to consider if we ever add filtering support to this API.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d5d062e1a87803ea95e58f4d1b12c47849adb299","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":".. rest_parameters:: parameters.yaml"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"  - server_id: server_id_path"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Response"},{"line_number":34,"context_line":"--------"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"3fa7e38b_abcdcd66","line":31,"in_reply_to":"3fa7e38b_07d0b41e","updated":"2019-10-14 13:33:07.000000000","message":"I don\u0027t think it\u0027s a big deal, it\u0027s just something I noticed. This API already does some filtering (in-progress live migrations only). We don\u0027t need to generate work to add filters to this API unless someone really has a need, but you could also do the same filtering already with the GET /os-migrations API so it\u0027s probably not worth adding more filters to this API.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":".. rest_parameters:: parameters.yaml"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"  - server_id: server_id_path"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Response"},{"line_number":34,"context_line":"--------"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"3fa7e38b_07d0b41e","line":31,"in_reply_to":"3fa7e38b_122a372b","updated":"2019-10-11 04:39:11.000000000","message":"Yes, this is a question worth considering. I will investigate this issue in depth later and give a reasonable explanation or fix.\n\nAdding to my work-plan.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"63068ca1ed9d3703daf8c459a97b027de7b542d9","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":".. rest_parameters:: parameters.yaml"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"  - server_id: server_id_path"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Response"},{"line_number":34,"context_line":"--------"}],"source_content_type":"text/x-c++src","patch_set":30,"id":"3fa7e38b_918594af","line":31,"in_reply_to":"3fa7e38b_abcdcd66","updated":"2019-10-15 00:03:37.000000000","message":"Got it.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/api/openstack/api_version_request.py":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"4b3659d229211d33efd3a3bd3764512de3154ff7","unresolved":false,"context_lines":[{"line_number":201,"context_line":"# Note(cyeoh): This only applies for the v2.1 API once microversions"},{"line_number":202,"context_line":"# support is fully merged. It does not affect the V2 API."},{"line_number":203,"context_line":"_MIN_API_VERSION \u003d \"2.1\""},{"line_number":204,"context_line":"_MAX_API_VERSION \u003d \"2.76\""},{"line_number":205,"context_line":"DEFAULT_API_VERSION \u003d _MIN_API_VERSION"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"# Almost all proxy APIs which are related to network, images and baremetal"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_2942223f","line":204,"updated":"2019-08-06 06:29:13.000000000","message":"not sure why 2.75 is skiped?if we have 2.75 but forget to dump, at least, add some note on it?","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"901d58835dfa2b3872fddded77786796de97683c","unresolved":false,"context_lines":[{"line_number":201,"context_line":"# Note(cyeoh): This only applies for the v2.1 API once microversions"},{"line_number":202,"context_line":"# support is fully merged. It does not affect the V2 API."},{"line_number":203,"context_line":"_MIN_API_VERSION \u003d \"2.1\""},{"line_number":204,"context_line":"_MAX_API_VERSION \u003d \"2.76\""},{"line_number":205,"context_line":"DEFAULT_API_VERSION \u003d _MIN_API_VERSION"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"# Almost all proxy APIs which are related to network, images and baremetal"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_ac4e206c","line":204,"in_reply_to":"7faddb67_2942223f","updated":"2019-08-06 09:38:00.000000000","message":"In the nova-runway, there are so many patch need to review, this patch impossible to use 2.75, in order to reduce the number of changes due to conflicts, here choose to use 2.76.","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"83d9bd83cd37b02022ba09bebae17e5d826cbe3d","unresolved":false,"context_lines":[{"line_number":201,"context_line":"# Note(cyeoh): This only applies for the v2.1 API once microversions"},{"line_number":202,"context_line":"# support is fully merged. It does not affect the V2 API."},{"line_number":203,"context_line":"_MIN_API_VERSION \u003d \"2.1\""},{"line_number":204,"context_line":"_MAX_API_VERSION \u003d \"2.76\""},{"line_number":205,"context_line":"DEFAULT_API_VERSION \u003d _MIN_API_VERSION"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"# Almost all proxy APIs which are related to network, images and baremetal"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_b66426ba","line":204,"updated":"2019-08-06 15:06:37.000000000","message":"Clearly this is a WIP change since you have bypassed 2.75, presumably because you don\u0027t want to conflict with https://review.opendev.org/#/c/663851/ but you\u0027re already in conflict if that change merges first. Why not rebase the series on top of that change if you want to keep them in order?","commit_id":"912d0f3d871c40ebc637e6198fc28874528f24c8"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":215,"context_line":"             migrations record, and support for filtering migrations by"},{"line_number":216,"context_line":"             these optional parameters in ``GET /os-migrations`` APIs."},{"line_number":217,"context_line":"             Another change is adds ``user_id`` and ``project_id`` to"},{"line_number":218,"context_line":"             index/show API for server migrations."},{"line_number":219,"context_line":"\"\"\""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_15b85b28","line":218,"range":{"start_line":218,"start_character":11,"end_line":218,"end_character":12},"updated":"2019-09-09 05:43:25.000000000","message":"the responses of","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":215,"context_line":"             migrations record, and support for filtering migrations by"},{"line_number":216,"context_line":"             these optional parameters in ``GET /os-migrations`` APIs."},{"line_number":217,"context_line":"             Another change is adds ``user_id`` and ``project_id`` to"},{"line_number":218,"context_line":"             index/show API for server migrations."},{"line_number":219,"context_line":"\"\"\""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_956c4b09","line":218,"range":{"start_line":218,"start_character":11,"end_line":218,"end_character":12},"in_reply_to":"5faad753_15b85b28","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":215,"context_line":"             migrations record, and support for filtering migrations by"},{"line_number":216,"context_line":"             these optional parameters in ``GET /os-migrations`` APIs."},{"line_number":217,"context_line":"             Another change is adds ``user_id`` and ``project_id`` to"},{"line_number":218,"context_line":"             the response of index/show API for server migrations."},{"line_number":219,"context_line":"\"\"\""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_07131f5e","line":218,"updated":"2019-09-10 22:55:25.000000000","message":"This is confusing IMHO because it makes it sound like the user_id and project_id are optional in the migrations record or that they won\u0027t always be returned in the response. The optional part is whether the user will specify user_id and/or project_id.\n\nMaybe something more like:\n\n\"Adds support for optional query parameters ``user_id`` and ``project_id` to the ``GET /os-migrations`` API and exposes ``user_id`` and ``project_id`` via the response from\n``GET /os-migrations``,\n``GET /servers/{server_id}/migrations``, and\n``GET /servers/{server_id}/migrations/{migration_id}``\"","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":215,"context_line":"             migrations record, and support for filtering migrations by"},{"line_number":216,"context_line":"             these optional parameters in ``GET /os-migrations`` APIs."},{"line_number":217,"context_line":"             Another change is adds ``user_id`` and ``project_id`` to"},{"line_number":218,"context_line":"             the response of index/show API for server migrations."},{"line_number":219,"context_line":"\"\"\""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_d345c944","line":218,"in_reply_to":"5faad753_07131f5e","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"}],"nova/api/openstack/compute/migrations.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5928c047ead6c5d554d4442bb5dbf2773d0eae7e","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @wsgi.Controller.api_version(\"2.77\")  # noqa"},{"line_number":186,"context_line":"    @wsgi.expected_errors(400)"},{"line_number":187,"context_line":"    @validation.query_schema(schema_migrations.list_query_params_v277,"},{"line_number":188,"context_line":"                             \"2.77\")"},{"line_number":189,"context_line":"    def index(self, req):"},{"line_number":190,"context_line":"        \"\"\"Return all migrations using the query parameters as filters.\"\"\""},{"line_number":191,"context_line":"        limit, marker \u003d common.get_limit_and_marker(req)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_572225a5","line":188,"range":{"start_line":187,"start_character":3,"end_line":188,"end_character":36},"updated":"2019-08-28 04:34:39.000000000","message":"you should be able to add two \"@validation.query_schema\" decorator to single index method.","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"84e6dd941c81bb420fd12cce14184f392dc30546","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @wsgi.Controller.api_version(\"2.77\")  # noqa"},{"line_number":186,"context_line":"    @wsgi.expected_errors(400)"},{"line_number":187,"context_line":"    @validation.query_schema(schema_migrations.list_query_params_v277,"},{"line_number":188,"context_line":"                             \"2.77\")"},{"line_number":189,"context_line":"    def index(self, req):"},{"line_number":190,"context_line":"        \"\"\"Return all migrations using the query parameters as filters.\"\"\""},{"line_number":191,"context_line":"        limit, marker \u003d common.get_limit_and_marker(req)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_389995cf","line":188,"range":{"start_line":187,"start_character":3,"end_line":188,"end_character":36},"in_reply_to":"7faddb67_572225a5","updated":"2019-08-28 12:36:45.000000000","message":"Done","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"202ec0daecfeda82a227c36612798dc3558a7e3e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            if \u0027memory_total\u0027 in obj:"},{"line_number":64,"context_line":"                for key in detail_keys:"},{"line_number":65,"context_line":"                    del obj[key]"},{"line_number":66,"context_line":"            support_v280 \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":67,"context_line":"            if not support_v280:"},{"line_number":68,"context_line":"                if \u0027user_id\u0027 in obj:"},{"line_number":69,"context_line":"                    del obj[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_7d2b84ea","line":66,"updated":"2019-09-11 01:45:28.000000000","message":"Do this outside the loop, or better yet do like the other microversions and pass in a kwarg that says if you should add_user_project and default to False.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            if \u0027memory_total\u0027 in obj:"},{"line_number":64,"context_line":"                for key in detail_keys:"},{"line_number":65,"context_line":"                    del obj[key]"},{"line_number":66,"context_line":"            support_v280 \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":67,"context_line":"            if not support_v280:"},{"line_number":68,"context_line":"                if \u0027user_id\u0027 in obj:"},{"line_number":69,"context_line":"                    del obj[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_0e233407","line":66,"in_reply_to":"5faad753_7d2b84ea","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"}],"nova/api/openstack/compute/rest_api_version_history.rst":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":1037,"context_line":""},{"line_number":1038,"context_line":"Expose the ``user_id`` and ``project_id`` fields in the following APIs:"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"* GET /os-migrations"},{"line_number":1041,"context_line":"* GET /servers/{server_id}/migrations"},{"line_number":1042,"context_line":"* GET /servers/{server_id}/migrations/{migration_id}"},{"line_number":1043,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"5faad753_5597b391","line":1040,"range":{"start_line":1040,"start_character":2,"end_line":1040,"end_character":20},"updated":"2019-09-09 05:43:25.000000000","message":"``GET /os-migrations``","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":1037,"context_line":""},{"line_number":1038,"context_line":"Expose the ``user_id`` and ``project_id`` fields in the following APIs:"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"* GET /os-migrations"},{"line_number":1041,"context_line":"* GET /servers/{server_id}/migrations"},{"line_number":1042,"context_line":"* GET /servers/{server_id}/migrations/{migration_id}"},{"line_number":1043,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"5faad753_7573cfe8","line":1040,"range":{"start_line":1040,"start_character":2,"end_line":1040,"end_character":20},"in_reply_to":"5faad753_5597b391","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"2.80"},{"line_number":1031,"context_line":"----"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"Microversion 2.80 adds optional parameters ``user_id`` and ``project_id``"},{"line_number":1034,"context_line":"to the os-migrations API. When creating a Migration record, store the"},{"line_number":1035,"context_line":"``user_id`` and ``project_id`` from the request context, similar to an"},{"line_number":1036,"context_line":"InstanceAction record."}],"source_content_type":"text/x-rst","patch_set":25,"id":"5faad753_47f3570b","line":1033,"range":{"start_line":1033,"start_character":32,"end_line":1033,"end_character":42},"updated":"2019-09-10 22:55:25.000000000","message":"query parameters","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"2.80"},{"line_number":1031,"context_line":"----"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"Microversion 2.80 adds optional parameters ``user_id`` and ``project_id``"},{"line_number":1034,"context_line":"to the os-migrations API. When creating a Migration record, store the"},{"line_number":1035,"context_line":"``user_id`` and ``project_id`` from the request context, similar to an"},{"line_number":1036,"context_line":"InstanceAction record."}],"source_content_type":"text/x-rst","patch_set":25,"id":"5faad753_3370dda5","line":1033,"range":{"start_line":1033,"start_character":32,"end_line":1033,"end_character":42},"in_reply_to":"5faad753_47f3570b","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"202ec0daecfeda82a227c36612798dc3558a7e3e","unresolved":false,"context_lines":[{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"The ``GET /os-migrations`` API will also have optional ``user_id`` and"},{"line_number":1045,"context_line":"``project_id`` query parameters for filtering migrations by user and/or"},{"line_number":1046,"context_line":"project:"},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"* ``GET /os-migrations?user_id\u003def9d34b4-45d0-4530-871b-3fb535988394``"},{"line_number":1049,"context_line":"* ``GET /os-migrations?project_id\u003d011ee9f4-8f16-4c38-8633-a254d420fd54``"}],"source_content_type":"text/x-rst","patch_set":25,"id":"5faad753_5d38083c","line":1046,"range":{"start_line":1046,"start_character":7,"end_line":1046,"end_character":8},"updated":"2019-09-11 01:45:28.000000000","message":", for example:","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"The ``GET /os-migrations`` API will also have optional ``user_id`` and"},{"line_number":1045,"context_line":"``project_id`` query parameters for filtering migrations by user and/or"},{"line_number":1046,"context_line":"project:"},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"* ``GET /os-migrations?user_id\u003def9d34b4-45d0-4530-871b-3fb535988394``"},{"line_number":1049,"context_line":"* ``GET /os-migrations?project_id\u003d011ee9f4-8f16-4c38-8633-a254d420fd54``"}],"source_content_type":"text/x-rst","patch_set":25,"id":"5faad753_537319b2","line":1046,"range":{"start_line":1046,"start_character":7,"end_line":1046,"end_character":8},"in_reply_to":"5faad753_5d38083c","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"2.80"},{"line_number":1034,"context_line":"----"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"Microversion 2.80 adds optional query parameters ``user_id`` and"},{"line_number":1037,"context_line":"``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":1038,"context_line":"store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":1039,"context_line":"to an InstanceAction record."}],"source_content_type":"text/x-rst","patch_set":30,"id":"3fa7e38b_f2e3dbd6","line":1036,"updated":"2019-10-10 19:22:16.000000000","message":"You mention this below in greater detail so I\u0027d probably just remove this sentence since it\u0027s redundant below.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"2.80"},{"line_number":1034,"context_line":"----"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"Microversion 2.80 adds optional query parameters ``user_id`` and"},{"line_number":1037,"context_line":"``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":1038,"context_line":"store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":1039,"context_line":"to an InstanceAction record."}],"source_content_type":"text/x-rst","patch_set":30,"id":"3fa7e38b_27ce105a","line":1036,"in_reply_to":"3fa7e38b_f2e3dbd6","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"----"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"Microversion 2.80 adds optional query parameters ``user_id`` and"},{"line_number":1037,"context_line":"``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":1038,"context_line":"store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":1039,"context_line":"to an InstanceAction record."},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"Expose the ``user_id`` and ``project_id`` fields in the following APIs:"},{"line_number":1042,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"3fa7e38b_129b1766","line":1039,"range":{"start_line":1037,"start_character":41,"end_line":1039,"end_character":28},"updated":"2019-10-10 19:22:16.000000000","message":"This isn\u0027t really relevant to user-facing docs. This is how the user_id/project_id are tracked internally but it is applied for all microversions when performing a move type operation, not just 2.80+.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"----"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"Microversion 2.80 adds optional query parameters ``user_id`` and"},{"line_number":1037,"context_line":"``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":1038,"context_line":"store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":1039,"context_line":"to an InstanceAction record."},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"Expose the ``user_id`` and ``project_id`` fields in the following APIs:"},{"line_number":1042,"context_line":""}],"source_content_type":"text/x-rst","patch_set":30,"id":"3fa7e38b_4780ecf7","line":1039,"range":{"start_line":1037,"start_character":41,"end_line":1039,"end_character":28},"in_reply_to":"3fa7e38b_129b1766","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/api/openstack/compute/schemas/migrations.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":52,"context_line":"list_query_params_v280[\u0027properties\u0027].update({"},{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.common_query_param,"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.common_query_param,"},{"line_number":57,"context_line":"})"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_f5ed7f25","line":55,"range":{"start_line":55,"start_character":31,"end_line":55,"end_character":49},"updated":"2019-09-09 05:43:25.000000000","message":"Why isn\u0027t \u0027single_param\u0027 used?","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":52,"context_line":"list_query_params_v280[\u0027properties\u0027].update({"},{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.common_query_param,"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.common_query_param,"},{"line_number":57,"context_line":"})"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_354c77c6","line":55,"range":{"start_line":55,"start_character":31,"end_line":55,"end_character":49},"in_reply_to":"5faad753_f5ed7f25","updated":"2019-09-09 06:42:42.000000000","message":"Yeah, if multiple same query params (e.g. ?user_id\u003dusera\u0026user_id\u003duserb) are not allowed.\nReplace with:\nlist_query_params_v280[\u0027properties\u0027].update({\n    # The 2.80 microversion added support filtering migrations\n    # by user_id and/or project_id\n    \u0027user_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),\n    \u0027project_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),\n})","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.common_query_param,"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.common_query_param,"},{"line_number":57,"context_line":"})"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_95f20b06","line":56,"range":{"start_line":56,"start_character":34,"end_line":56,"end_character":52},"updated":"2019-09-09 05:43:25.000000000","message":"ditto","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.common_query_param,"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.common_query_param,"},{"line_number":57,"context_line":"})"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_d59403eb","line":56,"range":{"start_line":56,"start_character":34,"end_line":56,"end_character":52},"in_reply_to":"5faad753_95f20b06","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"202ec0daecfeda82a227c36612798dc3558a7e3e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"list_query_params_v280[\u0027properties\u0027].update({"},{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":57,"context_line":"})"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_7d7944fa","line":55,"range":{"start_line":55,"start_character":15,"end_line":55,"end_character":64},"updated":"2019-09-11 01:45:28.000000000","message":"Why wouldn\u0027t we use the same schema as filtering servers by user_id/project_id?\n\n\u0027user_id\u0027: parameter_types.common_query_param,\n\u0027project_id\u0027: parameter_types.common_query_param,","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":52,"context_line":"list_query_params_v280[\u0027properties\u0027].update({"},{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":57,"context_line":"})"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_09e24e02","line":55,"range":{"start_line":55,"start_character":15,"end_line":55,"end_character":64},"in_reply_to":"5faad753_7d7944fa","updated":"2019-09-11 07:12:30.000000000","message":"takashin suggest change this to the \u0027single_param\u0027 in PS23 https://review.opendev.org/#/c/674243/23/nova/api/openstack/compute/schemas/migrations.py@55.\n\n\nAnd we were talked on irc (in #openstack-nova channel):\n\n\u003cbrinzhang\u003e takashin:https://review.opendev.org/#/c/674243/23/nova/api/openstack/compute/schemas/migrations.py@55\n\u003cbrinzhang\u003e takashin: I am using the same as query_params_v21 used here [1], they do the same thing, need to be defined again? .\n\u003cbrinzhang\u003e [1]https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/servers.py#L570-L571\n\u003cbrinzhang\u003e takashin: should I replaced this with single_sample({\u0027type\u0027: \u0027string\u0027})\n\u003ctakashin\u003e brinzhang: If multiple same query params (e.g. ?user_id\u003dusera\u0026user_id\u003duserb) are not allowed, single_param should be used.\n\u003cbrinzhang\u003e takashin: Yeah, got it, will be replace it with single_param, thanks.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"list_query_params_v280 \u003d copy.deepcopy(list_query_params_v266)"},{"line_number":52,"context_line":"list_query_params_v280[\u0027properties\u0027].update({"},{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_b2d1e3fd","line":53,"range":{"start_line":53,"start_character":42,"end_line":53,"end_character":51},"updated":"2019-10-10 19:22:16.000000000","message":"for filtering","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"list_query_params_v280 \u003d copy.deepcopy(list_query_params_v266)"},{"line_number":52,"context_line":"list_query_params_v280[\u0027properties\u0027].update({"},{"line_number":53,"context_line":"    # The 2.80 microversion added support filtering migrations"},{"line_number":54,"context_line":"    # by user_id and/or project_id"},{"line_number":55,"context_line":"    \u0027user_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"},{"line_number":56,"context_line":"    \u0027project_id\u0027: parameter_types.single_param({\u0027type\u0027: \u0027string\u0027}),"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_c7d61cf3","line":53,"range":{"start_line":53,"start_character":42,"end_line":53,"end_character":51},"in_reply_to":"3fa7e38b_b2d1e3fd","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/api/openstack/compute/server_migrations.py":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"4b3659d229211d33efd3a3bd3764512de3154ff7","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            output(migration, include_uuid, include_operator_info)"},{"line_number":112,"context_line":"            for migration in migrations]}"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @wsgi.Controller.api_version(\"2.23\", \"2.76\")"},{"line_number":115,"context_line":"    @wsgi.expected_errors(404)"},{"line_number":116,"context_line":"    def show(self, req, server_id, id):"},{"line_number":117,"context_line":"        \"\"\"Return the migration of an instance in progress by id.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_c99fceb1","line":114,"range":{"start_line":114,"start_character":39,"end_line":114,"end_character":47},"updated":"2019-08-06 06:29:13.000000000","message":"it seems unused","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"901d58835dfa2b3872fddded77786796de97683c","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            output(migration, include_uuid, include_operator_info)"},{"line_number":112,"context_line":"            for migration in migrations]}"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @wsgi.Controller.api_version(\"2.23\", \"2.76\")"},{"line_number":115,"context_line":"    @wsgi.expected_errors(404)"},{"line_number":116,"context_line":"    def show(self, req, server_id, id):"},{"line_number":117,"context_line":"        \"\"\"Return the migration of an instance in progress by id.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_4c73ece7","line":114,"range":{"start_line":114,"start_character":39,"end_line":114,"end_character":47},"in_reply_to":"7faddb67_c99fceb1","updated":"2019-08-06 09:38:00.000000000","message":"Yes, no need to set its upper limit.","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"4b3659d229211d33efd3a3bd3764512de3154ff7","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.76"},{"line_number":147,"context_line":"        # to record who operator the instance."},{"line_number":148,"context_line":"        include_operator_info \u003d api_version_request.is_supported(req, \u00272.76\u0027)"},{"line_number":149,"context_line":"        return {\u0027migration\u0027: output(migration, include_uuid,"},{"line_number":150,"context_line":"                                    include_operator_info)}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @wsgi.Controller.api_version(\"2.24\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_e9608ad1","line":149,"range":{"start_line":149,"start_character":17,"end_line":149,"end_character":26},"updated":"2019-08-06 06:29:13.000000000","message":"migrations","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"901d58835dfa2b3872fddded77786796de97683c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.76"},{"line_number":147,"context_line":"        # to record who operator the instance."},{"line_number":148,"context_line":"        include_operator_info \u003d api_version_request.is_supported(req, \u00272.76\u0027)"},{"line_number":149,"context_line":"        return {\u0027migration\u0027: output(migration, include_uuid,"},{"line_number":150,"context_line":"                                    include_operator_info)}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @wsgi.Controller.api_version(\"2.24\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_ec1e58b9","line":149,"range":{"start_line":149,"start_character":17,"end_line":149,"end_character":26},"in_reply_to":"7faddb67_e9608ad1","updated":"2019-08-06 09:38:00.000000000","message":"The original value is \u0027migration\u0027 and I also think \u0027migrations\u0027 is more appropriate.","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"ca62ff94799060c962185b2a314e49d47469b788","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.76"},{"line_number":147,"context_line":"        # to record who operator the instance."},{"line_number":148,"context_line":"        include_operator_info \u003d api_version_request.is_supported(req, \u00272.76\u0027)"},{"line_number":149,"context_line":"        return {\u0027migration\u0027: output(migration, include_uuid,"},{"line_number":150,"context_line":"                                    include_operator_info)}"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @wsgi.Controller.api_version(\"2.24\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_767eae6a","line":149,"range":{"start_line":149,"start_character":17,"end_line":149,"end_character":26},"in_reply_to":"7faddb67_ec1e58b9","updated":"2019-08-06 15:05:04.000000000","message":"Move this change to https://review.opendev.org/#/c/674825/","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from nova.policies import servers_migrations as sm_policies"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def output(migration, include_uuid\u003dFalse, include_operator_info\u003dFalse):"},{"line_number":30,"context_line":"    \"\"\"Returns the desired output of the API from an object."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    From a Migrations\u0027s object this method returns the primitive"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_87370fb1","line":29,"range":{"start_line":29,"start_character":42,"end_line":29,"end_character":63},"updated":"2019-09-10 22:55:25.000000000","message":"Would rather this be named something more close to what it is, like include_user_project","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from nova.policies import servers_migrations as sm_policies"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def output(migration, include_uuid\u003dFalse, include_operator_info\u003dFalse):"},{"line_number":30,"context_line":"    \"\"\"Returns the desired output of the API from an object."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    From a Migrations\u0027s object this method returns the primitive"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_739bb5c8","line":29,"range":{"start_line":29,"start_character":42,"end_line":29,"end_character":63},"in_reply_to":"5faad753_3d83ccce","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"202ec0daecfeda82a227c36612798dc3558a7e3e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from nova.policies import servers_migrations as sm_policies"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def output(migration, include_uuid\u003dFalse, include_operator_info\u003dFalse):"},{"line_number":30,"context_line":"    \"\"\"Returns the desired output of the API from an object."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    From a Migrations\u0027s object this method returns the primitive"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_3d83ccce","line":29,"range":{"start_line":29,"start_character":42,"end_line":29,"end_character":63},"in_reply_to":"5faad753_87370fb1","updated":"2019-09-11 01:45:28.000000000","message":"Yeah - not all migrations are operator/admin initiated, e.g. resize.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                context, server_id, \u0027live-migration\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":107,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":108,"context_line":"        # to record who operator the instance."},{"line_number":109,"context_line":"        include_operator_info \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":110,"context_line":"        return {\u0027migrations\u0027: ["},{"line_number":111,"context_line":"            output(migration, include_uuid, include_operator_info)"},{"line_number":112,"context_line":"            for migration in migrations]}"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_6744531c","line":109,"range":{"start_line":107,"start_character":8,"end_line":109,"end_character":29},"updated":"2019-09-10 22:55:25.000000000","message":"Same. This is indicating the user/project who initiated the migration, not necessarily the owner of the instance/operator of the instance. Would rather name this something like include_user_project","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                context, server_id, \u0027live-migration\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":107,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":108,"context_line":"        # to record who operator the instance."},{"line_number":109,"context_line":"        include_operator_info \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":110,"context_line":"        return {\u0027migrations\u0027: ["},{"line_number":111,"context_line":"            output(migration, include_uuid, include_operator_info)"},{"line_number":112,"context_line":"            for migration in migrations]}"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_53a8f9d9","line":109,"range":{"start_line":107,"start_character":8,"end_line":109,"end_character":29},"in_reply_to":"5faad753_6744531c","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":146,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":147,"context_line":"        # to record who operator the instance."},{"line_number":148,"context_line":"        include_operator_info \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":149,"context_line":"        return {\u0027migration\u0027: output(migration, include_uuid,"},{"line_number":150,"context_line":"                                    include_operator_info)}"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_074b1f2b","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":29},"updated":"2019-09-10 22:55:25.000000000","message":"Same.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":146,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":147,"context_line":"        # to record who operator the instance."},{"line_number":148,"context_line":"        include_operator_info \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":149,"context_line":"        return {\u0027migration\u0027: output(migration, include_uuid,"},{"line_number":150,"context_line":"                                    include_operator_info)}"},{"line_number":151,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_b3b84d2a","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":29},"in_reply_to":"5faad753_074b1f2b","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                context, server_id, \u0027live-migration\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":107,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":108,"context_line":"        # to record who operator the instance."},{"line_number":109,"context_line":"        include_user_project \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":110,"context_line":"        return {\u0027migrations\u0027: ["},{"line_number":111,"context_line":"            output(migration, include_uuid, include_user_project)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_3215f39c","line":108,"range":{"start_line":107,"start_character":8,"end_line":108,"end_character":46},"updated":"2019-10-10 19:22:16.000000000","message":"This reads a bit weird here. How about \"Expose the user and project that initiated the migration for microversion 2.80+.\"\n\nBut I\u0027m not even sure a comment is necessary, the code is pretty self-explanatory.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                context, server_id, \u0027live-migration\u0027)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":107,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":108,"context_line":"        # to record who operator the instance."},{"line_number":109,"context_line":"        include_user_project \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":110,"context_line":"        return {\u0027migrations\u0027: ["},{"line_number":111,"context_line":"            output(migration, include_uuid, include_user_project)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_47fc6c71","line":108,"range":{"start_line":107,"start_character":8,"end_line":108,"end_character":46},"in_reply_to":"3fa7e38b_3215f39c","updated":"2019-10-11 04:39:11.000000000","message":"Removed.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            raise exc.HTTPNotFound(explanation\u003dmsg)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":146,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":147,"context_line":"        # to record who operator the instance."},{"line_number":148,"context_line":"        include_user_project \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":149,"context_line":"        return {\u0027migration\u0027: output(migration, include_uuid,"},{"line_number":150,"context_line":"                                    include_user_project)}"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_521aefcb","line":147,"range":{"start_line":146,"start_character":8,"end_line":147,"end_character":46},"updated":"2019-10-10 19:22:16.000000000","message":"same","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            raise exc.HTTPNotFound(explanation\u003dmsg)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        include_uuid \u003d api_version_request.is_supported(req, \u00272.59\u0027)"},{"line_number":146,"context_line":"        # Add user_id and project_id to Migrations in Microversion 2.80"},{"line_number":147,"context_line":"        # to record who operator the instance."},{"line_number":148,"context_line":"        include_user_project \u003d api_version_request.is_supported(req, \u00272.80\u0027)"},{"line_number":149,"context_line":"        return {\u0027migration\u0027: output(migration, include_uuid,"},{"line_number":150,"context_line":"                                    include_user_project)}"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_c7effcae","line":147,"range":{"start_line":146,"start_character":8,"end_line":147,"end_character":46},"in_reply_to":"3fa7e38b_521aefcb","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ca87cac2ef7266800a3a68faa55f34178501d1c","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        migration.source_node \u003d instance.node"},{"line_number":351,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":352,"context_line":"        # \u003e\u003d 1.7, to record the migrations record from the operator."},{"line_number":353,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":354,"context_line":"            migration.user_id \u003d self.context._user_id"},{"line_number":355,"context_line":"        if \u0027project_id\u0027 in migration:"},{"line_number":356,"context_line":"            migration.proejct_id \u003d self.context._project_id"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_db8ddb35","line":353,"updated":"2019-08-28 13:17:17.000000000","message":"Why are you checking if \u0027user_id\u0027 is in migration? If we just instantiated a new instance of the Migration object the user_id field is not going to be set until you set it.","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d90fe2636036681dea762f787b22ce3419a7df2e","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        migration.source_node \u003d instance.node"},{"line_number":351,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":352,"context_line":"        # \u003e\u003d 1.7, to record the migrations record from the operator."},{"line_number":353,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":354,"context_line":"            migration.user_id \u003d self.context._user_id"},{"line_number":355,"context_line":"        if \u0027project_id\u0027 in migration:"},{"line_number":356,"context_line":"            migration.proejct_id \u003d self.context._project_id"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_a38d4636","line":353,"in_reply_to":"7faddb67_db8ddb35","updated":"2019-08-29 07:58:34.000000000","message":"Yeah, it is best to judge user_id and project_id when instantiating the migration resource in [1], which will effectively avoid duplication.\n\n[1]https://github.com/openstack/nova/blob/912a46c9d4d3a8cc63724adff70acf8a4fc34d9b/nova/objects/migration.py#L154","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5928c047ead6c5d554d4442bb5dbf2773d0eae7e","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        migration.instance_uuid \u003d instance.uuid"},{"line_number":349,"context_line":"        migration.source_compute \u003d instance.host"},{"line_number":350,"context_line":"        migration.source_node \u003d instance.node"},{"line_number":351,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":352,"context_line":"        # \u003e\u003d 1.7, to record the migrations record from the operator."},{"line_number":353,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":354,"context_line":"            migration.user_id \u003d self.context._user_id"},{"line_number":355,"context_line":"        if \u0027project_id\u0027 in migration:"},{"line_number":356,"context_line":"            migration.proejct_id \u003d self.context._project_id"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if move_type:"},{"line_number":359,"context_line":"            migration.migration_type \u003d move_type"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_974dfd72","line":356,"range":{"start_line":351,"start_character":8,"end_line":356,"end_character":59},"updated":"2019-08-28 04:34:39.000000000","message":"can we nest this inside migration.save?","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d90fe2636036681dea762f787b22ce3419a7df2e","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        migration.instance_uuid \u003d instance.uuid"},{"line_number":349,"context_line":"        migration.source_compute \u003d instance.host"},{"line_number":350,"context_line":"        migration.source_node \u003d instance.node"},{"line_number":351,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":352,"context_line":"        # \u003e\u003d 1.7, to record the migrations record from the operator."},{"line_number":353,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":354,"context_line":"            migration.user_id \u003d self.context._user_id"},{"line_number":355,"context_line":"        if \u0027project_id\u0027 in migration:"},{"line_number":356,"context_line":"            migration.proejct_id \u003d self.context._project_id"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if move_type:"},{"line_number":359,"context_line":"            migration.migration_type \u003d move_type"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_63974e47","line":356,"range":{"start_line":351,"start_character":8,"end_line":356,"end_character":59},"in_reply_to":"7faddb67_7bc70766","updated":"2019-08-29 07:58:34.000000000","message":"Done","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e98eae4b3cb46b22ba132d275ffaf59e948785e1","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        migration.instance_uuid \u003d instance.uuid"},{"line_number":349,"context_line":"        migration.source_compute \u003d instance.host"},{"line_number":350,"context_line":"        migration.source_node \u003d instance.node"},{"line_number":351,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":352,"context_line":"        # \u003e\u003d 1.7, to record the migrations record from the operator."},{"line_number":353,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":354,"context_line":"            migration.user_id \u003d self.context._user_id"},{"line_number":355,"context_line":"        if \u0027project_id\u0027 in migration:"},{"line_number":356,"context_line":"            migration.proejct_id \u003d self.context._project_id"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if move_type:"},{"line_number":359,"context_line":"            migration.migration_type \u003d move_type"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_c343a26b","line":356,"range":{"start_line":351,"start_character":8,"end_line":356,"end_character":59},"in_reply_to":"7faddb67_7bc70766","updated":"2019-08-29 07:18:29.000000000","message":"yea, that is what I mean","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"84e6dd941c81bb420fd12cce14184f392dc30546","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        migration.instance_uuid \u003d instance.uuid"},{"line_number":349,"context_line":"        migration.source_compute \u003d instance.host"},{"line_number":350,"context_line":"        migration.source_node \u003d instance.node"},{"line_number":351,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":352,"context_line":"        # \u003e\u003d 1.7, to record the migrations record from the operator."},{"line_number":353,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":354,"context_line":"            migration.user_id \u003d self.context._user_id"},{"line_number":355,"context_line":"        if \u0027project_id\u0027 in migration:"},{"line_number":356,"context_line":"            migration.proejct_id \u003d self.context._project_id"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if move_type:"},{"line_number":359,"context_line":"            migration.migration_type \u003d move_type"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_98c20953","line":356,"range":{"start_line":351,"start_character":8,"end_line":356,"end_character":59},"in_reply_to":"7faddb67_974dfd72","updated":"2019-08-28 12:36:45.000000000","message":"When we resize (resize or cold-migration) an instance [1], it will be claim the resource of the instance, if the operater migrate the server, I think we should to record the user_id and project? What do you think about?\n\n[1]https://github.com/openstack/nova/blob/master/nova/compute/manager.py#L4428","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ca87cac2ef7266800a3a68faa55f34178501d1c","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        migration.instance_uuid \u003d instance.uuid"},{"line_number":349,"context_line":"        migration.source_compute \u003d instance.host"},{"line_number":350,"context_line":"        migration.source_node \u003d instance.node"},{"line_number":351,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":352,"context_line":"        # \u003e\u003d 1.7, to record the migrations record from the operator."},{"line_number":353,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":354,"context_line":"            migration.user_id \u003d self.context._user_id"},{"line_number":355,"context_line":"        if \u0027project_id\u0027 in migration:"},{"line_number":356,"context_line":"            migration.proejct_id \u003d self.context._project_id"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if move_type:"},{"line_number":359,"context_line":"            migration.migration_type \u003d move_type"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_7bc70766","line":356,"range":{"start_line":351,"start_character":8,"end_line":356,"end_character":59},"in_reply_to":"7faddb67_98c20953","updated":"2019-08-28 13:17:17.000000000","message":"I think you\u0027re missing Alex\u0027s point: doing it here looks odd, and is also not the only place the migration is created:\n\nhttps://github.com/openstack/nova/blob/912a46c9d4d3a8cc63724adff70acf8a4fc34d9b/nova/conductor/tasks/migrate.py#L152\n\nso setting the user_id/project_id in a single place, like create(), will abstract this and mean we can avoid the duplication.","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0991b5742b72693df5c171d6692900b2ab8354a0","unresolved":false,"context_lines":[{"line_number":430,"context_line":"            migration.old_instance_type_id \u003d instance.instance_type_id"},{"line_number":431,"context_line":"            migration.new_instance_type_id \u003d instance.instance_type_id"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":434,"context_line":"        # \u003e\u003d 1.7, to record the migration record from the operator."},{"line_number":435,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":436,"context_line":"            migration.user_id \u003d self.context._user_id"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_1b85b307","line":433,"updated":"2019-08-28 13:18:53.000000000","message":"Same comments as in the resource tracker - I forgot about this one, but this is now the third place that a Migration is created during a move operation.\n\nAnd you missed evacuate:\n\nhttps://github.com/openstack/nova/blob/912a46c9d4d3a8cc63724adff70acf8a4fc34d9b/nova/compute/api.py#L4549","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d90fe2636036681dea762f787b22ce3419a7df2e","unresolved":false,"context_lines":[{"line_number":430,"context_line":"            migration.old_instance_type_id \u003d instance.instance_type_id"},{"line_number":431,"context_line":"            migration.new_instance_type_id \u003d instance.instance_type_id"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Add user_id and project_id in Migration object version"},{"line_number":434,"context_line":"        # \u003e\u003d 1.7, to record the migration record from the operator."},{"line_number":435,"context_line":"        if \u0027user_id\u0027 in migration:"},{"line_number":436,"context_line":"            migration.user_id \u003d self.context._user_id"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_46eee0ed","line":433,"in_reply_to":"7faddb67_1b85b307","updated":"2019-08-29 07:58:34.000000000","message":"Done","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"}],"nova/tests/functional/api/client.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":502,"context_line":"    def get_migrations(self, user_id\u003dNone, project_id\u003dNone):"},{"line_number":503,"context_line":"        url \u003d \u0027/os-migrations?\u0027"},{"line_number":504,"context_line":"        if user_id:"},{"line_number":505,"context_line":"            url +\u003d \u0027user_id\u003d%s\u0026\u0027 % user_id"},{"line_number":506,"context_line":"        if project_id:"},{"line_number":507,"context_line":"            url +\u003d \u0027project_id\u003d%s\u0026\u0027 % project_id"},{"line_number":508,"context_line":"        return self.api_get(url).body[\u0027migrations\u0027]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_e7684388","line":505,"range":{"start_line":505,"start_character":30,"end_line":505,"end_character":31},"updated":"2019-09-10 22:55:25.000000000","message":"Huh, I guess trailing \u0026 doesn\u0027t hurt anything.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":502,"context_line":"    def get_migrations(self, user_id\u003dNone, project_id\u003dNone):"},{"line_number":503,"context_line":"        url \u003d \u0027/os-migrations?\u0027"},{"line_number":504,"context_line":"        if user_id:"},{"line_number":505,"context_line":"            url +\u003d \u0027user_id\u003d%s\u0026\u0027 % user_id"},{"line_number":506,"context_line":"        if project_id:"},{"line_number":507,"context_line":"            url +\u003d \u0027project_id\u003d%s\u0026\u0027 % project_id"},{"line_number":508,"context_line":"        return self.api_get(url).body[\u0027migrations\u0027]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_93d51146","line":505,"range":{"start_line":505,"start_character":30,"end_line":505,"end_character":31},"in_reply_to":"5faad753_e7684388","updated":"2019-09-11 07:12:30.000000000","message":"Yes, it\u0027s ok.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"}],"nova/tests/functional/api_sample_tests/test_migrations.py":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"4b3659d229211d33efd3a3bd3764512de3154ff7","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            \u0027deleted\u0027: False,"},{"line_number":229,"context_line":"            \u0027uuid\u0027: \u002712341d4b-346a-40d0-83c6-5f4f6892b650\u0027,"},{"line_number":230,"context_line":"            \u0027cross_cell_move\u0027: False,"},{"line_number":231,"context_line":"            \u0027user_id\u0027: None,"},{"line_number":232,"context_line":"            \u0027project_id\u0027: None"},{"line_number":233,"context_line":"        },"},{"line_number":234,"context_line":"        # non in-progress live-migration."}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_e9196a79","line":231,"updated":"2019-08-06 06:29:13.000000000","message":"You should not change the 2.59 migrations directly. you should only change it in 276 test","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"901d58835dfa2b3872fddded77786796de97683c","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            \u0027deleted\u0027: False,"},{"line_number":229,"context_line":"            \u0027uuid\u0027: \u002712341d4b-346a-40d0-83c6-5f4f6892b650\u0027,"},{"line_number":230,"context_line":"            \u0027cross_cell_move\u0027: False,"},{"line_number":231,"context_line":"            \u0027user_id\u0027: None,"},{"line_number":232,"context_line":"            \u0027project_id\u0027: None"},{"line_number":233,"context_line":"        },"},{"line_number":234,"context_line":"        # non in-progress live-migration."}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_ff659caf","line":231,"in_reply_to":"7faddb67_e9196a79","updated":"2019-08-06 09:38:00.000000000","message":"Done","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f9fc5d3761a85159bc2b1eea913dc2e25563b26","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            \u0027deleted_at\u0027: None,"},{"line_number":49,"context_line":"            \u0027deleted\u0027: False,"},{"line_number":50,"context_line":"            \u0027uuid\u0027: uuids.migration1,"},{"line_number":51,"context_line":"            \u0027cross_cell_move\u0027: False,"},{"line_number":52,"context_line":"        },"},{"line_number":53,"context_line":"        {"},{"line_number":54,"context_line":"            \u0027id\u0027: 5678,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_1b9a9361","side":"PARENT","line":51,"updated":"2019-08-28 13:24:59.000000000","message":"here and below, why did these lines need to change?","commit_id":"a3262a5786b0aa6c7506a8c06b0678c97d4f1e9c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d90fe2636036681dea762f787b22ce3419a7df2e","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            \u0027deleted_at\u0027: None,"},{"line_number":49,"context_line":"            \u0027deleted\u0027: False,"},{"line_number":50,"context_line":"            \u0027uuid\u0027: uuids.migration1,"},{"line_number":51,"context_line":"            \u0027cross_cell_move\u0027: False,"},{"line_number":52,"context_line":"        },"},{"line_number":53,"context_line":"        {"},{"line_number":54,"context_line":"            \u0027id\u0027: 5678,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_63a42e4c","side":"PARENT","line":51,"in_reply_to":"7faddb67_1b9a9361","updated":"2019-08-29 07:58:34.000000000","message":"I just want to standardize it, it\u0027s okay, reduction.","commit_id":"a3262a5786b0aa6c7506a8c06b0678c97d4f1e9c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75e75b1c7fb0a5a4ac7a797690239ec051245c96","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            \u0027deleted_at\u0027: None,"},{"line_number":49,"context_line":"            \u0027deleted\u0027: False,"},{"line_number":50,"context_line":"            \u0027uuid\u0027: uuids.migration1,"},{"line_number":51,"context_line":"            \u0027cross_cell_move\u0027: False,"},{"line_number":52,"context_line":"        },"},{"line_number":53,"context_line":"        {"},{"line_number":54,"context_line":"            \u0027id\u0027: 5678,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_8b41d165","side":"PARENT","line":51,"in_reply_to":"7faddb67_63a42e4c","updated":"2019-09-05 13:13:23.000000000","message":"It makes the patch bigger for no real gain which is why we try to avoid unrelated changes.","commit_id":"a3262a5786b0aa6c7506a8c06b0678c97d4f1e9c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f9fc5d3761a85159bc2b1eea913dc2e25563b26","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    USER_ID2 \u003d \"78348f0e-97ee-4d70-ad34-189692673ea2\""},{"line_number":328,"context_line":"    PROJECT_ID2 \u003d \"9842f0f7-1229-4355-afe7-15ebdbb8c3d8\""},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    fake_migrations \u003d ["},{"line_number":331,"context_line":"        # in-progress live-migration."},{"line_number":332,"context_line":"        {"},{"line_number":333,"context_line":"            \u0027source_node\u0027: \u0027node1\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_bbcedf58","line":330,"range":{"start_line":330,"start_character":4,"end_line":330,"end_character":19},"updated":"2019-08-28 13:24:59.000000000","message":"For the API samples tests this is fine I guess since that\u0027s what the existing tests do (I\u0027ve never liked the fakes in here), but I think we\u0027re going to want a real functional test (or modifications to existing functional tests) that assert the user_id/project_id from the context used to initiate a resize, cold migration, live migration and evacuate operation are set (those values would come from the OSAPIFixture), and would be particularly more interesting if you create a server with a non-admin user API and then move (resize, cold migrate, evacuate, live migrate) using an admin API from a different user/project, and then assert the user_id/project_id are not only set but using the admin user/project rather than the owner of the server.","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"de214e31e2ee16b7d9026ec696bab853a5d71127","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    USER_ID2 \u003d \"78348f0e-97ee-4d70-ad34-189692673ea2\""},{"line_number":328,"context_line":"    PROJECT_ID2 \u003d \"9842f0f7-1229-4355-afe7-15ebdbb8c3d8\""},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    fake_migrations \u003d ["},{"line_number":331,"context_line":"        # in-progress live-migration."},{"line_number":332,"context_line":"        {"},{"line_number":333,"context_line":"            \u0027source_node\u0027: \u0027node1\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_25db2cea","line":330,"range":{"start_line":330,"start_character":4,"end_line":330,"end_character":19},"in_reply_to":"7faddb67_0f7a3bef","updated":"2019-09-05 11:37:38.000000000","message":"Yea, agree with Matt, it is better to have less fake in functional test. But api sample test is more about the API output. One idea is we can have a separated functional test in nova/tests/functional/test_server.py","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"948fd77054782859b062b90ca939ab69900856de","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    USER_ID2 \u003d \"78348f0e-97ee-4d70-ad34-189692673ea2\""},{"line_number":328,"context_line":"    PROJECT_ID2 \u003d \"9842f0f7-1229-4355-afe7-15ebdbb8c3d8\""},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    fake_migrations \u003d ["},{"line_number":331,"context_line":"        # in-progress live-migration."},{"line_number":332,"context_line":"        {"},{"line_number":333,"context_line":"            \u0027source_node\u0027: \u0027node1\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_0f7a3bef","line":330,"range":{"start_line":330,"start_character":4,"end_line":330,"end_character":19},"in_reply_to":"7faddb67_bbcedf58","updated":"2019-08-29 11:30:03.000000000","message":"From the OSAPIFixture, I was added \u0027def *_2\u0027 functional test for migrations with user_id/project_id, and I keep them (*_1 and *_2) in the class, they are do the same thing, do you mean I shuold keep these \"*_2\" were reserved, and remove the \"*_1\" function tests? or keep them in?\n\nYou can review https://review.opendev.org/#/c/674243/16/nova/tests/functional/api_sample_tests/test_migrations.py@428\n\n\u003e ..and would be particularly more interesting if you create\n\u003e a server with a non-admin user API and then move (resize, \n\u003e cold migrate, evacuate, live migrate) using an admin API\n\u003e from a different user/project, and then assert the \n\u003e user_id/project_id are not only set but using the admin \n\u003e user/project rather than the owner of the server.\n\nWhat do you mean by adding a complete functional flow (one of \u0027resize\u0027, \u0027cold migrate\u0027, \u0027evacuate\u0027 or \u0027live migrate\u0027, or do all)?\nSuch as:\n\n- Create a server using non-admin;\n-Use the admin user to perform \u0027resize\u0027, \u0027cold migrate\u0027, \u0027evacuate\u0027 or \u0027live migrate\u0027 the server, maybe need to add the corresponding method to the functional.api.client;\n-After step 2 completed, assert the user_id/project_id to check the action is ok.","commit_id":"6a555bef4cdd9781321ae15fedd99554cdc34d13"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"de214e31e2ee16b7d9026ec696bab853a5d71127","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            project_id\u003dself.PROJECT_ID1)"},{"line_number":453,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    def test_get_migrations_with_user_and_project_id_1(self):"},{"line_number":456,"context_line":"        response \u003d self._do_get(\u0027os-migrations?user_id\u003d%s\u0026project_id\u003d%s\u0027"},{"line_number":457,"context_line":"                                % (self.USER_ID1, self.PROJECT_ID1))"},{"line_number":458,"context_line":"        self.assertEqual(200, response.status_code)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_4588a8c4","line":455,"updated":"2019-09-05 11:37:38.000000000","message":"Not sure we need test_get_migrations_with_user_id_2, test_get_migrations_with_project_id_2, and test_get_migrations_with_user_and_project_id_1 in api sample test","commit_id":"67920d6df40043d24b8d7d4d664b35c84dbafcb5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4ed6a858349578047db35809dfadb8941dbd19a0","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            project_id\u003dself.PROJECT_ID1)"},{"line_number":453,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    def test_get_migrations_with_user_and_project_id_1(self):"},{"line_number":456,"context_line":"        response \u003d self._do_get(\u0027os-migrations?user_id\u003d%s\u0026project_id\u003d%s\u0027"},{"line_number":457,"context_line":"                                % (self.USER_ID1, self.PROJECT_ID1))"},{"line_number":458,"context_line":"        self.assertEqual(200, response.status_code)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_e533d411","line":455,"in_reply_to":"7faddb67_4588a8c4","updated":"2019-09-05 11:41:38.000000000","message":"\u003e test_get_migrations_with_user_and_project_id_1\n \u003e in api sample test\n\nsorry, I mean this one test_get_migrations_with_user_and_project_id_2","commit_id":"67920d6df40043d24b8d7d4d664b35c84dbafcb5"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"e93c2e2e0fcecbe82148aedaca3563f0b0ed97cd","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            project_id\u003dself.PROJECT_ID1)"},{"line_number":453,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    def test_get_migrations_with_user_and_project_id_1(self):"},{"line_number":456,"context_line":"        response \u003d self._do_get(\u0027os-migrations?user_id\u003d%s\u0026project_id\u003d%s\u0027"},{"line_number":457,"context_line":"                                % (self.USER_ID1, self.PROJECT_ID1))"},{"line_number":458,"context_line":"        self.assertEqual(200, response.status_code)"}],"source_content_type":"text/x-python","patch_set":20,"id":"5faad753_beb129e4","line":455,"in_reply_to":"7faddb67_e533d411","updated":"2019-09-09 02:11:48.000000000","message":"Removed.","commit_id":"67920d6df40043d24b8d7d4d664b35c84dbafcb5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"de214e31e2ee16b7d9026ec696bab853a5d71127","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            user_id\u003dself.USER_ID1, project_id\u003dself.PROJECT_ID1)"},{"line_number":470,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    def test_get_migrations_after_migrate_server_by_admin(self):"},{"line_number":473,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":474,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":475,"context_line":"        self.api \u003d api_fixture.api"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_65fe0439","line":472,"range":{"start_line":472,"start_character":7,"end_line":472,"end_character":64},"updated":"2019-09-05 11:37:38.000000000","message":"we can move this to nova/tests/functional/test_servers.py","commit_id":"67920d6df40043d24b8d7d4d664b35c84dbafcb5"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"e93c2e2e0fcecbe82148aedaca3563f0b0ed97cd","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            user_id\u003dself.USER_ID1, project_id\u003dself.PROJECT_ID1)"},{"line_number":470,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    def test_get_migrations_after_migrate_server_by_admin(self):"},{"line_number":473,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":474,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":475,"context_line":"        self.api \u003d api_fixture.api"}],"source_content_type":"text/x-python","patch_set":20,"id":"5faad753_fe624116","line":472,"range":{"start_line":472,"start_character":7,"end_line":472,"end_character":64},"in_reply_to":"7faddb67_65fe0439","updated":"2019-09-09 02:11:48.000000000","message":"Done","commit_id":"67920d6df40043d24b8d7d4d664b35c84dbafcb5"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bf9c911dd0e2157bbe3cf97cc4ba8020f9c7cf16","unresolved":false,"context_lines":[{"line_number":499,"context_line":"        self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027)"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        post \u003d {\u0027migrate\u0027: {}}"},{"line_number":502,"context_line":"        self.admin_api.post_server_action(server_id, post)"},{"line_number":503,"context_line":"        self._wait_for_state_change(self.admin_api, server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":504,"context_line":"        # Get the migration records"},{"line_number":505,"context_line":"        migrations \u003d self.admin_api.get_migrations(project_id\u003dproject_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_f1d933f4","line":502,"updated":"2019-09-06 09:03:22.000000000","message":"Just do a rebase, why this functional test failed?","commit_id":"28b2462b6463823aa4d483a1c4273ef92570a9e9"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":319,"context_line":""},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"class MigrationsSamplesJsonTestV2_80(MigrationsSamplesJsonTestV2_66,"},{"line_number":322,"context_line":"                                     api_sample_base.ApiSampleTestBaseV21,"},{"line_number":323,"context_line":"                                     integrated_helpers.InstanceHelperMixin):"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    microversion \u003d \u00272.80\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_75c2ef87","line":322,"range":{"start_line":322,"start_character":37,"end_line":322,"end_character":74},"updated":"2019-09-09 05:43:25.000000000","message":"Is it necessary?","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":319,"context_line":""},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"class MigrationsSamplesJsonTestV2_80(MigrationsSamplesJsonTestV2_66,"},{"line_number":322,"context_line":"                                     api_sample_base.ApiSampleTestBaseV21,"},{"line_number":323,"context_line":"                                     integrated_helpers.InstanceHelperMixin):"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    microversion \u003d \u00272.80\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_555fb340","line":322,"range":{"start_line":322,"start_character":37,"end_line":322,"end_character":74},"in_reply_to":"5faad753_75c2ef87","updated":"2019-09-09 06:42:42.000000000","message":"No, it shuld be removed, beacause of the OSAPIFixture test move to the nova/tests/functional/test_servers.py.","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"202ec0daecfeda82a227c36612798dc3558a7e3e","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    USER_ID2 \u003d \"78348f0e-97ee-4d70-ad34-189692673ea2\""},{"line_number":327,"context_line":"    PROJECT_ID2 \u003d \"9842f0f7-1229-4355-afe7-15ebdbb8c3d8\""},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    fake_migrations \u003d ["},{"line_number":330,"context_line":"        # in-progress live-migration."},{"line_number":331,"context_line":"        {"},{"line_number":332,"context_line":"            \u0027source_node\u0027: \u0027node1\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_bd76dc05","line":329,"range":{"start_line":329,"start_character":4,"end_line":329,"end_character":19},"updated":"2019-09-11 01:45:28.000000000","message":"I know this is copying existing behavior for these samples but like https://review.opendev.org/#/c/680834/ I wish at some point we\u0027d really be doing real migrations for these tests rather than stub everything out. Not something to deal with in this patch though.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    USER_ID2 \u003d \"78348f0e-97ee-4d70-ad34-189692673ea2\""},{"line_number":327,"context_line":"    PROJECT_ID2 \u003d \"9842f0f7-1229-4355-afe7-15ebdbb8c3d8\""},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    fake_migrations \u003d ["},{"line_number":330,"context_line":"        # in-progress live-migration."},{"line_number":331,"context_line":"        {"},{"line_number":332,"context_line":"            \u0027source_node\u0027: \u0027node1\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_2984ea0b","line":329,"range":{"start_line":329,"start_character":4,"end_line":329,"end_character":19},"in_reply_to":"5faad753_bd76dc05","updated":"2019-09-11 07:12:30.000000000","message":"I am happy with the changes at https://review.opendev.org/#/c/680834/ and that improve the applicability of real APIs.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    USER_ID2 \u003d \"78348f0e-97ee-4d70-ad34-189692673ea2\""},{"line_number":327,"context_line":"    PROJECT_ID2 \u003d \"9842f0f7-1229-4355-afe7-15ebdbb8c3d8\""},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    fake_migrations \u003d ["},{"line_number":330,"context_line":"        # in-progress live-migration."},{"line_number":331,"context_line":"        {"},{"line_number":332,"context_line":"            \u0027source_node\u0027: \u0027node1\u0027,"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_b2db23eb","line":329,"updated":"2019-10-10 19:22:16.000000000","message":"I really wish we\u0027d stop using fakes / stubs like this in API samples functional tests but I won\u0027t make you correct that here. I would think, however, that it would be relatively simple to create a couple of servers and initiate live migration and resize operations on them with some kind of simple stub for the cases that we want to trap an in-progress migration and leave the rest to actually be real data from the database. Anyway, I\u0027m basically just complaining to myself.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/tests/functional/api_sample_tests/test_server_migrations.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36691bc60acb3e60752f5a111b6dd9c1871f4970","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class ServerMigrationsSampleJsonTestV2_80("},{"line_number":254,"context_line":"    ServerMigrationsSamplesJsonTestV2_59):"},{"line_number":255,"context_line":"    ADMIN_API \u003d True"},{"line_number":256,"context_line":"    microversion \u003d \u00272.80\u0027"},{"line_number":257,"context_line":"    scenarios \u003d [(\u0027v2_80\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_bd77bc3a","line":254,"updated":"2019-09-11 01:38:25.000000000","message":"indent this","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class ServerMigrationsSampleJsonTestV2_80("},{"line_number":254,"context_line":"    ServerMigrationsSamplesJsonTestV2_59):"},{"line_number":255,"context_line":"    ADMIN_API \u003d True"},{"line_number":256,"context_line":"    microversion \u003d \u00272.80\u0027"},{"line_number":257,"context_line":"    scenarios \u003d [(\u0027v2_80\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_d37b89bb","line":254,"in_reply_to":"5faad753_bd77bc3a","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            \u0027user_id\u0027: USER_ID,"},{"line_number":310,"context_line":"            \u0027project_id\u0027: PROJECT_ID"},{"line_number":311,"context_line":"        }"},{"line_number":312,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_c71bc718","line":312,"updated":"2019-09-10 22:55:25.000000000","message":"Did you forget to add some tests here to verify the new response format?","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            \u0027user_id\u0027: USER_ID,"},{"line_number":310,"context_line":"            \u0027project_id\u0027: PROJECT_ID"},{"line_number":311,"context_line":"        }"},{"line_number":312,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_33b8dd74","line":312,"in_reply_to":"5faad753_9d92004b","updated":"2019-09-11 07:12:30.000000000","message":"Yes","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36691bc60acb3e60752f5a111b6dd9c1871f4970","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            \u0027user_id\u0027: USER_ID,"},{"line_number":310,"context_line":"            \u0027project_id\u0027: PROJECT_ID"},{"line_number":311,"context_line":"        }"},{"line_number":312,"context_line":"    ]"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_9d92004b","line":312,"in_reply_to":"5faad753_c71bc718","updated":"2019-09-11 01:38:25.000000000","message":"Like ServerMigrationsSamplesJsonTestV2_59 this is just overriding the fake data and the parent classes are running the tests.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class ServerMigrationsSampleJsonTestV2_80("},{"line_number":254,"context_line":"        ServerMigrationsSamplesJsonTestV2_59):"},{"line_number":255,"context_line":"    ADMIN_API \u003d True"},{"line_number":256,"context_line":"    microversion \u003d \u00272.80\u0027"},{"line_number":257,"context_line":"    scenarios \u003d [(\u0027v2_80\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_52f66f65","line":254,"range":{"start_line":254,"start_character":8,"end_line":254,"end_character":44},"updated":"2019-10-10 19:22:16.000000000","message":"Why not extend ServerMigrationsSampleJsonTestV2_65 for this?","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class ServerMigrationsSampleJsonTestV2_80("},{"line_number":254,"context_line":"        ServerMigrationsSamplesJsonTestV2_59):"},{"line_number":255,"context_line":"    ADMIN_API \u003d True"},{"line_number":256,"context_line":"    microversion \u003d \u00272.80\u0027"},{"line_number":257,"context_line":"    scenarios \u003d [(\u0027v2_80\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_27d850ed","line":254,"range":{"start_line":254,"start_character":8,"end_line":254,"end_character":44},"in_reply_to":"3fa7e38b_52f66f65","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class ServerMigrationsSampleJsonTestV2_80("},{"line_number":254,"context_line":"        ServerMigrationsSamplesJsonTestV2_59):"},{"line_number":255,"context_line":"    ADMIN_API \u003d True"},{"line_number":256,"context_line":"    microversion \u003d \u00272.80\u0027"},{"line_number":257,"context_line":"    scenarios \u003d [(\u0027v2_80\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_f2e67bb0","line":255,"updated":"2019-10-10 19:22:16.000000000","message":"This is redundant, you don\u0027t need it since the parent class sets it.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"class ServerMigrationsSampleJsonTestV2_80("},{"line_number":254,"context_line":"        ServerMigrationsSamplesJsonTestV2_59):"},{"line_number":255,"context_line":"    ADMIN_API \u003d True"},{"line_number":256,"context_line":"    microversion \u003d \u00272.80\u0027"},{"line_number":257,"context_line":"    scenarios \u003d [(\u0027v2_80\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_477f8cde","line":255,"in_reply_to":"3fa7e38b_f2e67bb0","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":1626,"context_line":"                      \u0027volume-backed server\u0027, six.text_type(resp))"},{"line_number":1627,"context_line":""},{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"class ServersTestV279(ServersTestBase):"},{"line_number":1630,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":1631,"context_line":""},{"line_number":1632,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_87d38f38","line":1629,"range":{"start_line":1629,"start_character":18,"end_line":1629,"end_character":21},"updated":"2019-09-10 22:55:25.000000000","message":"Should this be 280?","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":1626,"context_line":"                      \u0027volume-backed server\u0027, six.text_type(resp))"},{"line_number":1627,"context_line":""},{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"class ServersTestV279(ServersTestBase):"},{"line_number":1630,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":1631,"context_line":""},{"line_number":1632,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_4eea8cac","line":1629,"range":{"start_line":1629,"start_character":18,"end_line":1629,"end_character":21},"in_reply_to":"5faad753_87d38f38","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36691bc60acb3e60752f5a111b6dd9c1871f4970","unresolved":false,"context_lines":[{"line_number":1633,"context_line":"        super(ServersTestV279, self).setUp()"},{"line_number":1634,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1635,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":1636,"context_line":"        self.api \u003d api_fixture.api"},{"line_number":1637,"context_line":"        self.admin_api \u003d api_fixture.admin_api"},{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"        self.api.microversion \u003d \u00272.80\u0027"},{"line_number":1640,"context_line":"        self.admin_api.microversion \u003d \u00272.80\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_fd7d341c","line":1637,"range":{"start_line":1636,"start_character":8,"end_line":1637,"end_character":46},"updated":"2019-09-11 01:38:25.000000000","message":"The problem with using these is they have the same project_id. I thought the point of this API change was that we could have a scenario like a non-admin user1 in project1 creates a server and then an admin user2 in project2 cold migrates it and then another admin user3 in projec2 live migrates it, and we can list migrations and filter on the different users and projects so we know when 2 admins in the same project are moving servers around and know which admin user in those projects is doing that move. With OSAPIFixture you can override the project_id when creating it but the user_id is hard-coded, which is unfortunate, but we should at the very least be testing different projects for the server and the user migrating it (the admin) and it should be possible to update OSAPIFixture to use a different user based on some kwarg but you\u0027d have to test that. The fixture might be hard-coded for the user being \u0027admin\u0027 to fake the token.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"9a3717a960e4ed9f109887f3cf1123f403277d51","unresolved":false,"context_lines":[{"line_number":1633,"context_line":"        super(ServersTestV279, self).setUp()"},{"line_number":1634,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1635,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":1636,"context_line":"        self.api \u003d api_fixture.api"},{"line_number":1637,"context_line":"        self.admin_api \u003d api_fixture.admin_api"},{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"        self.api.microversion \u003d \u00272.80\u0027"},{"line_number":1640,"context_line":"        self.admin_api.microversion \u003d \u00272.80\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_3115349d","line":1637,"range":{"start_line":1636,"start_character":8,"end_line":1637,"end_character":46},"in_reply_to":"5faad753_fd7d341c","updated":"2019-09-11 08:12:16.000000000","message":"Yeah, I will be added a test that migrate the server from project_A to project_B, and use project_B to filter the migrations and assert the server\u0027s migrations is correct.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36691bc60acb3e60752f5a111b6dd9c1871f4970","unresolved":false,"context_lines":[{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        server \u003d self._wait_for_state_change(found_server, \u0027BUILD\u0027)"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"        # These tests don\u0027t care about ports with QoS bandwidth resources."},{"line_number":1660,"context_line":"        self.stub_out(\u0027nova.api.openstack.common.\u0027"},{"line_number":1661,"context_line":"                      \u0027instance_has_port_with_resource_request\u0027,"},{"line_number":1662,"context_line":"                      lambda *a, **kw: False)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_9dbbe0c2","line":1659,"updated":"2019-09-11 01:38:25.000000000","message":"I don\u0027t know why you\u0027d need to stub this out.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3ac5cc5f02e6243da9cacca42ab36417e10a60e9","unresolved":false,"context_lines":[{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        server \u003d self._wait_for_state_change(found_server, \u0027BUILD\u0027)"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"        # These tests don\u0027t care about ports with QoS bandwidth resources."},{"line_number":1660,"context_line":"        self.stub_out(\u0027nova.api.openstack.common.\u0027"},{"line_number":1661,"context_line":"                      \u0027instance_has_port_with_resource_request\u0027,"},{"line_number":1662,"context_line":"                      lambda *a, **kw: False)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_461b4c80","line":1659,"in_reply_to":"5faad753_09724ee4","updated":"2019-09-11 12:50:20.000000000","message":"My point is in a functional test you shouldn\u0027t care about this since the instance doesn\u0027t have ports with resource requests anyway.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d3a3578be7d7e60fae8432f5d79732f03d9a4193","unresolved":false,"context_lines":[{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        server \u003d self._wait_for_state_change(found_server, \u0027BUILD\u0027)"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"        # These tests don\u0027t care about ports with QoS bandwidth resources."},{"line_number":1660,"context_line":"        self.stub_out(\u0027nova.api.openstack.common.\u0027"},{"line_number":1661,"context_line":"                      \u0027instance_has_port_with_resource_request\u0027,"},{"line_number":1662,"context_line":"                      lambda *a, **kw: False)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_fca436bb","line":1659,"in_reply_to":"5faad753_461b4c80","updated":"2019-09-12 07:03:11.000000000","message":"Agree.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"9a3717a960e4ed9f109887f3cf1123f403277d51","unresolved":false,"context_lines":[{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"        server \u003d self._wait_for_state_change(found_server, \u0027BUILD\u0027)"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"        # These tests don\u0027t care about ports with QoS bandwidth resources."},{"line_number":1660,"context_line":"        self.stub_out(\u0027nova.api.openstack.common.\u0027"},{"line_number":1661,"context_line":"                      \u0027instance_has_port_with_resource_request\u0027,"},{"line_number":1662,"context_line":"                      lambda *a, **kw: False)"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_09724ee4","line":1659,"in_reply_to":"5faad753_9dbbe0c2","updated":"2019-09-11 08:12:16.000000000","message":"Avoid the effects of instance_has_port_with_resource_request() when resize/live-migrate, I think we don\u0027t care the port resource of the server in this case.\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/migrate_server.py#L61-L71\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/migrate_server.py#L141-L151","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":1668,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1669,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1670,"context_line":"        # Get the migration records"},{"line_number":1671,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1672,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_47b277e8","line":1671,"range":{"start_line":1671,"start_character":51,"end_line":1671,"end_character":66},"updated":"2019-09-10 22:55:25.000000000","message":"Note to self: the admin api uses user_id\u003d\u0027admin\u0027 and project_id\u003d\u0027admin\u0027 so since this test is filtering on user_id\u003d\u0027admin\u0027 it should only receive any migrations back if the migrations were initiated by \u0027admin\u0027.\n\nIt would be nice if this test also did a get_migrations(project_id\u003d\u0027bogus\u0027) to verify that no migrations are returned in that case.\n\nAnd we could do a few more queries like with both user_id and project_id, but I don\u0027t know how exhaustive we want to be at this layer?","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"9a3717a960e4ed9f109887f3cf1123f403277d51","unresolved":false,"context_lines":[{"line_number":1668,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1669,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1670,"context_line":"        # Get the migration records"},{"line_number":1671,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1672,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_7122cc02","line":1671,"range":{"start_line":1671,"start_character":51,"end_line":1671,"end_character":66},"in_reply_to":"5faad753_47b277e8","updated":"2019-09-11 08:12:16.000000000","message":"\u003e It would be nice if this test also did a \n\u003e get_migrations(project_id\u003d\u0027bogus\u0027) to verify that no \n\u003e migrations are returned in that case.\n\nAdded.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36691bc60acb3e60752f5a111b6dd9c1871f4970","unresolved":false,"context_lines":[{"line_number":1668,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1669,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1670,"context_line":"        # Get the migration records"},{"line_number":1671,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1672,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_ddc0782d","line":1671,"range":{"start_line":1671,"start_character":51,"end_line":1671,"end_character":66},"in_reply_to":"5faad753_47b277e8","updated":"2019-09-11 01:38:25.000000000","message":"Yup, just like I said above. The API samples fake all of the data out, so those are basically worthless for functional testing of the actual API filter and DB layer filtering. I think this test is insufficient in what it\u0027s trying to test for filtering based on userid/projectid in different scenarios.","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"9a3717a960e4ed9f109887f3cf1123f403277d51","unresolved":false,"context_lines":[{"line_number":1668,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1669,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1670,"context_line":"        # Get the migration records"},{"line_number":1671,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1672,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_712f2ca1","line":1671,"range":{"start_line":1671,"start_character":51,"end_line":1671,"end_character":66},"in_reply_to":"5faad753_ddc0782d","updated":"2019-09-11 08:12:16.000000000","message":"Added the scenarios for migrating server in different project, and test it filter by project_id after live migration,","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1620,"context_line":""},{"line_number":1621,"context_line":"    def setUp(self):"},{"line_number":1622,"context_line":"        super(ServersTestV280, self).setUp()"},{"line_number":1623,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1624,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":1625,"context_line":"        self.api \u003d api_fixture.api"},{"line_number":1626,"context_line":"        self.admin_api \u003d api_fixture.admin_api"},{"line_number":1627,"context_line":""},{"line_number":1628,"context_line":"        self.api.microversion \u003d \u00272.80\u0027"},{"line_number":1629,"context_line":"        self.admin_api.microversion \u003d \u00272.80\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_12a1d746","line":1626,"range":{"start_line":1623,"start_character":8,"end_line":1626,"end_character":46},"updated":"2019-10-10 19:22:16.000000000","message":"Since you\u0027re using the same API fixture here the project_id is going to be the same, correct? But I guess the user_id would be \u0027fake\u0027 for the non-admin and \u0027admin\u0027 for the admin API?","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1620,"context_line":""},{"line_number":1621,"context_line":"    def setUp(self):"},{"line_number":1622,"context_line":"        super(ServersTestV280, self).setUp()"},{"line_number":1623,"context_line":"        api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1624,"context_line":"            api_version\u003d\u0027v2.1\u0027))"},{"line_number":1625,"context_line":"        self.api \u003d api_fixture.api"},{"line_number":1626,"context_line":"        self.admin_api \u003d api_fixture.admin_api"},{"line_number":1627,"context_line":""},{"line_number":1628,"context_line":"        self.api.microversion \u003d \u00272.80\u0027"},{"line_number":1629,"context_line":"        self.admin_api.microversion \u003d \u00272.80\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_c7f93c4e","line":1626,"range":{"start_line":1623,"start_character":8,"end_line":1626,"end_character":46},"in_reply_to":"3fa7e38b_12a1d746","updated":"2019-10-11 04:39:11.000000000","message":"Yes. \u0027fake\u0027 and \u0027admin\u0027 are the default non-admin and admin user.\n\nhttps://github.com/openstack/nova/blob/27818dd607936209d8d73f534d64ba74fb2dd7f0/nova/tests/fixtures.py#L1004-L1007","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1644,"context_line":"        found_server \u003d self.api.get_server(server_id)"},{"line_number":1645,"context_line":"        self.assertEqual(server_id, found_server[\u0027id\u0027])"},{"line_number":1646,"context_line":""},{"line_number":1647,"context_line":"        server \u003d self._wait_for_state_change(found_server, \u0027BUILD\u0027)"},{"line_number":1648,"context_line":""},{"line_number":1649,"context_line":"        self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027)"},{"line_number":1650,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_d286dfb9","line":1647,"range":{"start_line":1647,"start_character":22,"end_line":1647,"end_character":44},"updated":"2019-10-10 19:22:16.000000000","message":"I\u0027m not really sure this is even necessary because at some point up the test class hierarchy this is using the CastAsCall fixture so the server should be ACTIVE by the time it\u0027s returned from post_server. FWIW I don\u0027t like using / extending ServersTestBase or _IntegratedTestBase because of stuff like that, it\u0027s unrealistic to how the API and operations actually behave for an end-user.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1644,"context_line":"        found_server \u003d self.api.get_server(server_id)"},{"line_number":1645,"context_line":"        self.assertEqual(server_id, found_server[\u0027id\u0027])"},{"line_number":1646,"context_line":""},{"line_number":1647,"context_line":"        server \u003d self._wait_for_state_change(found_server, \u0027BUILD\u0027)"},{"line_number":1648,"context_line":""},{"line_number":1649,"context_line":"        self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027)"},{"line_number":1650,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_321f2c09","line":1647,"range":{"start_line":1647,"start_character":22,"end_line":1647,"end_character":44},"in_reply_to":"3fa7e38b_d286dfb9","updated":"2019-10-11 04:39:11.000000000","message":"Removed.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        post \u003d {\u0027migrate\u0027: {}}"},{"line_number":1652,"context_line":"        self.admin_api.post_server_action(server_id, post)"},{"line_number":1653,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_928ce7d7","line":1653,"range":{"start_line":1653,"start_character":8,"end_line":1653,"end_character":59},"updated":"2019-10-10 19:22:16.000000000","message":"This isn\u0027t necessary.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        post \u003d {\u0027migrate\u0027: {}}"},{"line_number":1652,"context_line":"        self.admin_api.post_server_action(server_id, post)"},{"line_number":1653,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_c78e1cd0","line":1653,"range":{"start_line":1653,"start_character":8,"end_line":1653,"end_character":59},"in_reply_to":"3fa7e38b_928ce7d7","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1651,"context_line":"        post \u003d {\u0027migrate\u0027: {}}"},{"line_number":1652,"context_line":"        self.admin_api.post_server_action(server_id, post)"},{"line_number":1653,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_f2b43b84","line":1654,"updated":"2019-10-10 19:22:16.000000000","message":"I\u0027m not sure how this works because _wait_for_state_change in this case is waiting for the status on the server to go *from* VERIFY_RESIZE but you haven\u0027t confirmed the migration?","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1651,"context_line":"        post \u003d {\u0027migrate\u0027: {}}"},{"line_number":1652,"context_line":"        self.admin_api.post_server_action(server_id, post)"},{"line_number":1653,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_e78b18bd","line":1654,"in_reply_to":"3fa7e38b_f2b43b84","updated":"2019-10-11 04:39:11.000000000","message":"Removed the invalid *check*.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1658,"context_line":"        # Get the migration records by non-admin"},{"line_number":1659,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"bogus\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_72a84b1f","line":1656,"range":{"start_line":1656,"start_character":59,"end_line":1656,"end_character":66},"updated":"2019-10-10 19:22:16.000000000","message":"Rather than hard-code this, I would use self.admin_api.auth_user.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"        found_server \u003d self.admin_api.get_server(server_id)"},{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1658,"context_line":"        # Get the migration records by non-admin"},{"line_number":1659,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"bogus\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_a7c3e0ec","line":1656,"range":{"start_line":1656,"start_character":59,"end_line":1656,"end_character":66},"in_reply_to":"3fa7e38b_72a84b1f","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1658,"context_line":"        # Get the migration records by non-admin"},{"line_number":1659,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"bogus\")"},{"line_number":1660,"context_line":"        self.assertEqual([], migrations)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_32641322","line":1657,"range":{"start_line":1657,"start_character":36,"end_line":1657,"end_character":49},"updated":"2019-10-10 19:22:16.000000000","message":"You should probably first assert that you got exactly 1 migration record back.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1654,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1655,"context_line":"        # Get the migration records"},{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1658,"context_line":"        # Get the migration records by non-admin"},{"line_number":1659,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"bogus\")"},{"line_number":1660,"context_line":"        self.assertEqual([], migrations)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_2774d0ce","line":1657,"range":{"start_line":1657,"start_character":36,"end_line":1657,"end_character":49},"in_reply_to":"3fa7e38b_32641322","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1658,"context_line":"        # Get the migration records by non-admin"},{"line_number":1659,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"bogus\")"},{"line_number":1660,"context_line":"        self.assertEqual([], migrations)"},{"line_number":1661,"context_line":""},{"line_number":1662,"context_line":"    def test_get_migrations_after_live_migrate_server_in_different_project("}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_126f97fc","line":1659,"range":{"start_line":1659,"start_character":59,"end_line":1659,"end_character":66},"updated":"2019-10-10 19:22:16.000000000","message":"This should probably be self.api.auth_user.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"admin\")"},{"line_number":1657,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1658,"context_line":"        # Get the migration records by non-admin"},{"line_number":1659,"context_line":"        migrations \u003d self.admin_api.get_migrations(user_id\u003d\"bogus\")"},{"line_number":1660,"context_line":"        self.assertEqual([], migrations)"},{"line_number":1661,"context_line":""},{"line_number":1662,"context_line":"    def test_get_migrations_after_live_migrate_server_in_different_project("}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_67b96877","line":1659,"range":{"start_line":1659,"start_character":59,"end_line":1659,"end_character":66},"in_reply_to":"3fa7e38b_126f97fc","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1679,"context_line":""},{"line_number":1680,"context_line":"        self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027)"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"        project_id_1 \u003d \u00274906260553374bf0a5d566543b320516\u0027"},{"line_number":1683,"context_line":"        project_id_2 \u003d \u0027c850298c1b6b4796a8f197ac310b2469\u0027"},{"line_number":1684,"context_line":"        new_api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1685,"context_line":"            api_version\u003d\u0027v2.1\u0027, project_id\u003dproject_id_1))"},{"line_number":1686,"context_line":"        new_admin_api \u003d new_api_fixture.admin_api"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_3232d311","line":1683,"range":{"start_line":1682,"start_character":8,"end_line":1683,"end_character":57},"updated":"2019-10-10 19:22:16.000000000","message":"nit: you don\u0027t really need two hard-coded here, since you could just use self.admin_api.project_id for the project that didn\u0027t initiate the live migration.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1679,"context_line":""},{"line_number":1680,"context_line":"        self.start_service(\u0027compute\u0027, host\u003d\u0027host2\u0027)"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"        project_id_1 \u003d \u00274906260553374bf0a5d566543b320516\u0027"},{"line_number":1683,"context_line":"        project_id_2 \u003d \u0027c850298c1b6b4796a8f197ac310b2469\u0027"},{"line_number":1684,"context_line":"        new_api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1685,"context_line":"            api_version\u003d\u0027v2.1\u0027, project_id\u003dproject_id_1))"},{"line_number":1686,"context_line":"        new_admin_api \u003d new_api_fixture.admin_api"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_d217b8ed","line":1683,"range":{"start_line":1682,"start_character":8,"end_line":1683,"end_character":57},"in_reply_to":"3fa7e38b_3232d311","updated":"2019-10-11 04:39:11.000000000","message":"This makes me clearly, so I will keep this, thanks.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1682,"context_line":"        project_id_1 \u003d \u00274906260553374bf0a5d566543b320516\u0027"},{"line_number":1683,"context_line":"        project_id_2 \u003d \u0027c850298c1b6b4796a8f197ac310b2469\u0027"},{"line_number":1684,"context_line":"        new_api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1685,"context_line":"            api_version\u003d\u0027v2.1\u0027, project_id\u003dproject_id_1))"},{"line_number":1686,"context_line":"        new_admin_api \u003d new_api_fixture.admin_api"},{"line_number":1687,"context_line":"        new_admin_api.microversion \u003d \u00272.80\u0027"},{"line_number":1688,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_f242fb67","line":1685,"range":{"start_line":1685,"start_character":24,"end_line":1685,"end_character":30},"updated":"2019-10-10 19:22:16.000000000","message":"nit: you could use self.api_major_version here.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1682,"context_line":"        project_id_1 \u003d \u00274906260553374bf0a5d566543b320516\u0027"},{"line_number":1683,"context_line":"        project_id_2 \u003d \u0027c850298c1b6b4796a8f197ac310b2469\u0027"},{"line_number":1684,"context_line":"        new_api_fixture \u003d self.useFixture(nova_fixtures.OSAPIFixture("},{"line_number":1685,"context_line":"            api_version\u003d\u0027v2.1\u0027, project_id\u003dproject_id_1))"},{"line_number":1686,"context_line":"        new_admin_api \u003d new_api_fixture.admin_api"},{"line_number":1687,"context_line":"        new_admin_api.microversion \u003d \u00272.80\u0027"},{"line_number":1688,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_874ca49e","line":1685,"range":{"start_line":1685,"start_character":24,"end_line":1685,"end_character":30},"in_reply_to":"3fa7e38b_f242fb67","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1693,"context_line":"            }"},{"line_number":1694,"context_line":"        }"},{"line_number":1695,"context_line":"        new_admin_api.post_server_action(server_id, post)"},{"line_number":1696,"context_line":"        found_server \u003d new_admin_api.get_server(server_id)"},{"line_number":1697,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1698,"context_line":"        # Get the migration records"},{"line_number":1699,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_1)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_92286797","line":1696,"updated":"2019-10-10 19:22:16.000000000","message":"Don\u0027t need this.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1693,"context_line":"            }"},{"line_number":1694,"context_line":"        }"},{"line_number":1695,"context_line":"        new_admin_api.post_server_action(server_id, post)"},{"line_number":1696,"context_line":"        found_server \u003d new_admin_api.get_server(server_id)"},{"line_number":1697,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1698,"context_line":"        # Get the migration records"},{"line_number":1699,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_1)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_e700f804","line":1696,"in_reply_to":"3fa7e38b_92286797","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1694,"context_line":"        }"},{"line_number":1695,"context_line":"        new_admin_api.post_server_action(server_id, post)"},{"line_number":1696,"context_line":"        found_server \u003d new_admin_api.get_server(server_id)"},{"line_number":1697,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1698,"context_line":"        # Get the migration records"},{"line_number":1699,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_1)"},{"line_number":1700,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_1216b756","line":1697,"range":{"start_line":1697,"start_character":51,"end_line":1697,"end_character":64},"updated":"2019-10-10 19:22:16.000000000","message":"This is clearly wrong - a server does not enter VERIFY_RESIZE status for a live migration. Something must be broken with the _wait_for_state_change usage here as noted above, presumably this works because from_status\u003dVERIFY_RESIZE and _wait_for_state_change is checking for server.status !\u003d from_status so that is how this passes, but it\u0027s not accurate as a terminal state.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eb6e3079b80907823a8b41716edcb9b8768c5b4d","unresolved":false,"context_lines":[{"line_number":1694,"context_line":"        }"},{"line_number":1695,"context_line":"        new_admin_api.post_server_action(server_id, post)"},{"line_number":1696,"context_line":"        found_server \u003d new_admin_api.get_server(server_id)"},{"line_number":1697,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1698,"context_line":"        # Get the migration records"},{"line_number":1699,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_1)"},{"line_number":1700,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_9867294e","line":1697,"range":{"start_line":1697,"start_character":51,"end_line":1697,"end_character":64},"in_reply_to":"3fa7e38b_1216b756","updated":"2019-10-10 19:26:38.000000000","message":"By the way, if you want to avoid this craziness than don\u0027t extend ServersTestBase, do like ServerMovingTests below and extend ProviderUsageBaseTestCase which provides a much more sane setup that is going to behave closer to a real end user interaction with the API.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1697,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1698,"context_line":"        # Get the migration records"},{"line_number":1699,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_1)"},{"line_number":1700,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1701,"context_line":"        # Get the migration records by not exist project_id"},{"line_number":1702,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_2)"},{"line_number":1703,"context_line":"        self.assertEqual([], migrations)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_3805d510","line":1700,"range":{"start_line":1700,"start_character":36,"end_line":1700,"end_character":49},"updated":"2019-10-10 19:22:16.000000000","message":"Again assert the length on the list of migrations before accessing the 0 index.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1697,"context_line":"        self._wait_for_state_change(found_server, \u0027VERIFY_RESIZE\u0027)"},{"line_number":1698,"context_line":"        # Get the migration records"},{"line_number":1699,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_1)"},{"line_number":1700,"context_line":"        self.assertEqual(server_id, migrations[0][\u0027instance_uuid\u0027])"},{"line_number":1701,"context_line":"        # Get the migration records by not exist project_id"},{"line_number":1702,"context_line":"        migrations \u003d new_admin_api.get_migrations(project_id\u003dproject_id_2)"},{"line_number":1703,"context_line":"        self.assertEqual([], migrations)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_92ff0000","line":1700,"range":{"start_line":1700,"start_character":36,"end_line":1700,"end_character":49},"in_reply_to":"3fa7e38b_3805d510","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/tests/unit/api/openstack/compute/test_migrations.py":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"4b3659d229211d33efd3a3bd3764512de3154ff7","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def test_index_query_duplicate_query_parameters(self):"},{"line_number":242,"context_line":"        migrations \u003d {\u0027migrations\u0027: self._migrations_output()}"},{"line_number":243,"context_line":"        self._remove_unsupport_fields_from_microversion_v276(self.req,"},{"line_number":244,"context_line":"                                                             migrations)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        params \u003d {\u0027host\u0027: \u0027host1\u0027, \u0027status\u0027: \u0027migrating\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_e932caf1","line":243,"updated":"2019-08-06 06:29:13.000000000","message":"The version would be controled in wsgi_api_version, so this test case with \u003c 2.76 will not bring the response with new coming field.","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"901d58835dfa2b3872fddded77786796de97683c","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def test_index_query_duplicate_query_parameters(self):"},{"line_number":242,"context_line":"        migrations \u003d {\u0027migrations\u0027: self._migrations_output()}"},{"line_number":243,"context_line":"        self._remove_unsupport_fields_from_microversion_v276(self.req,"},{"line_number":244,"context_line":"                                                             migrations)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        params \u003d {\u0027host\u0027: \u0027host1\u0027, \u0027status\u0027: \u0027migrating\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_e2e3bf32","line":243,"in_reply_to":"7faddb67_e932caf1","updated":"2019-08-06 09:38:00.000000000","message":"self._migrations_output(), it\u0027s data from the Migration object, that I am inherited by \"MigrationTestCaseV266\", so the \u0027migrations_obj\u0027 should has \u0027user_id\u0027 and \u0027project_id\u0027, I think this handled this way is ok.","commit_id":"a4c3a5a4a5cd5447256a339480b05981df52df59"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                if \u0027user_id\u0027 in items:"},{"line_number":219,"context_line":"                    del items[\u0027user_id\u0027]"},{"line_number":220,"context_line":"                if \u0027project_id\u0027 in items:"},{"line_number":221,"context_line":"                    del items[\u0027project_id\u0027]"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def test_index_query_allow_negative_int_as_string(self):"},{"line_number":224,"context_line":"        migrations \u003d {\u0027migrations\u0027: self._migrations_output()}"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_0756bf5d","line":221,"updated":"2019-09-10 22:55:25.000000000","message":"Looking at nova/api/openstack/compute/migrations.py _output method, I don\u0027t understand why this is needed. The user_id and project_id fields are already being removed if 2.80 is not supported (for old test cases).","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                if \u0027user_id\u0027 in items:"},{"line_number":219,"context_line":"                    del items[\u0027user_id\u0027]"},{"line_number":220,"context_line":"                if \u0027project_id\u0027 in items:"},{"line_number":221,"context_line":"                    del items[\u0027project_id\u0027]"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def test_index_query_allow_negative_int_as_string(self):"},{"line_number":224,"context_line":"        migrations \u003d {\u0027migrations\u0027: self._migrations_output()}"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_89d5de45","line":221,"in_reply_to":"5faad753_0756bf5d","updated":"2019-09-11 07:12:30.000000000","message":"Yeah, it\u0027s not necessary, removed it.\n\nBefore I think I init the fake_migrations [1], added the user_id/project_id, here add this _remove_unsupport_fields_from_microversion_v280() function, beacause of the [2] not handle, it\u0027s my error, changed the _output() function in nova/api/openstack/compute/migrations.py as Matt said.\n\n[1]https://review.opendev.org/#/c/673990/18/nova/tests/unit/api/openstack/compute/test_migrations.py@32\n[2]https://review.opendev.org/#/c/674243/25/nova/api/openstack/compute/migrations.py@66","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":451,"context_line":"class MigrationsTestCaseV280(MigrationTestCaseV266):"},{"line_number":452,"context_line":"    wsgi_api_version \u003d \u00272.80\u0027"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"    def test_index(self):"},{"line_number":455,"context_line":"        migrations \u003d {\u0027migrations\u0027: self.controller._output("},{"line_number":456,"context_line":"                                        self.req, migrations_obj,"},{"line_number":457,"context_line":"                                        add_link\u003dTrue, add_uuid\u003dTrue,"},{"line_number":458,"context_line":"                                        add_user_project\u003dTrue)}"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"        for i, mig in enumerate(migrations[\u0027migrations\u0027]):"},{"line_number":461,"context_line":"            # first item is in-progress live migration"},{"line_number":462,"context_line":"            if i \u003d\u003d 0:"},{"line_number":463,"context_line":"                self.assertIn(\u0027links\u0027, mig)"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                self.assertNotIn(\u0027links\u0027, mig)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"            self.assertIn(\u0027migration_type\u0027, mig)"},{"line_number":468,"context_line":"            self.assertIn(\u0027id\u0027, mig)"},{"line_number":469,"context_line":"            self.assertIn(\u0027uuid\u0027, mig)"},{"line_number":470,"context_line":"            self.assertIn(\u0027user_id\u0027, mig)"},{"line_number":471,"context_line":"            self.assertIn(\u0027project_id\u0027, mig)"},{"line_number":472,"context_line":"            self.assertNotIn(\u0027deleted\u0027, mig)"},{"line_number":473,"context_line":"            self.assertNotIn(\u0027deleted_at\u0027, mig)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        with mock.patch.object(self.controller.compute_api,"},{"line_number":476,"context_line":"                               \u0027get_migrations_sorted\u0027) as m_get:"},{"line_number":477,"context_line":"            m_get.return_value \u003d migrations_obj"},{"line_number":478,"context_line":"            response \u003d self.controller.index(self.req)"},{"line_number":479,"context_line":"            self.assertEqual(migrations, response)"},{"line_number":480,"context_line":"            self.assertIn(\u0027links\u0027, response[\u0027migrations\u0027][0])"},{"line_number":481,"context_line":"            self.assertIn(\u0027migration_type\u0027, response[\u0027migrations\u0027][0])"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_sorted\u0027)"},{"line_number":484,"context_line":"    def test_index_with_user_id(self, get_migrations_sorted):"},{"line_number":485,"context_line":"        get_migrations_sorted.return_value \u003d objects.MigrationList()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        user_id \u003d \u002757c9bfb9-0703-4260-9555-7f07ba66a2b2\u0027"},{"line_number":488,"context_line":"        req \u003d fakes.HTTPRequest.blank("},{"line_number":489,"context_line":"            \u0027/os-migrations?user_id\u003d%s\u0027 % user_id,"},{"line_number":490,"context_line":"            version\u003dself.wsgi_api_version,"},{"line_number":491,"context_line":"            use_admin_context\u003dTrue)"},{"line_number":492,"context_line":"        filters \u003d {"},{"line_number":493,"context_line":"            \u0027user_id\u0027: user_id"},{"line_number":494,"context_line":"        }"},{"line_number":495,"context_line":"        self.controller.index(req)"},{"line_number":496,"context_line":"        get_migrations_sorted.assert_called_once_with("},{"line_number":497,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":498,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_sorted\u0027)"},{"line_number":501,"context_line":"    def test_index_with_project_id(self, get_migrations_sorted):"},{"line_number":502,"context_line":"        get_migrations_sorted.return_value \u003d objects.MigrationList()"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        project_id \u003d \u0027913003a8-1b60-43d2-89aa-93085071ba35\u0027"},{"line_number":505,"context_line":"        req \u003d fakes.HTTPRequest.blank("},{"line_number":506,"context_line":"            \u0027/os-migrations?project_id\u003d%s\u0027 % project_id,"},{"line_number":507,"context_line":"            version\u003dself.wsgi_api_version,"},{"line_number":508,"context_line":"            use_admin_context\u003dTrue)"},{"line_number":509,"context_line":"        filters \u003d {"},{"line_number":510,"context_line":"            \u0027project_id\u0027: project_id"},{"line_number":511,"context_line":"        }"},{"line_number":512,"context_line":"        self.controller.index(req)"},{"line_number":513,"context_line":"        get_migrations_sorted.assert_called_once_with("},{"line_number":514,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":515,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_sorted\u0027)"},{"line_number":518,"context_line":"    def test_index_with_user_id_and_project_id(self,"},{"line_number":519,"context_line":"                                               get_migrations_sorted):"},{"line_number":520,"context_line":"        get_migrations_sorted.return_value \u003d objects.MigrationList()"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        user_id \u003d \u002757c9bfb9-0703-4260-9555-7f07ba66a2b2\u0027"},{"line_number":523,"context_line":"        project_id \u003d \u0027913003a8-1b60-43d2-89aa-93085071ba35\u0027"},{"line_number":524,"context_line":"        req \u003d fakes.HTTPRequest.blank("},{"line_number":525,"context_line":"            \u0027/os-migrations?user_id\u003d%s\u0026project_id\u003d%s\u0027"},{"line_number":526,"context_line":"            % (user_id, project_id),"},{"line_number":527,"context_line":"            version\u003dself.wsgi_api_version,"},{"line_number":528,"context_line":"            use_admin_context\u003dTrue)"},{"line_number":529,"context_line":"        filters \u003d {"},{"line_number":530,"context_line":"            \u0027user_id\u0027: user_id,"},{"line_number":531,"context_line":"            \u0027project_id\u0027: project_id"},{"line_number":532,"context_line":"        }"},{"line_number":533,"context_line":"        self.controller.index(req)"},{"line_number":534,"context_line":"        get_migrations_sorted.assert_called_once_with("},{"line_number":535,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":536,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations\u0027,"},{"line_number":539,"context_line":"                return_value\u003dmigrations_obj)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_d815a13e","line":536,"range":{"start_line":454,"start_character":0,"end_line":536,"end_character":56},"updated":"2019-10-10 19:22:16.000000000","message":"These tests are all redundant with the functional tests, correct? Why do we need these?","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":451,"context_line":"class MigrationsTestCaseV280(MigrationTestCaseV266):"},{"line_number":452,"context_line":"    wsgi_api_version \u003d \u00272.80\u0027"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"    def test_index(self):"},{"line_number":455,"context_line":"        migrations \u003d {\u0027migrations\u0027: self.controller._output("},{"line_number":456,"context_line":"                                        self.req, migrations_obj,"},{"line_number":457,"context_line":"                                        add_link\u003dTrue, add_uuid\u003dTrue,"},{"line_number":458,"context_line":"                                        add_user_project\u003dTrue)}"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"        for i, mig in enumerate(migrations[\u0027migrations\u0027]):"},{"line_number":461,"context_line":"            # first item is in-progress live migration"},{"line_number":462,"context_line":"            if i \u003d\u003d 0:"},{"line_number":463,"context_line":"                self.assertIn(\u0027links\u0027, mig)"},{"line_number":464,"context_line":"            else:"},{"line_number":465,"context_line":"                self.assertNotIn(\u0027links\u0027, mig)"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"            self.assertIn(\u0027migration_type\u0027, mig)"},{"line_number":468,"context_line":"            self.assertIn(\u0027id\u0027, mig)"},{"line_number":469,"context_line":"            self.assertIn(\u0027uuid\u0027, mig)"},{"line_number":470,"context_line":"            self.assertIn(\u0027user_id\u0027, mig)"},{"line_number":471,"context_line":"            self.assertIn(\u0027project_id\u0027, mig)"},{"line_number":472,"context_line":"            self.assertNotIn(\u0027deleted\u0027, mig)"},{"line_number":473,"context_line":"            self.assertNotIn(\u0027deleted_at\u0027, mig)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        with mock.patch.object(self.controller.compute_api,"},{"line_number":476,"context_line":"                               \u0027get_migrations_sorted\u0027) as m_get:"},{"line_number":477,"context_line":"            m_get.return_value \u003d migrations_obj"},{"line_number":478,"context_line":"            response \u003d self.controller.index(self.req)"},{"line_number":479,"context_line":"            self.assertEqual(migrations, response)"},{"line_number":480,"context_line":"            self.assertIn(\u0027links\u0027, response[\u0027migrations\u0027][0])"},{"line_number":481,"context_line":"            self.assertIn(\u0027migration_type\u0027, response[\u0027migrations\u0027][0])"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_sorted\u0027)"},{"line_number":484,"context_line":"    def test_index_with_user_id(self, get_migrations_sorted):"},{"line_number":485,"context_line":"        get_migrations_sorted.return_value \u003d objects.MigrationList()"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        user_id \u003d \u002757c9bfb9-0703-4260-9555-7f07ba66a2b2\u0027"},{"line_number":488,"context_line":"        req \u003d fakes.HTTPRequest.blank("},{"line_number":489,"context_line":"            \u0027/os-migrations?user_id\u003d%s\u0027 % user_id,"},{"line_number":490,"context_line":"            version\u003dself.wsgi_api_version,"},{"line_number":491,"context_line":"            use_admin_context\u003dTrue)"},{"line_number":492,"context_line":"        filters \u003d {"},{"line_number":493,"context_line":"            \u0027user_id\u0027: user_id"},{"line_number":494,"context_line":"        }"},{"line_number":495,"context_line":"        self.controller.index(req)"},{"line_number":496,"context_line":"        get_migrations_sorted.assert_called_once_with("},{"line_number":497,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":498,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_sorted\u0027)"},{"line_number":501,"context_line":"    def test_index_with_project_id(self, get_migrations_sorted):"},{"line_number":502,"context_line":"        get_migrations_sorted.return_value \u003d objects.MigrationList()"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        project_id \u003d \u0027913003a8-1b60-43d2-89aa-93085071ba35\u0027"},{"line_number":505,"context_line":"        req \u003d fakes.HTTPRequest.blank("},{"line_number":506,"context_line":"            \u0027/os-migrations?project_id\u003d%s\u0027 % project_id,"},{"line_number":507,"context_line":"            version\u003dself.wsgi_api_version,"},{"line_number":508,"context_line":"            use_admin_context\u003dTrue)"},{"line_number":509,"context_line":"        filters \u003d {"},{"line_number":510,"context_line":"            \u0027project_id\u0027: project_id"},{"line_number":511,"context_line":"        }"},{"line_number":512,"context_line":"        self.controller.index(req)"},{"line_number":513,"context_line":"        get_migrations_sorted.assert_called_once_with("},{"line_number":514,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":515,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_sorted\u0027)"},{"line_number":518,"context_line":"    def test_index_with_user_id_and_project_id(self,"},{"line_number":519,"context_line":"                                               get_migrations_sorted):"},{"line_number":520,"context_line":"        get_migrations_sorted.return_value \u003d objects.MigrationList()"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        user_id \u003d \u002757c9bfb9-0703-4260-9555-7f07ba66a2b2\u0027"},{"line_number":523,"context_line":"        project_id \u003d \u0027913003a8-1b60-43d2-89aa-93085071ba35\u0027"},{"line_number":524,"context_line":"        req \u003d fakes.HTTPRequest.blank("},{"line_number":525,"context_line":"            \u0027/os-migrations?user_id\u003d%s\u0026project_id\u003d%s\u0027"},{"line_number":526,"context_line":"            % (user_id, project_id),"},{"line_number":527,"context_line":"            version\u003dself.wsgi_api_version,"},{"line_number":528,"context_line":"            use_admin_context\u003dTrue)"},{"line_number":529,"context_line":"        filters \u003d {"},{"line_number":530,"context_line":"            \u0027user_id\u0027: user_id,"},{"line_number":531,"context_line":"            \u0027project_id\u0027: project_id"},{"line_number":532,"context_line":"        }"},{"line_number":533,"context_line":"        self.controller.index(req)"},{"line_number":534,"context_line":"        get_migrations_sorted.assert_called_once_with("},{"line_number":535,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":536,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations\u0027,"},{"line_number":539,"context_line":"                return_value\u003dmigrations_obj)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_f2df5463","line":536,"range":{"start_line":454,"start_character":0,"end_line":536,"end_character":56},"in_reply_to":"3fa7e38b_d815a13e","updated":"2019-10-11 04:39:11.000000000","message":"Yeah, some repeat with the functional tests. But I think I need to rewrite the test_index(), because of the user_id/project_id should add the index\u0027s response, otherwise it will render reference !\u003dactual.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":535,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":536,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations\u0027,"},{"line_number":539,"context_line":"                return_value\u003dmigrations_obj)"},{"line_number":540,"context_line":"    def test_index_filter_by_user_id_pre_v280(self, get_migrations):"},{"line_number":541,"context_line":"        \"\"\"Tests that the migrations by user_id query parameter"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_789b4dc8","line":538,"updated":"2019-10-10 19:22:16.000000000","message":"Why is this needed? If we fail the schema check we shouldn\u0027t even call this.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":535,"context_line":"            req.environ[\u0027nova.context\u0027], filters, sort_dirs\u003dmock.ANY,"},{"line_number":536,"context_line":"            sort_keys\u003dmock.ANY, limit\u003d1000, marker\u003dNone)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations\u0027,"},{"line_number":539,"context_line":"                return_value\u003dmigrations_obj)"},{"line_number":540,"context_line":"    def test_index_filter_by_user_id_pre_v280(self, get_migrations):"},{"line_number":541,"context_line":"        \"\"\"Tests that the migrations by user_id query parameter"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_b2d79c4b","line":538,"in_reply_to":"3fa7e38b_789b4dc8","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        self.assertIn(\u0027Additional properties are not allowed\u0027,"},{"line_number":550,"context_line":"                      six.text_type(ex))"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations\u0027,"},{"line_number":553,"context_line":"                return_value\u003dmigrations_obj)"},{"line_number":554,"context_line":"    def test_index_filter_by_project_id_pre_v280(self, get_migrations):"},{"line_number":555,"context_line":"        \"\"\"Tests that the migrations by project_id query parameter"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_b88d457d","line":552,"updated":"2019-10-10 19:22:16.000000000","message":"same","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        self.assertIn(\u0027Additional properties are not allowed\u0027,"},{"line_number":550,"context_line":"                      six.text_type(ex))"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations\u0027,"},{"line_number":553,"context_line":"                return_value\u003dmigrations_obj)"},{"line_number":554,"context_line":"    def test_index_filter_by_project_id_pre_v280(self, get_migrations):"},{"line_number":555,"context_line":"        \"\"\"Tests that the migrations by project_id query parameter"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_52c8a8a6","line":552,"in_reply_to":"3fa7e38b_b88d457d","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"nova/tests/unit/api/openstack/compute/test_server_migrations.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        _do_test()"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"class ServerMigrationsTestsV280(ServerMigrationsTestsV223):"},{"line_number":372,"context_line":"    wsgi_api_version \u003d \u00272.80\u0027"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_d84da13b","line":371,"range":{"start_line":371,"start_character":32,"end_line":371,"end_character":57},"updated":"2019-10-10 19:22:16.000000000","message":"Why not extend ServerMigrationsTestsV265 here?","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        _do_test()"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"class ServerMigrationsTestsV280(ServerMigrationsTestsV223):"},{"line_number":372,"context_line":"    wsgi_api_version \u003d \u00272.80\u0027"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_520bc8d3","line":371,"range":{"start_line":371,"start_character":32,"end_line":371,"end_character":57},"in_reply_to":"3fa7e38b_d84da13b","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                                           use_admin_context\u003dTrue)"},{"line_number":378,"context_line":"        self.context \u003d self.req.environ[\u0027nova.context\u0027]"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_in_progress_by_instance\u0027)"},{"line_number":381,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get\u0027)"},{"line_number":382,"context_line":"    def test_index(self, m_get_instance, m_get_mig):"},{"line_number":383,"context_line":"        migrations \u003d [server_migrations.output("},{"line_number":384,"context_line":"            mig, include_uuid\u003dTrue, include_user_project\u003dTrue)"},{"line_number":385,"context_line":"            for mig in migrations_obj]"},{"line_number":386,"context_line":"        migrations_in_progress \u003d {\u0027migrations\u0027: migrations}"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        for mig in migrations_in_progress[\u0027migrations\u0027]:"},{"line_number":389,"context_line":"            self.assertIn(\u0027id\u0027, mig)"},{"line_number":390,"context_line":"            self.assertNotIn(\u0027deleted\u0027, mig)"},{"line_number":391,"context_line":"            self.assertNotIn(\u0027deleted_at\u0027, mig)"},{"line_number":392,"context_line":"            self.assertIn(\u0027user_id\u0027, mig)"},{"line_number":393,"context_line":"            self.assertIn(\u0027project_id\u0027, mig)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        m_get_mig.return_value \u003d migrations_obj"},{"line_number":396,"context_line":"        response \u003d self.controller.index(self.req, SERVER_UUID)"},{"line_number":397,"context_line":"        self.assertEqual(migrations_in_progress, response)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        m_get_instance.assert_called_once_with(self.context, SERVER_UUID,"},{"line_number":400,"context_line":"                                               expected_attrs\u003dNone,"},{"line_number":401,"context_line":"                                               cell_down_support\u003dFalse)"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migration_by_id_and_instance\u0027)"},{"line_number":404,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get\u0027)"},{"line_number":405,"context_line":"    def test_show(self, m_get_instance, m_get_mig):"},{"line_number":406,"context_line":"        migrations \u003d [server_migrations.output("},{"line_number":407,"context_line":"            mig, include_uuid\u003dTrue, include_user_project\u003dTrue)"},{"line_number":408,"context_line":"            for mig in migrations_obj]"},{"line_number":409,"context_line":"        m_get_mig.return_value \u003d migrations_obj[0]"},{"line_number":410,"context_line":"        response \u003d self.controller.show(self.req, SERVER_UUID,"},{"line_number":411,"context_line":"                                        migrations_obj[0].id)"},{"line_number":412,"context_line":"        self.assertEqual(migrations[0], response[\u0027migration\u0027])"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        m_get_instance.assert_called_once_with(self.context, SERVER_UUID,"},{"line_number":415,"context_line":"                                               expected_attrs\u003dNone,"},{"line_number":416,"context_line":"                                               cell_down_support\u003dFalse)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"class ServerMigrationsPolicyEnforcementV21(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_d8fb61bb","line":416,"range":{"start_line":380,"start_character":4,"end_line":416,"end_character":71},"updated":"2019-10-10 19:22:16.000000000","message":"These tests are redundant with the functional tests correct? What value do they add?","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                                           use_admin_context\u003dTrue)"},{"line_number":378,"context_line":"        self.context \u003d self.req.environ[\u0027nova.context\u0027]"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migrations_in_progress_by_instance\u0027)"},{"line_number":381,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get\u0027)"},{"line_number":382,"context_line":"    def test_index(self, m_get_instance, m_get_mig):"},{"line_number":383,"context_line":"        migrations \u003d [server_migrations.output("},{"line_number":384,"context_line":"            mig, include_uuid\u003dTrue, include_user_project\u003dTrue)"},{"line_number":385,"context_line":"            for mig in migrations_obj]"},{"line_number":386,"context_line":"        migrations_in_progress \u003d {\u0027migrations\u0027: migrations}"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        for mig in migrations_in_progress[\u0027migrations\u0027]:"},{"line_number":389,"context_line":"            self.assertIn(\u0027id\u0027, mig)"},{"line_number":390,"context_line":"            self.assertNotIn(\u0027deleted\u0027, mig)"},{"line_number":391,"context_line":"            self.assertNotIn(\u0027deleted_at\u0027, mig)"},{"line_number":392,"context_line":"            self.assertIn(\u0027user_id\u0027, mig)"},{"line_number":393,"context_line":"            self.assertIn(\u0027project_id\u0027, mig)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        m_get_mig.return_value \u003d migrations_obj"},{"line_number":396,"context_line":"        response \u003d self.controller.index(self.req, SERVER_UUID)"},{"line_number":397,"context_line":"        self.assertEqual(migrations_in_progress, response)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        m_get_instance.assert_called_once_with(self.context, SERVER_UUID,"},{"line_number":400,"context_line":"                                               expected_attrs\u003dNone,"},{"line_number":401,"context_line":"                                               cell_down_support\u003dFalse)"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get_migration_by_id_and_instance\u0027)"},{"line_number":404,"context_line":"    @mock.patch(\u0027nova.compute.api.API.get\u0027)"},{"line_number":405,"context_line":"    def test_show(self, m_get_instance, m_get_mig):"},{"line_number":406,"context_line":"        migrations \u003d [server_migrations.output("},{"line_number":407,"context_line":"            mig, include_uuid\u003dTrue, include_user_project\u003dTrue)"},{"line_number":408,"context_line":"            for mig in migrations_obj]"},{"line_number":409,"context_line":"        m_get_mig.return_value \u003d migrations_obj[0]"},{"line_number":410,"context_line":"        response \u003d self.controller.show(self.req, SERVER_UUID,"},{"line_number":411,"context_line":"                                        migrations_obj[0].id)"},{"line_number":412,"context_line":"        self.assertEqual(migrations[0], response[\u0027migration\u0027])"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        m_get_instance.assert_called_once_with(self.context, SERVER_UUID,"},{"line_number":415,"context_line":"                                               expected_attrs\u003dNone,"},{"line_number":416,"context_line":"                                               cell_down_support\u003dFalse)"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"class ServerMigrationsPolicyEnforcementV21(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_32f64cd9","line":416,"range":{"start_line":380,"start_character":4,"end_line":416,"end_character":71},"in_reply_to":"3fa7e38b_d8fb61bb","updated":"2019-10-11 04:39:11.000000000","message":"Removed","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}],"releasenotes/notes/bp-add-user-id-field-to-the-migrations-table-af5989e74634b9c4.yaml":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"cfe23f4ab5cb0fec149076e886d5deb6f49676ac","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    In this microversion, expose the ``user_id`` and ``project_id``"},{"line_number":10,"context_line":"    fields in the following APIs:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    * GET /os-migrations"},{"line_number":13,"context_line":"    * GET /servers/{server_id}/migrations"},{"line_number":14,"context_line":"    * GET /servers/{server_id}/migrations/{migration_id}"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5faad753_95276b65","line":12,"range":{"start_line":12,"start_character":6,"end_line":12,"end_character":24},"updated":"2019-09-09 05:43:25.000000000","message":"``GET /os-migrations``","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"6cab92c20cb5239bdfc6e49891f1d4429e74fe90","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    In this microversion, expose the ``user_id`` and ``project_id``"},{"line_number":10,"context_line":"    fields in the following APIs:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    * GET /os-migrations"},{"line_number":13,"context_line":"    * GET /servers/{server_id}/migrations"},{"line_number":14,"context_line":"    * GET /servers/{server_id}/migrations/{migration_id}"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":23,"id":"5faad753_b53f07d5","line":12,"range":{"start_line":12,"start_character":6,"end_line":12,"end_character":24},"in_reply_to":"5faad753_95276b65","updated":"2019-09-09 06:42:42.000000000","message":"Done","commit_id":"1bb70792455904926ec5abd8e435c1ee5b01f192"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0df73eb69bc1ca1260478d2ab180f296e5a8bcc7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Microversion 2.80 adds these optional parameters ``user_id`` and"},{"line_number":5,"context_line":"    ``project_id`` to the os-migrations API. When creating a Migration"},{"line_number":6,"context_line":"    record, store the ``user_id`` and ``project_id`` from the request"},{"line_number":7,"context_line":"    context, similar to an InstanceAction record."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_a7ca4b17","line":4,"range":{"start_line":4,"start_character":42,"end_line":4,"end_character":52},"updated":"2019-09-10 22:55:25.000000000","message":"query parameters","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Microversion 2.80 adds these optional parameters ``user_id`` and"},{"line_number":5,"context_line":"    ``project_id`` to the os-migrations API. When creating a Migration"},{"line_number":6,"context_line":"    record, store the ``user_id`` and ``project_id`` from the request"},{"line_number":7,"context_line":"    context, similar to an InstanceAction record."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_a96d3a99","line":4,"range":{"start_line":4,"start_character":42,"end_line":4,"end_character":52},"in_reply_to":"5faad753_a7ca4b17","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"36691bc60acb3e60752f5a111b6dd9c1871f4970","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    The ``GET /os-migrations`` API will also have optional ``user_id`` and"},{"line_number":17,"context_line":"    ``project_id`` query parameters for filtering migrations by user and/or"},{"line_number":18,"context_line":"    project:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * ``GET /os-migrations?user_id\u003def9d34b4-45d0-4530-871b-3fb535988394``"},{"line_number":21,"context_line":"    * ``GET /os-migrations?project_id\u003d011ee9f4-8f16-4c38-8633-a254d420fd54``"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_bdda5c14","line":18,"range":{"start_line":18,"start_character":11,"end_line":18,"end_character":12},"updated":"2019-09-11 01:38:25.000000000","message":", for example:","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"4f5073c0426011eb6ec9d4770bbcbb458430ca02","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    The ``GET /os-migrations`` API will also have optional ``user_id`` and"},{"line_number":17,"context_line":"    ``project_id`` query parameters for filtering migrations by user and/or"},{"line_number":18,"context_line":"    project:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * ``GET /os-migrations?user_id\u003def9d34b4-45d0-4530-871b-3fb535988394``"},{"line_number":21,"context_line":"    * ``GET /os-migrations?project_id\u003d011ee9f4-8f16-4c38-8633-a254d420fd54``"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"5faad753_a9545acb","line":18,"range":{"start_line":18,"start_character":11,"end_line":18,"end_character":12},"in_reply_to":"5faad753_bdda5c14","updated":"2019-09-11 07:12:30.000000000","message":"Done","commit_id":"cd9fe3bc91f4e3b1d9c49f3a09eb05e2efb80e8d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Microversion 2.80 adds these optional query parameters ``user_id`` and"},{"line_number":5,"context_line":"    ``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":6,"context_line":"    store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":7,"context_line":"    to an InstanceAction record."}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_58de913e","line":4,"range":{"start_line":4,"start_character":27,"end_line":4,"end_character":32},"updated":"2019-10-10 19:22:16.000000000","message":"nix this word","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Microversion 2.80 adds these optional query parameters ``user_id`` and"},{"line_number":5,"context_line":"    ``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":6,"context_line":"    store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":7,"context_line":"    to an InstanceAction record."}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_922e2041","line":4,"range":{"start_line":4,"start_character":27,"end_line":4,"end_character":32},"in_reply_to":"3fa7e38b_58de913e","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Microversion 2.80 adds these optional query parameters ``user_id`` and"},{"line_number":5,"context_line":"    ``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":6,"context_line":"    store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":7,"context_line":"    to an InstanceAction record."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    In this microversion, expose the ``user_id`` and ``project_id``"},{"line_number":10,"context_line":"    fields in the following APIs:"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_f8e65d16","line":7,"range":{"start_line":5,"start_character":45,"end_line":7,"end_character":32},"updated":"2019-10-10 19:22:16.000000000","message":"Again we don\u0027t need this in user-facing docs.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Microversion 2.80 adds these optional query parameters ``user_id`` and"},{"line_number":5,"context_line":"    ``project_id`` to the os-migrations API. When creating a Migration record,"},{"line_number":6,"context_line":"    store the ``user_id`` and ``project_id`` from the request context, similar"},{"line_number":7,"context_line":"    to an InstanceAction record."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    In this microversion, expose the ``user_id`` and ``project_id``"},{"line_number":10,"context_line":"    fields in the following APIs:"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_b2331cab","line":7,"range":{"start_line":5,"start_character":45,"end_line":7,"end_character":32},"in_reply_to":"3fa7e38b_f8e65d16","updated":"2019-10-11 04:39:11.000000000","message":"Done","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d35220a109703219259297c81704c3418f1acb6b","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    * ``GET /servers/{server_id}/migrations``"},{"line_number":14,"context_line":"    * ``GET /servers/{server_id}/migrations/{migration_id}``"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    The ``GET /os-migrations`` API will also have optional ``user_id`` and"},{"line_number":17,"context_line":"    ``project_id`` query parameters for filtering migrations by user and/or"},{"line_number":18,"context_line":"    project, for example:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * ``GET /os-migrations?user_id\u003def9d34b4-45d0-4530-871b-3fb535988394``"},{"line_number":21,"context_line":"    * ``GET /os-migrations?project_id\u003d011ee9f4-8f16-4c38-8633-a254d420fd54``"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_b873054e","line":18,"range":{"start_line":16,"start_character":4,"end_line":18,"end_character":11},"updated":"2019-10-10 19:22:16.000000000","message":"Again this is redundant with the first sentence above, so we could probably remove the first sentence entirely as long as we mention microversion 2.80 does these new things somewhere.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"7f3bea73d6f2069c4e2d2cfa549d35cb66f4448d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    * ``GET /servers/{server_id}/migrations``"},{"line_number":14,"context_line":"    * ``GET /servers/{server_id}/migrations/{migration_id}``"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    The ``GET /os-migrations`` API will also have optional ``user_id`` and"},{"line_number":17,"context_line":"    ``project_id`` query parameters for filtering migrations by user and/or"},{"line_number":18,"context_line":"    project, for example:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    * ``GET /os-migrations?user_id\u003def9d34b4-45d0-4530-871b-3fb535988394``"},{"line_number":21,"context_line":"    * ``GET /os-migrations?project_id\u003d011ee9f4-8f16-4c38-8633-a254d420fd54``"}],"source_content_type":"text/x-yaml","patch_set":30,"id":"3fa7e38b_52242860","line":18,"range":{"start_line":16,"start_character":4,"end_line":18,"end_character":11},"in_reply_to":"3fa7e38b_b873054e","updated":"2019-10-11 04:39:11.000000000","message":"Re-write the fist sentence above.","commit_id":"a46df3527ae464fce2e52ed58d5444854793f07a"}]}
