)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     zhangbailin \u003czhangbailin@inspur.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-06-11 19:46:12 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Specify availability_zone to unshelve"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support for specifying az to an unshelve a unshelved offloaded server."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9fb8cfa7_ab73a815","line":7,"updated":"2019-06-11 18:30:27.000000000","message":"You should prefix the commit title with \"WIP: \" while you work on this change since it obviously needs work - you don\u0027t even have any tests yet.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     zhangbailin \u003czhangbailin@inspur.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-06-11 19:46:12 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Specify availability_zone to unshelve"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support for specifying az to an unshelve a unshelved offloaded server."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9fb8cfa7_47969395","line":7,"in_reply_to":"9fb8cfa7_ab73a815","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Specify availability_zone to unshelve"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support for specifying az to an unshelve a unshelved offloaded server."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Blueprint: support-specifying-az-when-restore-shelved-server"},{"line_number":12,"context_line":"Closes-Bug: #1723880"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9fb8cfa7_6b637043","line":9,"range":{"start_line":9,"start_character":43,"end_line":9,"end_character":52},"updated":"2019-06-11 18:30:27.000000000","message":"shelve","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Specify availability_zone to unshelve"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support for specifying az to an unshelve a unshelved offloaded server."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Blueprint: support-specifying-az-when-restore-shelved-server"},{"line_number":12,"context_line":"Closes-Bug: #1723880"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9fb8cfa7_0745fb42","line":9,"range":{"start_line":9,"start_character":43,"end_line":9,"end_character":52},"in_reply_to":"9fb8cfa7_6b637043","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"f513b909b1c6149012c7634aeea158add8dfe44f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support for specifying az to an unshelve a shelve offloaded server."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Blueprint: support-specifying-az-when-restore-shelved-server"},{"line_number":12,"context_line":"Closes-Bug: #1723880"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I4b13483eef42bed91d69eabf1f30762d6866f957"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9fb8cfa7_61cd9e83","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":60},"updated":"2019-06-14 00:38:45.000000000","message":"s/Implements: blueprint support-specifying-az-when-restore-shelved-server","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Specify availability_zone to unshelve"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support for specifying az to an unshelve a shelve offloaded server."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Implements: blueprint support-specifying-az-when-restore-shelved-server"},{"line_number":12,"context_line":"Closes-Bug: #1723880"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"7faddb67_e2d50a44","line":9,"updated":"2019-08-20 23:03:11.000000000","message":"Let\u0027s re-word this with something like:\n\n\"This adds support, in a new microversion, for specifying an availability zone to the unshelve server action when the server is shelved offloaded.\"","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"c29331ca6cd90e5161c53041c79d13f2b2c1d57a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Specify availability_zone to unshelve"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support for specifying az to an unshelve a shelve offloaded server."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Implements: blueprint support-specifying-az-when-restore-shelved-server"},{"line_number":12,"context_line":"Closes-Bug: #1723880"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"7faddb67_b708ae26","line":9,"in_reply_to":"7faddb67_e2d50a44","updated":"2019-08-21 11:54:40.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds support, in a new microversion, for specifying an availability"},{"line_number":10,"context_line":"zone to the unshelve server action when the server is shelved offloaded."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint support-specifying-az-when-restore-shelved-server"},{"line_number":13,"context_line":"Closes-Bug: #1723880"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"7faddb67_24dd03dd","line":11,"updated":"2019-08-27 14:53:25.000000000","message":"nit: it would probably be good to mention for other reviewers that the functional test changes are due to those tests using the \"latest\" microversion where an empty dict is not allowed for unshelve with 2.77 so the value is changed from an empty dict to None.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds support, in a new microversion, for specifying an availability"},{"line_number":10,"context_line":"zone to the unshelve server action when the server is shelved offloaded."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint support-specifying-az-when-restore-shelved-server"},{"line_number":13,"context_line":"Closes-Bug: #1723880"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"7faddb67_7c063388","line":11,"in_reply_to":"7faddb67_24dd03dd","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":1774,"context_line":"  type: array"},{"line_number":1775,"context_line":"availability_zone_optional:"},{"line_number":1776,"context_line":"  description: |"},{"line_number":1777,"context_line":"    The availability zone name."},{"line_number":1778,"context_line":"  in: body"},{"line_number":1779,"context_line":"  required: false"},{"line_number":1780,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"7faddb67_f175a1fb","line":1777,"range":{"start_line":1777,"start_character":4,"end_line":1777,"end_character":31},"updated":"2019-07-05 06:22:42.000000000","message":"it is better to add more text here for 2 below cases.\n\n1. only work in case of shelved-offload case and 400 if you unshelve the shelve (not shelve-offload) server\n\n2. if cross_az_attach is False then this AZ has to be same as Volume attached to shelved-offload server otherwise it will be 400","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":1774,"context_line":"  type: array"},{"line_number":1775,"context_line":"availability_zone_optional:"},{"line_number":1776,"context_line":"  description: |"},{"line_number":1777,"context_line":"    The availability zone name."},{"line_number":1778,"context_line":"  in: body"},{"line_number":1779,"context_line":"  required: false"},{"line_number":1780,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"7faddb67_16c5bd3c","line":1777,"range":{"start_line":1777,"start_character":4,"end_line":1777,"end_character":31},"in_reply_to":"7faddb67_f175a1fb","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8638b0529cbd73a8faf4ddd09f35a245d8c5248d","unresolved":false,"context_lines":[{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work in case of ``SHELVED_OFFLOADED`` status server and will be"},{"line_number":1801,"context_line":"        return a 400 if you unshelve the shelve (not shelved-offloaded) server."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":1804,"context_line":"        will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":33,"id":"7faddb67_6f684cf3","line":1801,"range":{"start_line":1800,"start_character":8,"end_line":1801,"end_character":79},"updated":"2019-08-19 09:16:00.000000000","message":"how about making it more simpler with rewording\n\n* Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will return 400.","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"477359c88a49f4f9568dab9be24ca8db52b517ae","unresolved":false,"context_lines":[{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work in case of ``SHELVED_OFFLOADED`` status server and will be"},{"line_number":1801,"context_line":"        return a 400 if you unshelve the shelve (not shelved-offloaded) server."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":1804,"context_line":"        will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":33,"id":"7faddb67_7236f304","line":1801,"range":{"start_line":1800,"start_character":8,"end_line":1801,"end_character":79},"in_reply_to":"7faddb67_6f684cf3","updated":"2019-08-19 11:16:53.000000000","message":"perfect ^^","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":1793,"context_line":"  in: body"},{"line_number":1794,"context_line":"  required: true"},{"line_number":1795,"context_line":"  type: array"},{"line_number":1796,"context_line":"availability_zone_optional:"},{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_82ae967e","line":1796,"range":{"start_line":1796,"start_character":18,"end_line":1796,"end_character":26},"updated":"2019-08-20 23:03:11.000000000","message":"Let\u0027s call this variable availability_zone_unshelve.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":1793,"context_line":"  in: body"},{"line_number":1794,"context_line":"  required: true"},{"line_number":1795,"context_line":"  type: array"},{"line_number":1796,"context_line":"availability_zone_optional:"},{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_483c3fc7","line":1796,"range":{"start_line":1796,"start_character":18,"end_line":1796,"end_character":26},"in_reply_to":"7faddb67_82ae967e","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":1801,"context_line":"        return a 400."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_4295fe3e","line":1800,"range":{"start_line":1800,"start_character":4,"end_line":1800,"end_character":6},"updated":"2019-08-20 23:03:11.000000000","message":"This bullet list is indented one tab too far, see how it renders incorrectly:\n\nhttps://storage.gra1.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/logs_51/663851/34/check/build-openstack-api-ref/4e7cd3f/docs/?expanded\u003dunshelve-restore-shelved-server-unshelve-action-detail#id116","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":1801,"context_line":"        return a 400."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_0832c7f2","line":1800,"range":{"start_line":1800,"start_character":4,"end_line":1800,"end_character":6},"in_reply_to":"7faddb67_4295fe3e","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":1801,"context_line":"        return a 400."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":1804,"context_line":"        will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_82953634","line":1801,"range":{"start_line":1800,"start_character":8,"end_line":1801,"end_character":21},"updated":"2019-08-20 23:03:11.000000000","message":"Let\u0027s re-word this as:\n\n\"Specifying an availability zone is only allowed when the server status is ``SHELVED_OFFLOADED`` otherwise a 400 HTTPBadRequest response is returned.\"","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":1797,"context_line":"  description: |"},{"line_number":1798,"context_line":"    The availability zone name."},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":1801,"context_line":"        return a 400."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":1804,"context_line":"        will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_a8561304","line":1801,"range":{"start_line":1800,"start_character":8,"end_line":1801,"end_character":21},"in_reply_to":"7faddb67_82953634","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":1801,"context_line":"        return a 400."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":1804,"context_line":"        will be return a 400."},{"line_number":1805,"context_line":"  in: body"},{"line_number":1806,"context_line":"  required: false"},{"line_number":1807,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_e2bbcac0","line":1804,"range":{"start_line":1802,"start_character":8,"end_line":1804,"end_character":29},"updated":"2019-08-20 23:03:11.000000000","message":"This is not something the end user can be aware of since it\u0027s deployment-specific, config-driven API behavior. This is better left mentioned in the admin docs:\n\nhttps://docs.openstack.org/nova/latest/user/aggregates.html#implications-for-moving-servers\n\nSo let\u0027s remove the mention in the API reference and move it to the docs, which means you can remove the bullet list since there is only one item.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":1801,"context_line":"        return a 400."},{"line_number":1802,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":1803,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":1804,"context_line":"        will be return a 400."},{"line_number":1805,"context_line":"  in: body"},{"line_number":1806,"context_line":"  required: false"},{"line_number":1807,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_a8dcd344","line":1804,"range":{"start_line":1802,"start_character":8,"end_line":1804,"end_character":29},"in_reply_to":"7faddb67_e2bbcac0","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":1803,"context_line":"  description: |"},{"line_number":1804,"context_line":"    The availability zone name. Specifying an availability zone is only"},{"line_number":1805,"context_line":"    allowed when the server status is ``SHELVED_OFFLOADED`` otherwise a"},{"line_number":1806,"context_line":"    400 HTTPBadRequest response is returned."},{"line_number":1807,"context_line":"  in: body"},{"line_number":1808,"context_line":"  required: false"},{"line_number":1809,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":36,"id":"7faddb67_bf8dd97c","line":1806,"range":{"start_line":1806,"start_character":4,"end_line":1806,"end_character":22},"updated":"2019-08-21 19:51:19.000000000","message":"400 or 409 HTTPConflict?","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b928e5dc101f27ec232fae17ffc3413aaf7f6481","unresolved":false,"context_lines":[{"line_number":1803,"context_line":"  description: |"},{"line_number":1804,"context_line":"    The availability zone name. Specifying an availability zone is only"},{"line_number":1805,"context_line":"    allowed when the server status is ``SHELVED_OFFLOADED`` otherwise a"},{"line_number":1806,"context_line":"    400 HTTPBadRequest response is returned."},{"line_number":1807,"context_line":"  in: body"},{"line_number":1808,"context_line":"  required: false"},{"line_number":1809,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":36,"id":"7faddb67_2d3d3c8d","line":1806,"range":{"start_line":1806,"start_character":4,"end_line":1806,"end_character":22},"in_reply_to":"7faddb67_bf8dd97c","updated":"2019-08-22 02:31:36.000000000","message":"Done","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97d42a8332dce74a124f49a85c1d2e10efa7ec35","unresolved":false,"context_lines":[{"line_number":1803,"context_line":"  description: |"},{"line_number":1804,"context_line":"    The availability zone name. Specifying an availability zone is only"},{"line_number":1805,"context_line":"    allowed when the server status is ``SHELVED_OFFLOADED`` otherwise a"},{"line_number":1806,"context_line":"    400 HTTPBadRequest or 409 HTTPConflict response is returned."},{"line_number":1807,"context_line":"  in: body"},{"line_number":1808,"context_line":"  required: false"},{"line_number":1809,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":38,"id":"7faddb67_306ca5cf","line":1806,"updated":"2019-08-22 15:52:22.000000000","message":"Sorry, my question in PS36 was rhetorical - it\u0027s a 409, not a 400. So the \"or\" here is misplaced.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":1803,"context_line":"  description: |"},{"line_number":1804,"context_line":"    The availability zone name. Specifying an availability zone is only"},{"line_number":1805,"context_line":"    allowed when the server status is ``SHELVED_OFFLOADED`` otherwise a"},{"line_number":1806,"context_line":"    400 HTTPBadRequest or 409 HTTPConflict response is returned."},{"line_number":1807,"context_line":"  in: body"},{"line_number":1808,"context_line":"  required: false"},{"line_number":1809,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":38,"id":"7faddb67_fabee3ac","line":1806,"in_reply_to":"7faddb67_306ca5cf","updated":"2019-08-23 00:33:03.000000000","message":"Done\n\nNow UnshelveInstanceInvalidState returns a 409.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"}],"api-ref/source/servers-action-shelve.inc":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8638b0529cbd73a8faf4ddd09f35a245d8c5248d","unresolved":false,"context_lines":[{"line_number":150,"context_line":"  - availability_zone: availability_zone_optional"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"|"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"**Example Unshelve server (unshelve Action)**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":".. literalinclude:: ../../doc/api_samples/os-shelve/os-unshelve.json"},{"line_number":157,"context_line":"   :language: javascript"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Response"}],"source_content_type":"text/x-c++src","patch_set":33,"id":"7faddb67_cf506035","line":157,"range":{"start_line":153,"start_character":0,"end_line":157,"end_character":24},"updated":"2019-08-19 09:16:00.000000000","message":"can we add the 2.77 microversion sample file here which include the availability_zone field also? api-ref example sample files reflect the latest microversion behaviour.","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"477359c88a49f4f9568dab9be24ca8db52b517ae","unresolved":false,"context_lines":[{"line_number":150,"context_line":"  - availability_zone: availability_zone_optional"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"|"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"**Example Unshelve server (unshelve Action)**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":".. literalinclude:: ../../doc/api_samples/os-shelve/os-unshelve.json"},{"line_number":157,"context_line":"   :language: javascript"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Response"}],"source_content_type":"text/x-c++src","patch_set":33,"id":"7faddb67_a52743b6","line":157,"range":{"start_line":153,"start_character":0,"end_line":157,"end_character":24},"in_reply_to":"7faddb67_cf506035","updated":"2019-08-19 11:16:53.000000000","message":"Done","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"  - server_id: server_id_path"},{"line_number":149,"context_line":"  - unshelve: unshelve"},{"line_number":150,"context_line":"  - availability_zone: availability_zone_optional"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"|"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":34,"id":"7faddb67_a2b152e2","line":150,"range":{"start_line":150,"start_character":23,"end_line":150,"end_character":49},"updated":"2019-08-20 23:03:11.000000000","message":"availability_zone_unshelve","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"  - server_id: server_id_path"},{"line_number":149,"context_line":"  - unshelve: unshelve"},{"line_number":150,"context_line":"  - availability_zone: availability_zone_optional"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"|"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":34,"id":"7faddb67_089ba772","line":150,"range":{"start_line":150,"start_character":23,"end_line":150,"end_character":49},"in_reply_to":"7faddb67_a2b152e2","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"**Example Unshelve server (unshelve Action)**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"In 2.77 microversion, support specifying the ``availability_zone`` to unshelve a shelved-offloaded server."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":".. literalinclude:: ../../doc/api_samples/os-shelve/os-unshelve.json"},{"line_number":159,"context_line":"   :language: javascript"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"7faddb67_42cc1e69","line":156,"updated":"2019-08-20 23:03:11.000000000","message":"Unless you\u0027re going to use a 2.77 sample, you can omit this since it\u0027s in the API reference request parameters table already:\n\nhttps://storage.gra1.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/logs_51/663851/34/check/build-openstack-api-ref/4e7cd3f/docs/?expanded\u003dunshelve-restore-shelved-server-unshelve-action-detail#id116","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"**Example Unshelve server (unshelve Action)**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"In 2.77 microversion, support specifying the ``availability_zone`` to unshelve a shelved-offloaded server."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":".. literalinclude:: ../../doc/api_samples/os-shelve/os-unshelve.json"},{"line_number":159,"context_line":"   :language: javascript"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"7faddb67_e892cb4a","line":156,"in_reply_to":"7faddb67_42cc1e69","updated":"2019-08-21 08:16:31.000000000","message":"Yeah, the test generated document shows very clear. It is necessary to review the latest changes to the documentation in the future.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"|"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"**Example Unshelve server (unshelve Action)**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":".. literalinclude:: ../../doc/api_samples/os-shelve/os-unshelve.json"},{"line_number":157,"context_line":"   :language: javascript"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Response"}],"source_content_type":"text/x-c++src","patch_set":42,"id":"7faddb67_a4ea5371","line":157,"range":{"start_line":154,"start_character":0,"end_line":157,"end_character":24},"updated":"2019-08-27 14:53:25.000000000","message":"Since there are so few request examples for unshelve, and this is the first time we\u0027ve added a request body for the action, we should probably also have a 2.77 sample here with the az name provided.\n\nTo be clear, you\u0027d add another example using doc/api_samples/os-shelve/v2.77/os-unshelve.json - see other API references for examples of how we do this.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"|"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"**Example Unshelve server (unshelve Action)**"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":".. literalinclude:: ../../doc/api_samples/os-shelve/os-unshelve.json"},{"line_number":157,"context_line":"   :language: javascript"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Response"}],"source_content_type":"text/x-c++src","patch_set":42,"id":"7faddb67_7c14f39f","line":157,"range":{"start_line":154,"start_character":0,"end_line":157,"end_character":24},"in_reply_to":"7faddb67_a4ea5371","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"doc/api_samples/os-shelve/os-unshelve.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": null"},{"line_number":4,"context_line":"    }"}],"source_content_type":"application/json","patch_set":4,"id":"9fb8cfa7_6bd37061","line":1,"updated":"2019-06-11 18:30:27.000000000","message":"I would expect this is still used for the tests before 2.74 and then you\u0027d add a new 2.74 API sample that provides an availability_zone in the request.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": null"},{"line_number":4,"context_line":"    }"}],"source_content_type":"application/json","patch_set":4,"id":"9fb8cfa7_ce3dc08f","line":1,"in_reply_to":"9fb8cfa7_6bd37061","updated":"2019-06-12 09:00:28.000000000","message":"Yeah, this should be add the v2.74 dir and functional tests.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": null"},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":4,"id":"9fb8cfa7_abe3a833","line":3,"updated":"2019-06-11 18:30:27.000000000","message":"Is \"availability_zone\" a required key in the \"unshelve\" body now? It shouldn\u0027t be since it\u0027s optional.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"}],"doc/api_samples/os-shelve/v2.77/os-shelve-offload.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"shelveOffload\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"7faddb67_1f1a94c5","line":1,"updated":"2019-08-27 14:53:25.000000000","message":"This template isn\u0027t used since you don\u0027t have a functional test for shelve offload, just remove this file.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"shelveOffload\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"7faddb67_1c0b7f7d","line":1,"in_reply_to":"7faddb67_1f1a94c5","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"doc/api_samples/os-shelve/v2.77/os-unshelve-null.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"7faddb67_c2dd6e14","line":1,"updated":"2019-08-20 23:03:11.000000000","message":"I guess this one is for regression testing?","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"7faddb67_88aeb77e","line":1,"in_reply_to":"7faddb67_c2dd6e14","updated":"2019-08-21 08:16:31.000000000","message":"Yeah.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"}],"doc/api_samples/os-shelve/v2.77/os-unshelve.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": \"east_az\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"7faddb67_dc240711","line":3,"range":{"start_line":3,"start_character":30,"end_line":3,"end_character":37},"updated":"2019-08-27 16:57:48.000000000","message":"This should be us-west. Use \"tox -e api-samples\" to generate the samples when you run the functional test.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"827675c6e0c781739c3767a3fab360bb8de19b69","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": \"east_az\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"7faddb67_82bce4db","line":3,"range":{"start_line":3,"start_character":30,"end_line":3,"end_character":37},"in_reply_to":"7faddb67_dc240711","updated":"2019-08-27 17:02:34.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"72df65663e6bc331c9927ee0d364ccf5e11a1cbd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": \"east_az\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":42,"id":"7faddb67_99dd3615","line":3,"range":{"start_line":3,"start_character":30,"end_line":3,"end_character":37},"in_reply_to":"7faddb67_dc240711","updated":"2019-08-28 03:09:02.000000000","message":"Yeah, run \"tox -e api-samples\" is necessary, before I was only run \"tox -e functional\", not found this iussue.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"doc/source/user/aggregates.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"3. The shelved offloaded server was unshelved by specifying the"},{"line_number":95,"context_line":"   ``availability_zone`` with the ``POST /servers/{server_id}/action`` request."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":".. note:: In 2.77 microversion, support for specifying an availability zone to"},{"line_number":98,"context_line":"  the unshelve server action when the server is shelved offloaded."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If the server was not created in a specific zone then it is free to be moved"}],"source_content_type":"text/x-rst","patch_set":36,"id":"7faddb67_dfaf75dd","line":97,"updated":"2019-08-21 19:51:19.000000000","message":"Tie this into the sentence in #3 above by just saying:\n\n\" request using microversion 2.77 or greater.\"\n\nThen you can remove the note.","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b928e5dc101f27ec232fae17ffc3413aaf7f6481","unresolved":false,"context_lines":[{"line_number":94,"context_line":"3. The shelved offloaded server was unshelved by specifying the"},{"line_number":95,"context_line":"   ``availability_zone`` with the ``POST /servers/{server_id}/action`` request."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":".. note:: In 2.77 microversion, support for specifying an availability zone to"},{"line_number":98,"context_line":"  the unshelve server action when the server is shelved offloaded."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"If the server was not created in a specific zone then it is free to be moved"}],"source_content_type":"text/x-rst","patch_set":36,"id":"7faddb67_ad504cd6","line":97,"in_reply_to":"7faddb67_dfaf75dd","updated":"2019-08-22 02:31:36.000000000","message":"Done","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"}],"nova/api/openstack/compute/rest_api_version_history.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":985,"context_line":""},{"line_number":986,"context_line":"2.77"},{"line_number":987,"context_line":"----"},{"line_number":988,"context_line":"API microversion 2.76 adds support for specifying availability zone to"},{"line_number":989,"context_line":"unshelve a shelved offloaded server."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7faddb67_e2e0aace","line":988,"range":{"start_line":988,"start_character":19,"end_line":988,"end_character":21},"updated":"2019-08-20 23:03:11.000000000","message":"77","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":985,"context_line":""},{"line_number":986,"context_line":"2.77"},{"line_number":987,"context_line":"----"},{"line_number":988,"context_line":"API microversion 2.76 adds support for specifying availability zone to"},{"line_number":989,"context_line":"unshelve a shelved offloaded server."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7faddb67_e8e08bce","line":988,"range":{"start_line":988,"start_character":19,"end_line":988,"end_character":21},"in_reply_to":"7faddb67_e2e0aace","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":985,"context_line":""},{"line_number":986,"context_line":"2.77"},{"line_number":987,"context_line":"----"},{"line_number":988,"context_line":"API microversion 2.76 adds support for specifying availability zone to"},{"line_number":989,"context_line":"unshelve a shelved offloaded server."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7faddb67_82e3f6d7","line":989,"range":{"start_line":988,"start_character":68,"end_line":989,"end_character":8},"updated":"2019-08-20 23:03:11.000000000","message":"when unshelving","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":985,"context_line":""},{"line_number":986,"context_line":"2.77"},{"line_number":987,"context_line":"----"},{"line_number":988,"context_line":"API microversion 2.76 adds support for specifying availability zone to"},{"line_number":989,"context_line":"unshelve a shelved offloaded server."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7faddb67_88e317d8","line":989,"range":{"start_line":988,"start_character":68,"end_line":989,"end_character":8},"in_reply_to":"7faddb67_82e3f6d7","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"}],"nova/api/openstack/compute/schemas/servers.py":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b463a07eb0d1f695c050989d9c2d9df9c2d6eb79","unresolved":false,"context_lines":[{"line_number":652,"context_line":"    \u0027locked\u0027: parameter_types.common_query_param,"},{"line_number":653,"context_line":"})"},{"line_number":654,"context_line":""},{"line_number":655,"context_line":"unshleve_v274 \u003d {"},{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_c7748838","line":655,"range":{"start_line":655,"start_character":0,"end_line":655,"end_character":13},"updated":"2019-07-02 02:05:06.000000000","message":"s/unshelve_v274","commit_id":"00345bcf6672536210fdac232e736ffc767a7b75"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"437debf4e8a813a8c9f57ee63755d827ca4f1618","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027anyOf\u0027: ["},{"line_number":660,"context_line":"                {"},{"line_number":661,"context_line":"                    \u0027type\u0027: \u0027object\u0027,"},{"line_number":662,"context_line":"                    \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fb8cfa7_0f5cf248","line":659,"range":{"start_line":659,"start_character":12,"end_line":659,"end_character":22},"updated":"2019-07-02 10:19:10.000000000","message":"Here, allowed to request {\u0027unshelve\u0027: \u0027None\u0027} or {\u0027unshelve\u0027: \u0027availability_zone\u0027: \u0027east-az\u0027}.\nNow, in the test case of api/openstack/compute/test_shelve.py, allowed to request {\u0027unshelve\u0027: \u0027None\u0027} and {\u0027unshelve\u0027: {}}, that\u0027s terrible.","commit_id":"1a994c2859e4c38c6860a4f3b37c00d29b3921f5"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d7efde16694cd2850a1d53d1558d272231d1de4d","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027anyOf\u0027: ["},{"line_number":660,"context_line":"                {"},{"line_number":661,"context_line":"                    \u0027type\u0027: \u0027object\u0027,"},{"line_number":662,"context_line":"                    \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_bce38ea4","line":659,"range":{"start_line":659,"start_character":12,"end_line":659,"end_character":22},"in_reply_to":"7faddb67_5bb707da","updated":"2019-07-04 09:21:40.000000000","message":"Yeah, thanks matt.\nunshelve_v274 \u003d {\n    \u0027type\u0027: \u0027object\u0027,\n    \u0027properties\u0027: {\n        \u0027unshelve\u0027: {\n            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],\n            \u0027properties\u0027: {\n                \u0027availability_zone\u0027: {\n                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,\n                },\n            },\n            \u0027additionalProperties\u0027: False,\n        },\n    },\n    \u0027required\u0027: [\u0027unshelve\u0027],\n    \u0027additionalProperties\u0027: False,\n}\nThis change is ok, I will conduct an in-depth study of anyOf and oneOf to deepen my understanding.","commit_id":"1a994c2859e4c38c6860a4f3b37c00d29b3921f5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027anyOf\u0027: ["},{"line_number":660,"context_line":"                {"},{"line_number":661,"context_line":"                    \u0027type\u0027: \u0027object\u0027,"},{"line_number":662,"context_line":"                    \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_f434afe0","line":659,"range":{"start_line":659,"start_character":12,"end_line":659,"end_character":22},"in_reply_to":"7faddb67_bce38ea4","updated":"2019-07-05 06:22:42.000000000","message":"Yeah anyOf is not the right one here. \n\n- oneOf matches exactly one schema and fail if it match nore than one schema\n- anyOf can match one or more schemas. So mixed elements matching mix of both schema is pass.\n\nIn case of schema you mentioned, properties will be applied only if \u0027unshelve\u0027 is dict not in case of null so below values will pass:\n\npass:\n {\u0027unshelve\u0027: null}\n {\u0027unshelve\u0027: {}}\n {\u0027unshelve\u0027: {\u0027availability_zone\u0027: \u0027nova\u0027}}\n\nanything else will fail.\n\nSo we need to restrict {} by adding \u0027required\u0027: [\u0027availability_zone\u0027]\n\nwhich means either it is null otherwise pass \u0027availability_zone\u0027.","commit_id":"1a994c2859e4c38c6860a4f3b37c00d29b3921f5"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027anyOf\u0027: ["},{"line_number":660,"context_line":"                {"},{"line_number":661,"context_line":"                    \u0027type\u0027: \u0027object\u0027,"},{"line_number":662,"context_line":"                    \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_56d015f8","line":659,"range":{"start_line":659,"start_character":12,"end_line":659,"end_character":22},"in_reply_to":"7faddb67_f434afe0","updated":"2019-07-08 09:53:16.000000000","message":"I got it, thanks for your detailed explanation..","commit_id":"1a994c2859e4c38c6860a4f3b37c00d29b3921f5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26e155d4536c9feae8e993e2aead55d28df3b858","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027anyOf\u0027: ["},{"line_number":660,"context_line":"                {"},{"line_number":661,"context_line":"                    \u0027type\u0027: \u0027object\u0027,"},{"line_number":662,"context_line":"                    \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_5bb707da","line":659,"range":{"start_line":659,"start_character":12,"end_line":659,"end_character":22},"in_reply_to":"9fb8cfa7_0f5cf248","updated":"2019-07-04 01:09:28.000000000","message":"Compare with https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/lock_server.py which I think was based on:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/compute/schemas/migrate_server.py#L23\n\nKen\u0027ichi, Alex and gmann would be good to ask as well.\n\nanyOf is probably wrong, you could maybe use oneOf like how the \u0027port\u0027 and \u0027networks\u0027 schema works for creating a server.","commit_id":"1a994c2859e4c38c6860a4f3b37c00d29b3921f5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027properties\u0027: {"},{"line_number":661,"context_line":"                \u0027availability_zone\u0027: {"},{"line_number":662,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":663,"context_line":"                },"},{"line_number":664,"context_line":"            },"},{"line_number":665,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":666,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_b19409ea","line":663,"range":{"start_line":661,"start_character":37,"end_line":663,"end_character":18},"updated":"2019-07-05 06:22:42.000000000","message":"let\u0027s use the common AZ schema defined in parameter.yaml \u0027availability_zone\u0027: parameter_types.name","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027properties\u0027: {"},{"line_number":661,"context_line":"                \u0027availability_zone\u0027: {"},{"line_number":662,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":663,"context_line":"                },"},{"line_number":664,"context_line":"            },"},{"line_number":665,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":666,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_d62ac5e5","line":663,"range":{"start_line":661,"start_character":37,"end_line":663,"end_character":18},"in_reply_to":"7faddb67_b19409ea","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                \u0027availability_zone\u0027: {"},{"line_number":662,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":663,"context_line":"                },"},{"line_number":664,"context_line":"            },"},{"line_number":665,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":666,"context_line":"        },"},{"line_number":667,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_74b51fee","line":664,"range":{"start_line":664,"start_character":13,"end_line":664,"end_character":14},"updated":"2019-07-05 06:22:42.000000000","message":"also add \u0027required\u0027: [\u0027availability_zone\u0027] to restrict the empty dict {\u0027unshelve\u0027: {}}","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":661,"context_line":"                \u0027availability_zone\u0027: {"},{"line_number":662,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":663,"context_line":"                },"},{"line_number":664,"context_line":"            },"},{"line_number":665,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":666,"context_line":"        },"},{"line_number":667,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_f62fc1f3","line":664,"range":{"start_line":664,"start_character":13,"end_line":664,"end_character":14},"in_reply_to":"7faddb67_74b51fee","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"395f3f53a096f9aa027e4579d6ffbec5b6577982","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_3d55ee1d","line":659,"range":{"start_line":659,"start_character":20,"end_line":659,"end_character":29},"updated":"2019-07-11 15:44:56.000000000","message":"I think this is wrong, as noted inline and in the tempest change:\n\nhttps://review.opendev.org/#/c/670287/\n\nThis is a backward incompatible change to the API for older microversions where I could pass {} or [] or \u0027foo\u0027 or anything and it just would be ignored. I\u0027m not sure what the type value should be here - is there a way to specify essentially \"any\" or a wildcard in json schema types?","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"fc76f4d5d10ccd287696537b4baf836ec68422f9","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_b387b4b5","line":659,"range":{"start_line":659,"start_character":20,"end_line":659,"end_character":29},"in_reply_to":"7faddb67_0c9790ee","updated":"2019-07-13 04:51:25.000000000","message":"Yeah, add this comment to the request body schema validation is suitable.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"c3ead1d482bf7470b49136d56c987900782fd302","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_8a3dab2c","line":659,"range":{"start_line":659,"start_character":20,"end_line":659,"end_character":29},"in_reply_to":"7faddb67_3d55ee1d","updated":"2019-07-12 03:40:05.000000000","message":"\u003e This is a backward incompatible change to the API for older\n\u003e microversions where I could pass {} or [] or \u0027foo\u0027 or \n\u003e anything and it just would be ignored. I\u0027m not sure what the \n\u003e type value should be here - is there a way to specify \n\u003e essentially \"any\" or a wildcard in json schema types?\n\n-- The above can be solved by regular expressions.\n\nHi matt, if I use \"@validation.schema(schema_servers.unshelve, \u00272.0\u0027, \u00272.73\u0027)\" to limit the request parameter, this limit only support {\u0027unshelve\u0027: null} or\n {\u0027unshelve\u0027: {\u0027availability_zone\u0027: \u0027nova\u0027}}, not support \n {\u0027unshelve\u0027: {}}.\n\nBut remove *that* validation for old microversion, replace with [1] avoid the above request problem.\n\n[1]:\nunshelve_v274 \u003d {\n    \u0027type\u0027: \u0027object\u0027,\n    \u0027properties\u0027: {\n        \u0027unshelve\u0027: {\n            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],\n            \u0027properties\u0027: {\n                \u0027availability_zone\u0027: parameter_types.name\n            },\n            \u0027required\u0027: [\u0027availability_zone\u0027],\n            \u0027additionalProperties\u0027: False,\n        },\n    },\n    \u0027required\u0027: [\u0027unshelve\u0027],\n    \u0027additionalProperties\u0027: False,\n}","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f508af2d88e928029381d2d2072d3acbc945971c","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_e0e9e919","line":659,"range":{"start_line":659,"start_character":20,"end_line":659,"end_character":29},"in_reply_to":"7faddb67_3d55ee1d","updated":"2019-07-11 15:58:32.000000000","message":"actually, we have to specify some type for that. \n\nfor new microversion, we can allow only \u0027null\u0027 or \u0027availability_zone\u0027 only. If we keep allow anything like {} or [] then additionalProperties has to be set as False. so any unwanted value can be passed even those are not used which is again of what we are improving in other BP of API cleanup.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d3f9c9e7ee0ccfb4352ad53b129b6b4747b007b","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_0c9790ee","line":659,"range":{"start_line":659,"start_character":20,"end_line":659,"end_character":29},"in_reply_to":"7faddb67_40e23d31","updated":"2019-07-12 15:01:14.000000000","message":"\u003e NOTE: for older microversion there will be no change as schema is\n \u003e applied only for \u003e2.74. anything working in old version keep\n \u003e working as it is.\n\nI\u0027m assuming you mean you want this comment in the code? If so I agree.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d7e1435a3caf36e82333cd8c0f088d71d1c4f080","unresolved":false,"context_lines":[{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_40e23d31","line":659,"range":{"start_line":659,"start_character":20,"end_line":659,"end_character":29},"in_reply_to":"7faddb67_e0e9e919","updated":"2019-07-11 15:59:24.000000000","message":"NOTE: for older microversion there will be no change as schema is applied only for \u003e2.74. anything working in old version keep working as it is.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0b7aa1a44fae089319b202b29cc4ea1dbc828982","unresolved":false,"context_lines":[{"line_number":664,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":665,"context_line":"}"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"unshelve_with_az \u003d {"},{"line_number":668,"context_line":"    \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":669,"context_line":"    \u0027properties\u0027: {"},{"line_number":670,"context_line":"        \u0027availability_zone\u0027: parameter_types.name"},{"line_number":671,"context_line":"    },"},{"line_number":672,"context_line":"    \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":673,"context_line":"}"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"unshelve_v274 \u003d copy.deepcopy(unshelve)"},{"line_number":676,"context_line":"unshelve_v274[\u0027properties\u0027][\u0027unshelve\u0027].update(unshelve_with_az)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_868f1122","line":673,"range":{"start_line":667,"start_character":0,"end_line":673,"end_character":1},"updated":"2019-07-10 03:45:32.000000000","message":"this should be enough and with new microversion only.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"8573890e3b4a53db4675f627034ba51114987bbe","unresolved":false,"context_lines":[{"line_number":664,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":665,"context_line":"}"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"unshelve_with_az \u003d {"},{"line_number":668,"context_line":"    \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":669,"context_line":"    \u0027properties\u0027: {"},{"line_number":670,"context_line":"        \u0027availability_zone\u0027: parameter_types.name"},{"line_number":671,"context_line":"    },"},{"line_number":672,"context_line":"    \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":673,"context_line":"}"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"unshelve_v274 \u003d copy.deepcopy(unshelve)"},{"line_number":676,"context_line":"unshelve_v274[\u0027properties\u0027][\u0027unshelve\u0027].update(unshelve_with_az)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_fc4a1825","line":673,"range":{"start_line":667,"start_character":0,"end_line":673,"end_character":1},"in_reply_to":"7faddb67_868f1122","updated":"2019-07-10 07:03:37.000000000","message":"Done","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f508af2d88e928029381d2d2072d3acbc945971c","unresolved":false,"context_lines":[{"line_number":652,"context_line":"    \u0027locked\u0027: parameter_types.common_query_param,"},{"line_number":653,"context_line":"})"},{"line_number":654,"context_line":""},{"line_number":655,"context_line":"unshelve \u003d {"},{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"},{"line_number":663,"context_line":"    \u0027required\u0027: [\u0027unshelve\u0027],"},{"line_number":664,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":665,"context_line":"}"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"unshelve_with_az \u003d {"},{"line_number":668,"context_line":"    \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":669,"context_line":"    \u0027properties\u0027: {"},{"line_number":670,"context_line":"        \u0027availability_zone\u0027: parameter_types.name"},{"line_number":671,"context_line":"    },"},{"line_number":672,"context_line":"    \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":673,"context_line":"}"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"unshelve_v274 \u003d copy.deepcopy(unshelve)"},{"line_number":676,"context_line":"unshelve_v274[\u0027properties\u0027][\u0027unshelve\u0027].update(unshelve_with_az)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_009f65b4","line":676,"range":{"start_line":655,"start_character":0,"end_line":676,"end_character":64},"updated":"2019-07-11 15:58:32.000000000","message":"this could be simply like below:\n\nunshelve_v274 \u003d {\n    \u0027type\u0027: \u0027object\u0027,\n    \u0027properties\u0027: {\n        \u0027unshelve\u0027: {\n            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],\n            \u0027properties\u0027: {\n                \u0027availability_zone\u0027: parameter_types.name\n            },\n            \u0027required\u0027: [\u0027availability_zone\u0027],\n            \u0027additionalProperties\u0027: False,\n        },\n    },\n    \u0027required\u0027: [\u0027unshelve\u0027],\n    \u0027additionalProperties\u0027: False,\n}","commit_id":"e83a7dbe591ad361bf7c5ac27575e353b1d2bcd5"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"c3ead1d482bf7470b49136d56c987900782fd302","unresolved":false,"context_lines":[{"line_number":652,"context_line":"    \u0027locked\u0027: parameter_types.common_query_param,"},{"line_number":653,"context_line":"})"},{"line_number":654,"context_line":""},{"line_number":655,"context_line":"unshelve \u003d {"},{"line_number":656,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":657,"context_line":"    \u0027properties\u0027: {"},{"line_number":658,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":659,"context_line":"            \u0027type\u0027: [\u0027null\u0027],"},{"line_number":660,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":661,"context_line":"        },"},{"line_number":662,"context_line":"    },"},{"line_number":663,"context_line":"    \u0027required\u0027: [\u0027unshelve\u0027],"},{"line_number":664,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":665,"context_line":"}"},{"line_number":666,"context_line":""},{"line_number":667,"context_line":"unshelve_with_az \u003d {"},{"line_number":668,"context_line":"    \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":669,"context_line":"    \u0027properties\u0027: {"},{"line_number":670,"context_line":"        \u0027availability_zone\u0027: parameter_types.name"},{"line_number":671,"context_line":"    },"},{"line_number":672,"context_line":"    \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":673,"context_line":"}"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"unshelve_v274 \u003d copy.deepcopy(unshelve)"},{"line_number":676,"context_line":"unshelve_v274[\u0027properties\u0027][\u0027unshelve\u0027].update(unshelve_with_az)"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_ea153f9d","line":676,"range":{"start_line":655,"start_character":0,"end_line":676,"end_character":64},"in_reply_to":"7faddb67_009f65b4","updated":"2019-07-12 03:40:05.000000000","message":"Thanks gmann. Addressed.","commit_id":"e83a7dbe591ad361bf7c5ac27575e353b1d2bcd5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    \u0027locked\u0027: parameter_types.common_query_param,"},{"line_number":661,"context_line":"})"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"# NOTE(brinzhang): For older microversion there will be no change as"},{"line_number":664,"context_line":"# schema is applied only for \u003e2.75 with unshelve a server API."},{"line_number":665,"context_line":"# Anything working in old version keep working as it is."},{"line_number":666,"context_line":"unshelve_v275 \u003d {"},{"line_number":667,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":668,"context_line":"    \u0027properties\u0027: {"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_196269af","line":665,"range":{"start_line":663,"start_character":0,"end_line":665,"end_character":56},"updated":"2019-07-13 13:40:32.000000000","message":"+1, thanks","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":684,"context_line":"# NOTE(brinzhang): For older microversion there will be no change as"},{"line_number":685,"context_line":"# schema is applied only for \u003e2.77 with unshelve a server API."},{"line_number":686,"context_line":"# Anything working in old version keep working as it is."},{"line_number":687,"context_line":"unshelve_v277 \u003d {"},{"line_number":688,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":689,"context_line":"    \u0027properties\u0027: {"},{"line_number":690,"context_line":"        \u0027unshelve\u0027: {"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_02d706f0","line":687,"updated":"2019-08-20 23:03:11.000000000","message":"Let\u0027s put this in a nova/api/openstack/compute/schemas/shelve.py module since the schema module should mirror the API route handler modules and the unshelve action is handled in shelve.py rather than servers.py.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":684,"context_line":"# NOTE(brinzhang): For older microversion there will be no change as"},{"line_number":685,"context_line":"# schema is applied only for \u003e2.77 with unshelve a server API."},{"line_number":686,"context_line":"# Anything working in old version keep working as it is."},{"line_number":687,"context_line":"unshelve_v277 \u003d {"},{"line_number":688,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":689,"context_line":"    \u0027properties\u0027: {"},{"line_number":690,"context_line":"        \u0027unshelve\u0027: {"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_483f5f24","line":687,"in_reply_to":"7faddb67_02d706f0","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":692,"context_line":"            \u0027properties\u0027: {"},{"line_number":693,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":694,"context_line":"            },"},{"line_number":695,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":696,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":697,"context_line":"        },"},{"line_number":698,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_c206ce86","line":695,"updated":"2019-08-20 23:03:11.000000000","message":"Why is availability_zone required when using 2.77?\n\nIf we look at 2.56 where you can specify a requested destination host for cold migration:\n\nhttps://github.com/openstack/nova/blob/4e9d2244799fb285f75056f9120201aaa408a765/nova/api/openstack/compute/schemas/migrate_server.py#L23\n\nThe schema is such that you can do something like:\n\n{\n    \u0027migrate\u0027: null\n}\n\nfor backward compatibility, or:\n\n{\n    \u0027migrate\u0027: {\n        \u0027host\u0027: \u0027myhost\u0027\n    }\n}\n\nNow I remember when we did 2.73 the schema started matching the 2.56 pattern but was changed to be a bit more strict:\n\nhttps://github.com/openstack/nova/blob/4e9d2244799fb285f75056f9120201aaa408a765/nova/api/openstack/compute/schemas/lock_server.py#L19\n\nMeaning you can do:\n\n{\n   \u0027lock\u0027: null\n}\n\nor\n\n{\n    \u0027lock\u0027: {\n        \u0027locked_reason\u0027: \u0027something\u0027\n    }\n}\n\nBut you can\u0027t do:\n\n{\n    \u0027lock\u0027: {\n        \u0027locked_reason\u0027: null\n    }\n}\n\nor\n\n{\n    \u0027lock\u0027: {\n        \u0027locked_reason\u0027: \u0027\u0027\n    }\n}\n\nWhich are allowed with 2.56. So I think we should probably follow the 2.73 pattern.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"427991ca1180aebfb342515f8cf556f45a62dd89","unresolved":false,"context_lines":[{"line_number":692,"context_line":"            \u0027properties\u0027: {"},{"line_number":693,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":694,"context_line":"            },"},{"line_number":695,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":696,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":697,"context_line":"        },"},{"line_number":698,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_7a068c88","line":695,"in_reply_to":"7faddb67_10cc2268","updated":"2019-08-22 01:59:31.000000000","message":"+1 on both idea. we can document it as NOTE in schema. and w can cover the \u003c2.77 before also to make sure it does not change the old behaviour.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3bb7bc52a0d4b19b8e3adfc0ea61a04e703a5a2d","unresolved":false,"context_lines":[{"line_number":692,"context_line":"            \u0027properties\u0027: {"},{"line_number":693,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":694,"context_line":"            },"},{"line_number":695,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":696,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":697,"context_line":"        },"},{"line_number":698,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_10cc2268","line":695,"in_reply_to":"7faddb67_573cdac6","updated":"2019-08-21 15:38:19.000000000","message":"\u003e allowing empty dict has no meaning in this case. I will say if we are changing the request and schema for this API to make API better, we should not allow unused empty dict.\n\nThat\u0027s reasonable but should be (1) documented since it\u0027s confusing by just looking at the schema and (2) there were tests for pre-2.77 behavior that used {} which were changed to use None and if those were because of the schema change, then that\u0027s a backward incompatible breakage. If those tests were incorrectly changed, then they should be changed back to show that pre-2.77 works with {}.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c2cb507a1db328beb951a6922f8fea730d5a3100","unresolved":false,"context_lines":[{"line_number":692,"context_line":"            \u0027properties\u0027: {"},{"line_number":693,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":694,"context_line":"            },"},{"line_number":695,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":696,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":697,"context_line":"        },"},{"line_number":698,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_573cdac6","line":695,"in_reply_to":"7faddb67_68f57b82","updated":"2019-08-21 08:33:12.000000000","message":"If we remove the \u0027availability_zone\u0027 from required, we will allow empty dict as allowed value which does not seem valuable to me. I feel we should allow only 2 values, 1. None- null 2. object containing AZ- {\"availabilitiy_zone\" \u003cstring\u003e}\n\nallowing empty dict has no meaning in this case. I will say if we are changing the request and schema for this API to make API better, we should not allow unused empty dict.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"90e2979b693a2d5b073faa04725b898b0660afc0","unresolved":false,"context_lines":[{"line_number":692,"context_line":"            \u0027properties\u0027: {"},{"line_number":693,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":694,"context_line":"            },"},{"line_number":695,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":696,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":697,"context_line":"        },"},{"line_number":698,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_4d0e78e4","line":695,"in_reply_to":"7faddb67_7a068c88","updated":"2019-08-22 07:06:01.000000000","message":"Yeah, good idea. I will add the comment in shcema, and add the tests for pre-2.77.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":692,"context_line":"            \u0027properties\u0027: {"},{"line_number":693,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":694,"context_line":"            },"},{"line_number":695,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":696,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":697,"context_line":"        },"},{"line_number":698,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_68f57b82","line":695,"in_reply_to":"7faddb67_c206ce86","updated":"2019-08-21 08:16:31.000000000","message":"thanks, removed the \u0027required\u0027: [\u0027availability_zone\u0027].","commit_id":"2c98619658b80167bed412c07428bd31d772c430"}],"nova/api/openstack/compute/schemas/shelve.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7330895e48a2cbbf1fede90f240b4c8067c01a9a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":22,"context_line":"    \u0027properties\u0027: {"},{"line_number":23,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"},{"line_number":30,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":35,"id":"7faddb67_97c812a8","line":27,"range":{"start_line":24,"start_character":0,"end_line":27,"end_character":14},"updated":"2019-08-21 08:36:48.000000000","message":"I replied to disallow empty dict here. It can be very easy interface 1. null (just unshelve my sevrer) 2. specify the AZ to unshelve the server. now the 3rd case empty dict {} does not have any remaining meaning. \n\nlet\u0027s wait for matt opinon on this if we can restrict {}.\n\n- https://review.opendev.org/#/c/663851/34/nova/api/openstack/compute/schemas/servers.py@695","commit_id":"2dd58f2d86d031497a3723e25164f6b951d8cdd3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_5f7dc56a","line":26,"updated":"2019-08-21 19:51:19.000000000","message":"Need to check with gmann about this sine he doesn\u0027t want to allow this:\n\n{\n    \u0027unshelve\u0027: {}\n}","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"427991ca1180aebfb342515f8cf556f45a62dd89","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_fa6cbc36","line":26,"in_reply_to":"7faddb67_5f7dc56a","updated":"2019-08-22 01:59:31.000000000","message":"yeah, we can make the \u0027availability_zone\u0027 as required and check in tests that {} keep working in \u003c2.77","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"90e2979b693a2d5b073faa04725b898b0660afc0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        \u0027unshelve\u0027: {"},{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_8d3470fc","line":26,"in_reply_to":"7faddb67_fa6cbc36","updated":"2019-08-22 07:06:01.000000000","message":"Yeah, added the tests pre-2.77 in ShelveServerControllerTestV277 in nova/tests/unit/api/openstack/compute/test_shelve.py.","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97d42a8332dce74a124f49a85c1d2e10efa7ec35","unresolved":false,"context_lines":[{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            # NOTE: The allowed request body is {\u0027unshelve\u0027: null} or"},{"line_number":29,"context_line":"            # {\u0027unshelve\u0027: {}} or {\u0027unshelve\u0027: {\u0027availability_zone\u0027:"},{"line_number":30,"context_line":"            # \u003cstring\u003e}}, if we need to limit {\u0027unshelve\u0027: {}}, need to"},{"line_number":31,"context_line":"            # add \u0027required\u0027: [\u0027availability_zone\u0027] as a constraint."}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_d05c311b","line":28,"updated":"2019-08-22 15:52:22.000000000","message":"From gmann in PS36:\n\n\u003e yeah, we can make the \u0027availability_zone\u0027 as required and check in tests that {} keep working in \u003c2.77\n\nThis doesn\u0027t do that, as noted in the functional test that doesn\u0027t fail when passing an empty dict for unshelve.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            # NOTE: The allowed request body is {\u0027unshelve\u0027: null} or"},{"line_number":29,"context_line":"            # {\u0027unshelve\u0027: {}} or {\u0027unshelve\u0027: {\u0027availability_zone\u0027:"},{"line_number":30,"context_line":"            # \u003cstring\u003e}}, if we need to limit {\u0027unshelve\u0027: {}}, need to"},{"line_number":31,"context_line":"            # add \u0027required\u0027: [\u0027availability_zone\u0027] as a constraint."}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_dad687f3","line":28,"in_reply_to":"7faddb67_d05c311b","updated":"2019-08-23 00:33:03.000000000","message":"Sorry, did not understand the essence.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"16f7db4843a16fd8823c47e1629bd60eea9513b4","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"},{"line_number":30,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_bf95a734","line":27,"range":{"start_line":27,"start_character":12,"end_line":27,"end_character":14},"updated":"2019-08-24 03:42:56.000000000","message":"This need to be updated to not allow {}.\n\n    \u0027required\u0027: [\u0027availability_zone\u0027],","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3379fc250a18b2c955a2bf76efbea23421aa39ef","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"},{"line_number":30,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_ffba3f6f","line":27,"range":{"start_line":27,"start_character":12,"end_line":27,"end_character":14},"in_reply_to":"7faddb67_5f4913b5","updated":"2019-08-24 05:00:30.000000000","message":"Yeah, matt is ok with that as mentioned in- https://review.opendev.org/#/c/663851/34/nova/api/openstack/compute/schemas/servers.py@695\n\nwith 1. add the documentation in this schema to explicitly saying that (you added but removed in latest PS) 2. add tests to verify the old working behaviour {} still working for \u003c2.76 (the tests you added in latest PS)","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"fb4c6a419dbec54e440ab5f241112345dcfb043d","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"},{"line_number":30,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_5f4913b5","line":27,"range":{"start_line":27,"start_character":12,"end_line":27,"end_character":14},"in_reply_to":"7faddb67_bf95a734","updated":"2019-08-24 04:36:19.000000000","message":"You mean add this to limit this schema like https://review.opendev.org/#/c/663851/34/nova/api/openstack/compute/schemas/servers.py@683, again?","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"81b6f62544b351f4f6267913b6464be745368372","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":25,"context_line":"            \u0027properties\u0027: {"},{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            \u0027additionalProperties\u0027: False,"},{"line_number":29,"context_line":"        },"},{"line_number":30,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_d1d97728","line":27,"range":{"start_line":27,"start_character":12,"end_line":27,"end_character":14},"in_reply_to":"7faddb67_ffba3f6f","updated":"2019-08-24 09:53:18.000000000","message":"Done","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            # NOTE: The allowed request body is {\u0027unshelve\u0027: null} or"},{"line_number":29,"context_line":"            # {\u0027unshelve\u0027: {\u0027availability_zone\u0027: \u003cstring\u003e}}, not allowded"},{"line_number":30,"context_line":"            # {\u0027unshelve\u0027: {}} as the request body for unshelve."},{"line_number":31,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":32,"context_line":"            \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_84fdd76f","line":29,"range":{"start_line":29,"start_character":65,"end_line":29,"end_character":73},"updated":"2019-08-27 14:53:25.000000000","message":"allowed","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                \u0027availability_zone\u0027: parameter_types.name"},{"line_number":27,"context_line":"            },"},{"line_number":28,"context_line":"            # NOTE: The allowed request body is {\u0027unshelve\u0027: null} or"},{"line_number":29,"context_line":"            # {\u0027unshelve\u0027: {\u0027availability_zone\u0027: \u003cstring\u003e}}, not allowded"},{"line_number":30,"context_line":"            # {\u0027unshelve\u0027: {}} as the request body for unshelve."},{"line_number":31,"context_line":"            \u0027required\u0027: [\u0027availability_zone\u0027],"},{"line_number":32,"context_line":"            \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_9c1e8fb9","line":29,"range":{"start_line":29,"start_character":65,"end_line":29,"end_character":73},"in_reply_to":"7faddb67_84fdd76f","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"nova/api/openstack/compute/shelve.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from nova.policies import shelve as shelve_policies"},{"line_number":30,"context_line":"from nova.volume import cinder"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class ShelveController(wsgi.Controller):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_2bafb87d","line":32,"updated":"2019-06-11 18:30:27.000000000","message":"This isn\u0027t used.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from nova.policies import shelve as shelve_policies"},{"line_number":30,"context_line":"from nova.volume import cinder"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class ShelveController(wsgi.Controller):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_34239058","line":32,"in_reply_to":"9fb8cfa7_2bafb87d","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        support_az \u003d api_version_request.is_supported(req, \u00272.74\u0027)"},{"line_number":91,"context_line":"        if support_az:"},{"line_number":92,"context_line":"            new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_8b3d8490","line":91,"updated":"2019-06-11 18:30:27.000000000","message":"I would expect the validation that happens in here to happen within the compute API.unshelve method instead (probably a new private method, something like: _validate_unshelve_az(context, instance, availability_zone))","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        support_az \u003d api_version_request.is_supported(req, \u00272.74\u0027)"},{"line_number":91,"context_line":"        if support_az:"},{"line_number":92,"context_line":"            new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_749ca80d","line":91,"in_reply_to":"9fb8cfa7_8b3d8490","updated":"2019-06-12 09:00:28.000000000","message":"Ok, move this handle to unshelve() compute API.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        if support_az:"},{"line_number":92,"context_line":"            new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"},{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_4b430c14","line":94,"range":{"start_line":94,"start_character":70,"end_line":94,"end_character":72},"updated":"2019-06-11 18:30:27.000000000","message":"it","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        if support_az:"},{"line_number":92,"context_line":"            new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"},{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_94a11c49","line":94,"range":{"start_line":94,"start_character":70,"end_line":94,"end_character":72},"in_reply_to":"9fb8cfa7_4b430c14","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"},{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."},{"line_number":98,"context_line":"                msg \u003d _(\"Specifying availability_zone to support only the \""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_ab5168db","line":95,"range":{"start_line":95,"start_character":29,"end_line":95,"end_character":47},"updated":"2019-06-11 18:30:27.000000000","message":"a host","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"},{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."},{"line_number":98,"context_line":"                msg \u003d _(\"Specifying availability_zone to support only the \""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_348ab0be","line":95,"range":{"start_line":95,"start_character":29,"end_line":95,"end_character":47},"in_reply_to":"9fb8cfa7_ab5168db","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"},{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."},{"line_number":98,"context_line":"                msg \u003d _(\"Specifying availability_zone to support only the \""},{"line_number":99,"context_line":"                        \"instance of SHELVED_OFFLOADED status. The current \""},{"line_number":100,"context_line":"                        \"status is %s.\") % instance.vm_state"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_8b66e4c0","line":97,"range":{"start_line":96,"start_character":25,"end_line":97,"end_character":42},"updated":"2019-06-11 18:30:27.000000000","message":"I would either remove this or re-word it to say something like, \"Unshelving a shelved offloaded server will go through the scheduler to find a new host.\"","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            if new_az and instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":94,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, It still"},{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."},{"line_number":98,"context_line":"                msg \u003d _(\"Specifying availability_zone to support only the \""},{"line_number":99,"context_line":"                        \"instance of SHELVED_OFFLOADED status. The current \""},{"line_number":100,"context_line":"                        \"status is %s.\") % instance.vm_state"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_74b5887d","line":97,"range":{"start_line":96,"start_character":25,"end_line":97,"end_character":42},"in_reply_to":"9fb8cfa7_8b66e4c0","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."},{"line_number":98,"context_line":"                msg \u003d _(\"Specifying availability_zone to support only the \""},{"line_number":99,"context_line":"                        \"instance of SHELVED_OFFLOADED status. The current \""},{"line_number":100,"context_line":"                        \"status is %s.\") % instance.vm_state"},{"line_number":101,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_4b11cc03","line":99,"range":{"start_line":98,"start_character":25,"end_line":99,"end_character":63},"updated":"2019-06-11 18:30:27.000000000","message":"I would re-word this like, \"Specifying an availability_zone is only allowed for servers with status SHELVED_OFFLOADED.\".","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                # belongs to the specified host, the availability_zone has not"},{"line_number":96,"context_line":"                # changed, if you perform an unshelve operation, that will be"},{"line_number":97,"context_line":"                # start instance directly."},{"line_number":98,"context_line":"                msg \u003d _(\"Specifying availability_zone to support only the \""},{"line_number":99,"context_line":"                        \"instance of SHELVED_OFFLOADED status. The current \""},{"line_number":100,"context_line":"                        \"status is %s.\") % instance.vm_state"},{"line_number":101,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_54b0848a","line":99,"range":{"start_line":98,"start_character":25,"end_line":99,"end_character":63},"in_reply_to":"9fb8cfa7_4b11cc03","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":104,"context_line":"                context, instance.uuid)"},{"line_number":105,"context_line":"            for bdm in bdms:"},{"line_number":106,"context_line":"                if bdm.attachment_id is not None:"},{"line_number":107,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.attachment_id)"},{"line_number":108,"context_line":"                    self.volume_api.check_availability_zone("}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_0b20b447","line":105,"updated":"2019-06-11 18:30:27.000000000","message":"You should be filtering bdms where bdm.is_volume is true.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":104,"context_line":"                context, instance.uuid)"},{"line_number":105,"context_line":"            for bdm in bdms:"},{"line_number":106,"context_line":"                if bdm.attachment_id is not None:"},{"line_number":107,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.attachment_id)"},{"line_number":108,"context_line":"                    self.volume_api.check_availability_zone("}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_bf7759a0","line":105,"in_reply_to":"9fb8cfa7_0b20b447","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":104,"context_line":"                context, instance.uuid)"},{"line_number":105,"context_line":"            for bdm in bdms:"},{"line_number":106,"context_line":"                if bdm.attachment_id is not None:"},{"line_number":107,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.attachment_id)"},{"line_number":108,"context_line":"                    self.volume_api.check_availability_zone("},{"line_number":109,"context_line":"                        context, volume, new_az\u003dnew_az)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_abff28a9","line":106,"updated":"2019-06-11 18:30:27.000000000","message":"This isn\u0027t the volume ID.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":104,"context_line":"                context, instance.uuid)"},{"line_number":105,"context_line":"            for bdm in bdms:"},{"line_number":106,"context_line":"                if bdm.attachment_id is not None:"},{"line_number":107,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.attachment_id)"},{"line_number":108,"context_line":"                    self.volume_api.check_availability_zone("},{"line_number":109,"context_line":"                        context, volume, new_az\u003dnew_az)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_7f6d61ca","line":106,"in_reply_to":"9fb8cfa7_abff28a9","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                context, instance.uuid)"},{"line_number":105,"context_line":"            for bdm in bdms:"},{"line_number":106,"context_line":"                if bdm.attachment_id is not None:"},{"line_number":107,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.attachment_id)"},{"line_number":108,"context_line":"                    self.volume_api.check_availability_zone("},{"line_number":109,"context_line":"                        context, volume, new_az\u003dnew_az)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_6b2ff03e","line":107,"range":{"start_line":107,"start_character":58,"end_line":107,"end_character":75},"updated":"2019-06-11 18:30:27.000000000","message":"You\u0027re looking for bdm.volume_id here.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                context, instance.uuid)"},{"line_number":105,"context_line":"            for bdm in bdms:"},{"line_number":106,"context_line":"                if bdm.attachment_id is not None:"},{"line_number":107,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.attachment_id)"},{"line_number":108,"context_line":"                    self.volume_api.check_availability_zone("},{"line_number":109,"context_line":"                        context, volume, new_az\u003dnew_az)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_9f7295ac","line":107,"range":{"start_line":107,"start_character":58,"end_line":107,"end_character":75},"in_reply_to":"9fb8cfa7_6b2ff03e","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            self.compute_api.unshelve(context, instance, new_az\u003dnew_az)"},{"line_number":127,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":128,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":129,"context_line":"        except exception.InstanceInvalidState as state_error:"},{"line_number":130,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":131,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":132,"context_line":"                                                                  id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_2be498df","line":129,"range":{"start_line":129,"start_character":25,"end_line":129,"end_character":45},"updated":"2019-06-11 18:30:27.000000000","message":"Hmm, maybe we should have used 409 for the SHELVED_OFFLOADED check above and error on L101? InstanceInvalidState is the error you get when trying to unshelve a server that is not shelved or shelved_offloaded. I\u0027m OK with 400 or 409 for your new code though, I don\u0027t think it makes a ton of difference.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            self.compute_api.unshelve(context, instance, new_az\u003dnew_az)"},{"line_number":127,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":128,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":129,"context_line":"        except exception.InstanceInvalidState as state_error:"},{"line_number":130,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":131,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":132,"context_line":"                                                                  id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_ff47114b","line":129,"range":{"start_line":129,"start_character":25,"end_line":129,"end_character":45},"in_reply_to":"9fb8cfa7_2be498df","updated":"2019-06-12 09:00:28.000000000","message":"On L101, I will add a new exception \u0027UnmatchAZException\u0027, I think it will be better. \u0027InstanceInvalidState\u0027 lack the reason parameter, and other parameters not useful to this code, I think \u0027UnshelveException\u0027[1] is good to use.\n\n[1]https://github.com/openstack/nova/blob/e8b6b0bc78ec229803d1d27f8a4706e2c425bd77/nova/exception.py#L1878","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    @wsgi.response(202)"},{"line_number":74,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":75,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":76,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":77,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":78,"context_line":"        context \u003d req.environ[\"nova.context\"]"},{"line_number":79,"context_line":"        context.can(shelve_policies.POLICY_ROOT % \u0027unshelve\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_e7ef87ae","line":76,"updated":"2019-06-27 16:06:15.000000000","message":"I think we should be adding a validation schema here, now that we actually have a reqest body, e.g.:\nhttps://opendev.org/openstack/nova/src/branch/master/nova/api/openstack/compute/admin_password.py#L39\n\nIt should only apply from this new microversion we are adding here, and ideally should be strictly validated (i.e. don\u0027t allow None any more).","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    @wsgi.response(202)"},{"line_number":74,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":75,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":76,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":77,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":78,"context_line":"        context \u003d req.environ[\"nova.context\"]"},{"line_number":79,"context_line":"        context.can(shelve_policies.POLICY_ROOT % \u0027unshelve\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_a4eac470","line":76,"in_reply_to":"9fb8cfa7_e7ef87ae","updated":"2019-07-01 13:27:29.000000000","message":"Done","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        new_az \u003d None"},{"line_number":83,"context_line":"        unshelve_dict \u003d None"},{"line_number":84,"context_line":"        if \u0027unshelve\u0027 in body:"},{"line_number":85,"context_line":"            unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":86,"context_line":"        support_az \u003d api_version_request.is_supported(req, \u00272.74\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_65006aac","line":83,"updated":"2019-06-27 16:06:15.000000000","message":"Should this be an empty dict? Adding the json schema validation might make this safe.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        new_az \u003d None"},{"line_number":83,"context_line":"        unshelve_dict \u003d None"},{"line_number":84,"context_line":"        if \u0027unshelve\u0027 in body:"},{"line_number":85,"context_line":"            unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":86,"context_line":"        support_az \u003d api_version_request.is_supported(req, \u00272.74\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_a49f2400","line":83,"in_reply_to":"9fb8cfa7_65006aac","updated":"2019-07-01 13:27:29.000000000","message":"Yeah, add the schema validation.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        new_az \u003d None"},{"line_number":83,"context_line":"        unshelve_dict \u003d None"},{"line_number":84,"context_line":"        if \u0027unshelve\u0027 in body:"},{"line_number":85,"context_line":"            unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":86,"context_line":"        support_az \u003d api_version_request.is_supported(req, \u00272.74\u0027)"},{"line_number":87,"context_line":"        if support_az and \u0027availability_zone\u0027 in unshelve_dict:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_45c1a653","line":84,"updated":"2019-06-27 16:06:15.000000000","message":"Can body be null here? I am not 100% sure without the schema validation in place.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        new_az \u003d None"},{"line_number":83,"context_line":"        unshelve_dict \u003d None"},{"line_number":84,"context_line":"        if \u0027unshelve\u0027 in body:"},{"line_number":85,"context_line":"            unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":86,"context_line":"        support_az \u003d api_version_request.is_supported(req, \u00272.74\u0027)"},{"line_number":87,"context_line":"        if support_az and \u0027availability_zone\u0027 in unshelve_dict:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_448ae8be","line":84,"in_reply_to":"9fb8cfa7_45c1a653","updated":"2019-07-01 13:27:29.000000000","message":"*This* if is redundant, that body cannot be null.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":110,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":111,"context_line":"                                                                  id)"},{"line_number":112,"context_line":"        except (exception.UnshelveException or"},{"line_number":113,"context_line":"                    exception.UnmatchAZException) as e1:"},{"line_number":114,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de1.format_message())"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_677f17df","line":112,"range":{"start_line":112,"start_character":26,"end_line":112,"end_character":43},"updated":"2019-06-27 16:06:15.000000000","message":"If you are in the wrong state, we normally do 409, conflict, a bit like the InstanceInvalidState above. Is that not a better fix here?","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":110,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":111,"context_line":"                                                                  id)"},{"line_number":112,"context_line":"        except (exception.UnshelveException or"},{"line_number":113,"context_line":"                    exception.UnmatchAZException) as e1:"},{"line_number":114,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de1.format_message())"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_44050845","line":112,"range":{"start_line":112,"start_character":26,"end_line":112,"end_character":43},"in_reply_to":"9fb8cfa7_677f17df","updated":"2019-07-01 13:27:29.000000000","message":"yeah, InstanceInvalidState is better, replaced.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b6a95b62d00ffce737bbac3cf2d651d7298910d1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        new_az \u003d None"},{"line_number":86,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":87,"context_line":"        support_az \u003d api_version_request.is_supported(req, \u00272.74\u0027)"},{"line_number":88,"context_line":"        if support_az and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":89,"context_line":"            new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        # We could potentially move this check to conductor and avoid the"}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_af18461d","line":88,"range":{"start_line":88,"start_character":49,"end_line":88,"end_character":62},"updated":"2019-07-02 09:33:03.000000000","message":"\"unshelve_dict\" needs to be checked before called here.","commit_id":"00345bcf6672536210fdac232e736ffc767a7b75"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0b7aa1a44fae089319b202b29cc4ea1dbc828982","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    @validation.schema(schema_servers.unshelve_v274, \u00272.74\u0027)"},{"line_number":79,"context_line":"    @validation.schema(schema_servers.unshelve, \u00272.0\u0027, \u00272.73\u0027)"},{"line_number":80,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":81,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":82,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_4684b90c","line":79,"range":{"start_line":79,"start_character":0,"end_line":79,"end_character":62},"updated":"2019-07-10 03:45:32.000000000","message":"Tempest is failing due to this schema added for older microversion[1]. Tempest pass the empty dict instead of null value. Which is not correct and we can fix that. But it can affect if user doing the same though it is wrong. \n\nI do not think we need to add the schema for older microversion. Let it be same and add schema for new microversion only which restrict the empty dict also.\n\n[1] http://logs.openstack.org/51/663851/20/check/tempest-full-py3/7c3d5a7/testr_results.html.gz","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"8573890e3b4a53db4675f627034ba51114987bbe","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    @validation.schema(schema_servers.unshelve_v274, \u00272.74\u0027)"},{"line_number":79,"context_line":"    @validation.schema(schema_servers.unshelve, \u00272.0\u0027, \u00272.73\u0027)"},{"line_number":80,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":81,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":82,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_5c448c1b","line":79,"range":{"start_line":79,"start_character":0,"end_line":79,"end_character":62},"in_reply_to":"7faddb67_4684b90c","updated":"2019-07-10 07:03:37.000000000","message":"Yes, I should not check the older microversion, it\u0027s result in the tempest failed.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"395f3f53a096f9aa027e4579d6ffbec5b6577982","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    @validation.schema(schema_servers.unshelve_v274, \u00272.74\u0027)"},{"line_number":79,"context_line":"    @validation.schema(schema_servers.unshelve, \u00272.0\u0027, \u00272.73\u0027)"},{"line_number":80,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":81,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":82,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_3d7c0eb4","line":79,"range":{"start_line":79,"start_character":0,"end_line":79,"end_character":62},"in_reply_to":"7faddb67_5ac5535a","updated":"2019-07-11 15:44:56.000000000","message":"I commented on the tempest change, but it seems the regression here is in nova and the schema being enforced for the older microversions. Since we didn\u0027t enforce the schema before, why would we now? In other words, why isn\u0027t schema_servers.unshelve open? It shouldn\u0027t enforce null only for the value since anyone could be sending any value before on the older microversion and it would just be ignored. This smells like more of a backward compatibliity breakage in the API than anything.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"61bfb5076b15e9b51e1364e2a5483d3c682a14e2","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    @validation.schema(schema_servers.unshelve_v274, \u00272.74\u0027)"},{"line_number":79,"context_line":"    @validation.schema(schema_servers.unshelve, \u00272.0\u0027, \u00272.73\u0027)"},{"line_number":80,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":81,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":82,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_5ac5535a","line":79,"range":{"start_line":79,"start_character":0,"end_line":79,"end_character":62},"in_reply_to":"7faddb67_5c448c1b","updated":"2019-07-11 11:59:56.000000000","message":"I am fixing that wrong usage in tempest - https://review.opendev.org/#/c/670287/1","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"45cdc47d45224eda81c76d1fca96e5baa6e84732","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    @wsgi.response(202)"},{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    @validation.schema(schema_servers.unshelve_v275, \u00272.75\u0027)"},{"line_number":79,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":80,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":81,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_6c8de4d1","line":78,"updated":"2019-07-12 15:02:38.000000000","message":"Should have a comment here about how there is no request body schema validation before 2.75.","commit_id":"f6644905baa1e31deb64f698da0609f1df8621e3"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"fc76f4d5d10ccd287696537b4baf836ec68422f9","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    @wsgi.response(202)"},{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    @validation.schema(schema_servers.unshelve_v275, \u00272.75\u0027)"},{"line_number":79,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":80,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":81,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":25,"id":"7faddb67_938ab8bc","line":78,"in_reply_to":"7faddb67_6c8de4d1","updated":"2019-07-13 04:51:25.000000000","message":"Done","commit_id":"f6644905baa1e31deb64f698da0609f1df8621e3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        except (exception.UnmatchAZException) as e1:"},{"line_number":123,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de1.format_message())"},{"line_number":124,"context_line":"        except exception.InvalidRequest as e2:"},{"line_number":125,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de2.format_message())"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_8036ceb3","line":125,"updated":"2019-08-16 09:04:38.000000000","message":"InvalidVolume can be raised from https://review.opendev.org/#/c/663851/29/nova/compute/api.py@3682 which is not handled here.","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        except (exception.UnmatchAZException) as e1:"},{"line_number":123,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de1.format_message())"},{"line_number":124,"context_line":"        except exception.InvalidRequest as e2:"},{"line_number":125,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de2.format_message())"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_63a5dc02","line":125,"in_reply_to":"7faddb67_8036ceb3","updated":"2019-08-17 01:02:45.000000000","message":"Yeah, at https://review.opendev.org/#/c/663851/29/nova/volume/cinder.py@533 has the InvalidVolume exception can be raised, need to catch it.","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    # In microversion 2.77 support specifies \u0027availability_zone\u0027 to"},{"line_number":79,"context_line":"    # unshelve a server. But before 2.77 there is no request body"},{"line_number":80,"context_line":"    # schema validation (because of body\u003dnull)."},{"line_number":81,"context_line":"    @validation.schema(schema_servers.unshelve_v277, \u00272.77\u0027)"},{"line_number":82,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":83,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":84,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_a234f249","line":81,"range":{"start_line":81,"start_character":53,"end_line":81,"end_character":59},"updated":"2019-08-20 23:03:11.000000000","message":"nit: using min_version\u003d\u00272.77\u0027 would make this more clear","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    # In microversion 2.77 support specifies \u0027availability_zone\u0027 to"},{"line_number":79,"context_line":"    # unshelve a server. But before 2.77 there is no request body"},{"line_number":80,"context_line":"    # schema validation (because of body\u003dnull)."},{"line_number":81,"context_line":"    @validation.schema(schema_servers.unshelve_v277, \u00272.77\u0027)"},{"line_number":82,"context_line":"    def _unshelve(self, req, id, body):"},{"line_number":83,"context_line":"        \"\"\"Restore an instance from shelved mode.\"\"\""},{"line_number":84,"context_line":"        context \u003d req.environ[\"nova.context\"]"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_4828bfe0","line":81,"range":{"start_line":81,"start_character":53,"end_line":81,"end_character":59},"in_reply_to":"7faddb67_a234f249","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":94,"context_line":"            else:"},{"line_number":95,"context_line":"                msg \u003d _(\"The unshelve action on a server with specifying \""},{"line_number":96,"context_line":"                        \"\u0027availability_zone\u0027 is supported by microversion \""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_0245c6b3","line":93,"range":{"start_line":93,"start_character":38,"end_line":93,"end_character":43},"updated":"2019-08-20 23:03:11.000000000","message":"nit: you can just do:\n\nunshelve_dict[\u0027availability_zone\u0027]\n\nSince you already checked that the key is in the dict above.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":94,"context_line":"            else:"},{"line_number":95,"context_line":"                msg \u003d _(\"The unshelve action on a server with specifying \""},{"line_number":96,"context_line":"                        \"\u0027availability_zone\u0027 is supported by microversion \""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_2819c3cf","line":93,"range":{"start_line":93,"start_character":38,"end_line":93,"end_character":43},"in_reply_to":"7faddb67_0245c6b3","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":94,"context_line":"            else:"},{"line_number":95,"context_line":"                msg \u003d _(\"The unshelve action on a server with specifying \""},{"line_number":96,"context_line":"                        \"\u0027availability_zone\u0027 is supported by microversion \""},{"line_number":97,"context_line":"                        \"2.77.\")"},{"line_number":98,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # We could potentially move this check to conductor and avoid the"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_c2148ea2","line":97,"range":{"start_line":95,"start_character":22,"end_line":97,"end_character":32},"updated":"2019-08-20 23:03:11.000000000","message":"Let\u0027s re-word this as:\n\n\u0027The \"availability_zone\" parameter is only allowed with microversion 2.77 or greater.\u0027","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict.get(\u0027availability_zone\u0027)"},{"line_number":94,"context_line":"            else:"},{"line_number":95,"context_line":"                msg \u003d _(\"The unshelve action on a server with specifying \""},{"line_number":96,"context_line":"                        \"\u0027availability_zone\u0027 is supported by microversion \""},{"line_number":97,"context_line":"                        \"2.77.\")"},{"line_number":98,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # We could potentially move this check to conductor and avoid the"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_88cd5731","line":97,"range":{"start_line":95,"start_character":22,"end_line":97,"end_character":32},"in_reply_to":"7faddb67_c2148ea2","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                msg \u003d _(\"The unshelve action on a server with specifying \""},{"line_number":96,"context_line":"                        \"\u0027availability_zone\u0027 is supported by microversion \""},{"line_number":97,"context_line":"                        \"2.77.\")"},{"line_number":98,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # We could potentially move this check to conductor and avoid the"},{"line_number":101,"context_line":"        # extra API call to neutron when we support move operations with ports"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_623a7a34","line":98,"updated":"2019-08-20 23:03:11.000000000","message":"Are you explicitly checking this here because we don\u0027t have any request body schema validation prior to 2.77? If so, let\u0027s add a comment about that since it looks out of place otherwise (normally the schema validation would handle this for us).","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                msg \u003d _(\"The unshelve action on a server with specifying \""},{"line_number":96,"context_line":"                        \"\u0027availability_zone\u0027 is supported by microversion \""},{"line_number":97,"context_line":"                        \"2.77.\")"},{"line_number":98,"context_line":"                raise exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # We could potentially move this check to conductor and avoid the"},{"line_number":101,"context_line":"        # extra API call to neutron when we support move operations with ports"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_08e1679b","line":98,"in_reply_to":"7faddb67_623a7a34","updated":"2019-08-21 08:16:31.000000000","message":"Yeah, this can be handled by schema validation, just want to throw the accurate mistakes, but seem to be superfluous, remove this.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # We could potentially move this check to conductor and avoid the"},{"line_number":101,"context_line":"        # extra API call to neutron when we support move operations with ports"},{"line_number":102,"context_line":"        # having resource requests."},{"line_number":103,"context_line":"        if (instance.vm_state \u003d\u003d vm_states.SHELVED_OFFLOADED and"},{"line_number":104,"context_line":"                common.instance_has_port_with_resource_request("},{"line_number":105,"context_line":"                    context, instance.uuid, self.network_api) and"},{"line_number":106,"context_line":"                not common.supports_port_resource_request_during_move("}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_42289ee0","line":103,"updated":"2019-08-20 23:03:11.000000000","message":"Like this, why not check the SHELVED_OFFLOADED status here in the controller if we get past the 2.77 check above and new_az is not None? I guess because you wanted to consolidate the validation in _validate_unshelve_az? That\u0027s fine.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # We could potentially move this check to conductor and avoid the"},{"line_number":101,"context_line":"        # extra API call to neutron when we support move operations with ports"},{"line_number":102,"context_line":"        # having resource requests."},{"line_number":103,"context_line":"        if (instance.vm_state \u003d\u003d vm_states.SHELVED_OFFLOADED and"},{"line_number":104,"context_line":"                common.instance_has_port_with_resource_request("},{"line_number":105,"context_line":"                    context, instance.uuid, self.network_api) and"},{"line_number":106,"context_line":"                not common.supports_port_resource_request_during_move("}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_48775fd5","line":103,"in_reply_to":"7faddb67_42289ee0","updated":"2019-08-21 08:16:31.000000000","message":"yes.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":120,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":121,"context_line":"                                                                  id)"},{"line_number":122,"context_line":"        except (exception.UnmatchAZException) as e1:"},{"line_number":123,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de1.format_message())"},{"line_number":124,"context_line":"        except exception.InvalidRequest as e2:"},{"line_number":125,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de2.format_message())"},{"line_number":126,"context_line":"        except exception.InvalidVolume as e3:"},{"line_number":127,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de3.format_message())"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_820a1676","line":127,"range":{"start_line":122,"start_character":8,"end_line":127,"end_character":69},"updated":"2019-08-20 23:03:11.000000000","message":"nit: you can throw these all into the same except block:\n\nexcept (exception.UnmatchAZException,\n        exception.InvalidRequest,\n        exception.InvalidVolume) as e:\n    raise exc.HTTPBadRequest(explanation\u003de.format_message())","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":120,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":121,"context_line":"                                                                  id)"},{"line_number":122,"context_line":"        except (exception.UnmatchAZException) as e1:"},{"line_number":123,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de1.format_message())"},{"line_number":124,"context_line":"        except exception.InvalidRequest as e2:"},{"line_number":125,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de2.format_message())"},{"line_number":126,"context_line":"        except exception.InvalidVolume as e3:"},{"line_number":127,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de3.format_message())"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_c84caf9f","line":127,"range":{"start_line":122,"start_character":8,"end_line":127,"end_character":69},"in_reply_to":"7faddb67_820a1676","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97d42a8332dce74a124f49a85c1d2e10efa7ec35","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        if body and \u0027unshelve\u0027 in body:"},{"line_number":90,"context_line":"            unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":91,"context_line":"            if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":92,"context_line":"                support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_d0b19146","line":89,"updated":"2019-08-22 15:52:22.000000000","message":"We shouldn\u0027t need this. I\u0027m assuming you added it because of some unit test that was failing? But the body should always be present and contain \u0027unshelve\u0027. This likely indicates you have a broken test somewhere?\n\nIn a real working scenario we shouldn\u0027t even get to this point if \u0027unshelve\u0027 is not in the body because of @wsgi.action(\u0027unshelve\u0027) above.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        if body and \u0027unshelve\u0027 in body:"},{"line_number":90,"context_line":"            unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":91,"context_line":"            if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":92,"context_line":"                support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_3af31ba2","line":89,"in_reply_to":"7faddb67_d0b19146","updated":"2019-08-23 00:33:03.000000000","message":"En, yes, the @wsgi.action(\u0027unshelve\u0027) will be raise the error if request bad. I thought this from a bad test when I debug some test (but I can\u0027t remember)","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict[\u0027availability_zone\u0027]"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_7e73a717","line":91,"range":{"start_line":90,"start_character":0,"end_line":91,"end_character":70},"updated":"2019-08-26 08:17:05.000000000","message":"we can simplify the check like this:\n\nif support_az:\n   if body[\u0027unshelve\u0027]:\n        .....","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"77420b56fc626c2047bfd6fb40823d5848a6e85f","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict[\u0027availability_zone\u0027]"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_dc263ccc","line":91,"range":{"start_line":90,"start_character":0,"end_line":91,"end_character":70},"in_reply_to":"7faddb67_4c62c1af","updated":"2019-08-28 04:15:30.000000000","message":"yes, it is same, but since \u0027availalbe_zone\u0027 is required field, so the check of unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict are duplicated.","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"886c458f90f8803c09bb67864a46dbe9f84bda48","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict[\u0027availability_zone\u0027]"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_4c62c1af","line":91,"range":{"start_line":90,"start_character":0,"end_line":91,"end_character":70},"in_reply_to":"7faddb67_7e73a717","updated":"2019-08-26 09:59:37.000000000","message":"I think they are the same :P","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6b10d95bffce3e9a440690b692ca3bdee70adb35","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        new_az \u003d None"},{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict[\u0027availability_zone\u0027]"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_fbb5377f","line":91,"range":{"start_line":90,"start_character":0,"end_line":91,"end_character":70},"in_reply_to":"7faddb67_dc263ccc","updated":"2019-08-28 13:32:52.000000000","message":"\u003e yes, it is same, but since \u0027availalbe_zone\u0027 is required field, so\n \u003e the check of unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict\n \u003e are duplicated.\n\nTrue, could be changed easily in a follow up. This was likely missed because whether or not \u0027availability_zone\u0027 was required in the schema changed a few times.","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    @wsgi.response(202)"},{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    # In microversion 2.77 support specifies \u0027availability_zone\u0027 to"},{"line_number":79,"context_line":"    # unshelve a server. But before 2.77 there is no request body"},{"line_number":80,"context_line":"    # schema validation (because of body\u003dnull)."},{"line_number":81,"context_line":"    @validation.schema(shelve_schemas.unshelve_v277, min_version\u003d\u00272.77\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1f5cd417","line":78,"range":{"start_line":78,"start_character":27,"end_line":78,"end_character":44},"updated":"2019-08-27 14:53:25.000000000","message":"we support specifying","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    @wsgi.response(202)"},{"line_number":76,"context_line":"    @wsgi.expected_errors((400, 404, 409))"},{"line_number":77,"context_line":"    @wsgi.action(\u0027unshelve\u0027)"},{"line_number":78,"context_line":"    # In microversion 2.77 support specifies \u0027availability_zone\u0027 to"},{"line_number":79,"context_line":"    # unshelve a server. But before 2.77 there is no request body"},{"line_number":80,"context_line":"    # schema validation (because of body\u003dnull)."},{"line_number":81,"context_line":"    @validation.schema(shelve_schemas.unshelve_v277, min_version\u003d\u00272.77\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_7c7953f9","line":78,"range":{"start_line":78,"start_character":27,"end_line":78,"end_character":44},"in_reply_to":"7faddb67_1f5cd417","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict[\u0027availability_zone\u0027]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # We could potentially move this check to conductor and avoid the"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_7f7b887a","line":92,"updated":"2019-08-27 14:53:25.000000000","message":"We should have a unit test where we pass availability_zone before 2.77 and make sure it\u0027s ignored, which should be as simple as making sure that compute_api.unshelve is called with new_az\u003dNone. Schema validation wouldn\u0027t fail because we wouldn\u0027t apply it before 2.77, but the requested AZ would be ignored. That\u0027s weird UX but it\u0027s kind of the best we can do since raising an error in that case would be a backward incompatible API change.\n\n(later)\n\nActually it looks like test_unshelve_with_az_pre_2_77_failed is the test for what I\u0027m asking but I\u0027m not sure why it\u0027s failing.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"827675c6e0c781739c3767a3fab360bb8de19b69","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        unshelve_dict \u003d body[\u0027unshelve\u0027]"},{"line_number":90,"context_line":"        if unshelve_dict and \u0027availability_zone\u0027 in unshelve_dict:"},{"line_number":91,"context_line":"            support_az \u003d api_version_request.is_supported(req, \u00272.77\u0027)"},{"line_number":92,"context_line":"            if support_az:"},{"line_number":93,"context_line":"                new_az \u003d unshelve_dict[\u0027availability_zone\u0027]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # We could potentially move this check to conductor and avoid the"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_e2e35805","line":92,"in_reply_to":"7faddb67_7f7b887a","updated":"2019-08-27 17:02:34.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            self.compute_api.unshelve(context, instance, new_az\u003dnew_az)"},{"line_number":111,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":112,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":113,"context_line":"        except exception.InstanceInvalidState as state_error:"},{"line_number":114,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":115,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":116,"context_line":"                                                                  id)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_9a2212a3","line":113,"updated":"2019-08-27 14:53:25.000000000","message":"Hmm, won\u0027t UnshelveInstanceInvalidState be caught here since it extends InstanceInvalidState? If you moved the two new conflict exceptions below into the group with InstanceIsLocked above we could avoid that, and/or don\u0027t make UnshelveInstanceInvalidState extend InstanceInvalidState.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            self.compute_api.unshelve(context, instance, new_az\u003dnew_az)"},{"line_number":111,"context_line":"        except exception.InstanceIsLocked as e:"},{"line_number":112,"context_line":"            raise exc.HTTPConflict(explanation\u003de.format_message())"},{"line_number":113,"context_line":"        except exception.InstanceInvalidState as state_error:"},{"line_number":114,"context_line":"            common.raise_http_conflict_for_instance_invalid_state(state_error,"},{"line_number":115,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":116,"context_line":"                                                                  id)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1c805fbf","line":113,"in_reply_to":"7faddb67_9a2212a3","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":116,"context_line":"                                                                  id)"},{"line_number":117,"context_line":"        except (exception.InvalidRequest,"},{"line_number":118,"context_line":"                exception.InvalidVolume) as e:"},{"line_number":119,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":120,"context_line":"        except (exception.UnshelveInstanceInvalidState,"},{"line_number":121,"context_line":"                exception.UnmatchAZException) as ex:"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_fc64634f","line":118,"range":{"start_line":118,"start_character":26,"end_line":118,"end_character":39},"updated":"2019-08-27 16:57:48.000000000","message":"Does anything raise this now?","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"827675c6e0c781739c3767a3fab360bb8de19b69","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                                                                  \u0027unshelve\u0027,"},{"line_number":116,"context_line":"                                                                  id)"},{"line_number":117,"context_line":"        except (exception.InvalidRequest,"},{"line_number":118,"context_line":"                exception.InvalidVolume) as e:"},{"line_number":119,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":120,"context_line":"        except (exception.UnshelveInstanceInvalidState,"},{"line_number":121,"context_line":"                exception.UnmatchAZException) as ex:"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_02df9438","line":118,"range":{"start_line":118,"start_character":26,"end_line":118,"end_character":39},"in_reply_to":"7faddb67_fc64634f","updated":"2019-08-27 17:02:34.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        except (exception.InvalidRequest,"},{"line_number":118,"context_line":"                exception.InvalidVolume) as e:"},{"line_number":119,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":120,"context_line":"        except (exception.UnshelveInstanceInvalidState,"},{"line_number":121,"context_line":"                exception.UnmatchAZException) as ex:"},{"line_number":122,"context_line":"            raise exc.HTTPConflict(explanation\u003dex.format_message())"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3fdaf078","line":121,"range":{"start_line":120,"start_character":8,"end_line":121,"end_character":52},"updated":"2019-08-27 14:53:25.000000000","message":"nit: you can group these with InstanceIsLocked above.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        except (exception.InvalidRequest,"},{"line_number":118,"context_line":"                exception.InvalidVolume) as e:"},{"line_number":119,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":120,"context_line":"        except (exception.UnshelveInstanceInvalidState,"},{"line_number":121,"context_line":"                exception.UnmatchAZException) as ex:"},{"line_number":122,"context_line":"            raise exc.HTTPConflict(explanation\u003dex.format_message())"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3c83dbcd","line":121,"range":{"start_line":120,"start_character":8,"end_line":121,"end_character":52},"in_reply_to":"7faddb67_3fdaf078","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"nova/compute/api.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":3658,"context_line":"        vm_states.SHELVED_OFFLOADED])"},{"line_number":3659,"context_line":"    def unshelve(self, context, instance, new_az\u003dNone):"},{"line_number":3660,"context_line":"        \"\"\"Restore a shelved instance.\"\"\""},{"line_number":3661,"context_line":"        self._validate_unshelve_az(context, instance, new_az)"},{"line_number":3662,"context_line":""},{"line_number":3663,"context_line":"        request_spec \u003d objects.RequestSpec.get_by_instance_uuid("},{"line_number":3664,"context_line":"            context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_0585ee06","line":3661,"updated":"2019-06-27 16:06:15.000000000","message":"Should we not check that it is a known availability zone, before we update that in the DB, etc?\n\nPlease see this example:\nhttps://github.com/openstack/nova/blob/7b769ad403751268c60b095f722437cbed692071/nova/compute/api.py#L1823","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":3658,"context_line":"        vm_states.SHELVED_OFFLOADED])"},{"line_number":3659,"context_line":"    def unshelve(self, context, instance, new_az\u003dNone):"},{"line_number":3660,"context_line":"        \"\"\"Restore a shelved instance.\"\"\""},{"line_number":3661,"context_line":"        self._validate_unshelve_az(context, instance, new_az)"},{"line_number":3662,"context_line":""},{"line_number":3663,"context_line":"        request_spec \u003d objects.RequestSpec.get_by_instance_uuid("},{"line_number":3664,"context_line":"            context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_af705da5","line":3661,"in_reply_to":"9fb8cfa7_0585ee06","updated":"2019-07-01 13:27:29.000000000","message":"Emm.., it\u0027s necessary.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":3671,"context_line":"                \"new_az\": new_az,"},{"line_number":3672,"context_line":"                \"instance_uuid\": instance.uuid})"},{"line_number":3673,"context_line":"            request_spec.availability_zone \u003d new_az"},{"line_number":3674,"context_line":"            request_spec.save()"},{"line_number":3675,"context_line":""},{"line_number":3676,"context_line":"        instance.task_state \u003d task_states.UNSHELVING"},{"line_number":3677,"context_line":"        instance.save(expected_task_state\u003d[None])"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_a2617807","line":3674,"updated":"2019-06-27 16:06:15.000000000","message":"This is so we don\u0027t change the compute_task_api signature I suppose... feels nasty some how.\n\nI can\u0027t decide if this is the correct place to make the change, certainly feels like this should come after _record_action_start. Fees like this the first change once we are sure we have the task_state updated (i.e. so we don\u0027t race with two people trying to do this at once).","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":3668,"context_line":"                msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3669,"context_line":"                raise exception.InvalidRequest(msg)"},{"line_number":3670,"context_line":""},{"line_number":3671,"context_line":"            if instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":3672,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, it still"},{"line_number":3673,"context_line":"                # belongs to a host, the availability_zone has not changed."},{"line_number":3674,"context_line":"                # Unshelving a shelved offloaded server will go through the"},{"line_number":3675,"context_line":"                # scheduler to find a new host."},{"line_number":3676,"context_line":"                raise exception.InstanceInvalidState("},{"line_number":3677,"context_line":"                    instance_uuid\u003dinstance.uuid, attr\u003d\u0027vm_state\u0027,"},{"line_number":3678,"context_line":"                    state\u003dinstance.vm_state, method\u003d\u0027unshelve\u0027)"},{"line_number":3679,"context_line":""},{"line_number":3680,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3681,"context_line":"            context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_71b77188","line":3678,"range":{"start_line":3671,"start_character":0,"end_line":3678,"end_character":63},"updated":"2019-07-05 06:22:42.000000000","message":"can we move this first so that we can fail early before we try to find the requested AZ.","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":3668,"context_line":"                msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3669,"context_line":"                raise exception.InvalidRequest(msg)"},{"line_number":3670,"context_line":""},{"line_number":3671,"context_line":"            if instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":3672,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, it still"},{"line_number":3673,"context_line":"                # belongs to a host, the availability_zone has not changed."},{"line_number":3674,"context_line":"                # Unshelving a shelved offloaded server will go through the"},{"line_number":3675,"context_line":"                # scheduler to find a new host."},{"line_number":3676,"context_line":"                raise exception.InstanceInvalidState("},{"line_number":3677,"context_line":"                    instance_uuid\u003dinstance.uuid, attr\u003d\u0027vm_state\u0027,"},{"line_number":3678,"context_line":"                    state\u003dinstance.vm_state, method\u003d\u0027unshelve\u0027)"},{"line_number":3679,"context_line":""},{"line_number":3680,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3681,"context_line":"            context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_16213dfc","line":3678,"range":{"start_line":3671,"start_character":0,"end_line":3678,"end_character":63},"in_reply_to":"7faddb67_71b77188","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":3674,"context_line":"                msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3675,"context_line":"                raise exception.InvalidRequest(msg)"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3678,"context_line":"            context, instance.uuid)"},{"line_number":3679,"context_line":"        for bdm in bdms:"},{"line_number":3680,"context_line":"            if bdm.is_volume and bdm.volume_id:"},{"line_number":3681,"context_line":"                volume \u003d self.volume_api.get(context, bdm.volume_id)"},{"line_number":3682,"context_line":"                self.volume_api.check_availability_zone("},{"line_number":3683,"context_line":"                    context, volume, new_az\u003davailability_zone)"},{"line_number":3684,"context_line":""},{"line_number":3685,"context_line":"    @check_instance_lock"},{"line_number":3686,"context_line":"    @check_instance_state(vm_state\u003d[vm_states.SHELVED,"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_600f12e0","line":3683,"range":{"start_line":3677,"start_character":0,"end_line":3683,"end_character":62},"updated":"2019-08-16 09:04:38.000000000","message":"Is it intentional that we do this check even if no availability_zone is specified in the unshelve request? This means that we changing the behavior of requests with old microversion as well.","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":3674,"context_line":"                msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3675,"context_line":"                raise exception.InvalidRequest(msg)"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"        bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3678,"context_line":"            context, instance.uuid)"},{"line_number":3679,"context_line":"        for bdm in bdms:"},{"line_number":3680,"context_line":"            if bdm.is_volume and bdm.volume_id:"},{"line_number":3681,"context_line":"                volume \u003d self.volume_api.get(context, bdm.volume_id)"},{"line_number":3682,"context_line":"                self.volume_api.check_availability_zone("},{"line_number":3683,"context_line":"                    context, volume, new_az\u003davailability_zone)"},{"line_number":3684,"context_line":""},{"line_number":3685,"context_line":"    @check_instance_lock"},{"line_number":3686,"context_line":"    @check_instance_state(vm_state\u003d[vm_states.SHELVED,"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_835fb8e3","line":3683,"range":{"start_line":3677,"start_character":0,"end_line":3683,"end_character":62},"in_reply_to":"7faddb67_600f12e0","updated":"2019-08-17 01:02:45.000000000","message":"When the availability_zone is None, that is with old microversion it\u0027s not necessary to check the CONF.cinder.cross_az_attach value.","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":3658,"context_line":""},{"line_number":3659,"context_line":"    def _validate_unshelve_az(self, context, instance, availability_zone):"},{"line_number":3660,"context_line":"        \"\"\"Verify the specified availability_zone unshelve a server.\"\"\""},{"line_number":3661,"context_line":"        if availability_zone:"},{"line_number":3662,"context_line":"            if instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":3663,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, it still"},{"line_number":3664,"context_line":"                # belongs to a host, the availability_zone has not changed."}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_c2624e3e","line":3661,"updated":"2019-08-20 23:03:11.000000000","message":"nit: let\u0027s avoid the nesting and just return if availability_zone is None or just not call this method if there is no az.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":3658,"context_line":""},{"line_number":3659,"context_line":"    def _validate_unshelve_az(self, context, instance, availability_zone):"},{"line_number":3660,"context_line":"        \"\"\"Verify the specified availability_zone unshelve a server.\"\"\""},{"line_number":3661,"context_line":"        if availability_zone:"},{"line_number":3662,"context_line":"            if instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":3663,"context_line":"                # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, it still"},{"line_number":3664,"context_line":"                # belongs to a host, the availability_zone has not changed."}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_28ff8302","line":3661,"in_reply_to":"7faddb67_c2624e3e","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":3664,"context_line":"                # belongs to a host, the availability_zone has not changed."},{"line_number":3665,"context_line":"                # Unshelving a shelved offloaded server will go through the"},{"line_number":3666,"context_line":"                # scheduler to find a new host."},{"line_number":3667,"context_line":"                raise exception.InstanceInvalidState("},{"line_number":3668,"context_line":"                    instance_uuid\u003dinstance.uuid, attr\u003d\u0027vm_state\u0027,"},{"line_number":3669,"context_line":"                    state\u003dinstance.vm_state, method\u003d\u0027unshelve\u0027)"},{"line_number":3670,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_c279eefb","line":3667,"range":{"start_line":3667,"start_character":32,"end_line":3667,"end_character":52},"updated":"2019-08-20 23:03:11.000000000","message":"Note that this is normally handled in the API as a 409 response, so we should be consistent with that rather than return a 400. Also, your API controller code isn\u0027t handling this - how is this not a 500 response?\n\nAnd finally, the error message from this won\u0027t be very useful, since it\u0027s going to say you can\u0027t unshelve when the vm_state is \"shelved\" but that is confusing - the real error is you can\u0027t unshelve with an AZ unless the status is SHELVED_OFFLOADED. So if you\u0027re going to raise this, you need to (1) handle it properly to return 409 and (2) override the message so it\u0027s clear.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":3664,"context_line":"                # belongs to a host, the availability_zone has not changed."},{"line_number":3665,"context_line":"                # Unshelving a shelved offloaded server will go through the"},{"line_number":3666,"context_line":"                # scheduler to find a new host."},{"line_number":3667,"context_line":"                raise exception.InstanceInvalidState("},{"line_number":3668,"context_line":"                    instance_uuid\u003dinstance.uuid, attr\u003d\u0027vm_state\u0027,"},{"line_number":3669,"context_line":"                    state\u003dinstance.vm_state, method\u003d\u0027unshelve\u0027)"},{"line_number":3670,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_4bdd196e","line":3667,"range":{"start_line":3667,"start_character":32,"end_line":3667,"end_character":52},"in_reply_to":"7faddb67_c279eefb","updated":"2019-08-21 08:16:31.000000000","message":"Okey, add the 409 exception UnshelveInstanceInvalidState to this check in unshelve API, and override the message.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":3674,"context_line":"                msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3675,"context_line":"                raise exception.InvalidRequest(msg)"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3678,"context_line":"                context, instance.uuid)"},{"line_number":3679,"context_line":"            for bdm in bdms:"},{"line_number":3680,"context_line":"                if bdm.is_volume and bdm.volume_id:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_02738617","line":3677,"updated":"2019-08-20 23:03:11.000000000","message":"First, we should have a comment about why we\u0027re looking up BDMs, and second, we shouldn\u0027t do this query at all if CONF.cinder.cross_az_attach is True.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":3674,"context_line":"                msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3675,"context_line":"                raise exception.InvalidRequest(msg)"},{"line_number":3676,"context_line":""},{"line_number":3677,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3678,"context_line":"                context, instance.uuid)"},{"line_number":3679,"context_line":"            for bdm in bdms:"},{"line_number":3680,"context_line":"                if bdm.is_volume and bdm.volume_id:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_4b7759d5","line":3677,"in_reply_to":"7faddb67_02738617","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":3695,"context_line":"        if new_az:"},{"line_number":3696,"context_line":"            LOG.debug(\"Replace the old AZ %(old_az)s in RequestSpec \""},{"line_number":3697,"context_line":"                      \"with a new AZ %(new_az)s of the instance \""},{"line_number":3698,"context_line":"                      \"%(instance_uuid)s.\", {"},{"line_number":3699,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3700,"context_line":"                \"new_az\": new_az,"},{"line_number":3701,"context_line":"                \"instance_uuid\": instance.uuid})"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_8258d689","line":3698,"range":{"start_line":3698,"start_character":23,"end_line":3698,"end_character":40},"updated":"2019-08-20 23:03:11.000000000","message":"nit: you can just use the instance\u003dinstance kwarg on the LOG.debug method and avoid putting the instance_uuid variable in the message. oslo.log will automatically log the uuid.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":3695,"context_line":"        if new_az:"},{"line_number":3696,"context_line":"            LOG.debug(\"Replace the old AZ %(old_az)s in RequestSpec \""},{"line_number":3697,"context_line":"                      \"with a new AZ %(new_az)s of the instance \""},{"line_number":3698,"context_line":"                      \"%(instance_uuid)s.\", {"},{"line_number":3699,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3700,"context_line":"                \"new_az\": new_az,"},{"line_number":3701,"context_line":"                \"instance_uuid\": instance.uuid})"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_6b3a5534","line":3698,"range":{"start_line":3698,"start_character":23,"end_line":3698,"end_character":40},"in_reply_to":"7faddb67_8258d689","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":3700,"context_line":"                \"new_az\": new_az,"},{"line_number":3701,"context_line":"                \"instance_uuid\": instance.uuid})"},{"line_number":3702,"context_line":"            request_spec.availability_zone \u003d new_az"},{"line_number":3703,"context_line":"            request_spec.save()"},{"line_number":3704,"context_line":""},{"line_number":3705,"context_line":"        instance.task_state \u003d task_states.UNSHELVING"},{"line_number":3706,"context_line":"        instance.save(expected_task_state\u003d[None])"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_c2f00e6a","line":3703,"updated":"2019-08-20 23:03:11.000000000","message":"What is unfortunate about this is if the unshelve fails, or scheduling fails, the RequestSpec is stuck with the az set on it. I think I\u0027ve mentioned this before. We could defer persisting the change to the RequestSpec until later in conductor but that requires a bit more change, like passing the new_az over the RPC method. Maybe just add a TODO for now for thinking about this later.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":3700,"context_line":"                \"new_az\": new_az,"},{"line_number":3701,"context_line":"                \"instance_uuid\": instance.uuid})"},{"line_number":3702,"context_line":"            request_spec.availability_zone \u003d new_az"},{"line_number":3703,"context_line":"            request_spec.save()"},{"line_number":3704,"context_line":""},{"line_number":3705,"context_line":"        instance.task_state \u003d task_states.UNSHELVING"},{"line_number":3706,"context_line":"        instance.save(expected_task_state\u003d[None])"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_56b2a095","line":3703,"in_reply_to":"7faddb67_c2f00e6a","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve"},{"line_number":3676,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dFalse, need"},{"line_number":3677,"context_line":"        # to this determine if their AZ matches the user-specified AZ."},{"line_number":3678,"context_line":"        if not CONF.cinder.cross_az_attach:"},{"line_number":3679,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3680,"context_line":"                context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_dfdd356d","line":3677,"range":{"start_line":3677,"start_character":31,"end_line":3677,"end_character":36},"updated":"2019-08-21 19:51:19.000000000","message":"attached volume AZ matches","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve"},{"line_number":3676,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dFalse, need"},{"line_number":3677,"context_line":"        # to this determine if their AZ matches the user-specified AZ."},{"line_number":3678,"context_line":"        if not CONF.cinder.cross_az_attach:"},{"line_number":3679,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3680,"context_line":"                context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_5ff2a506","line":3677,"range":{"start_line":3677,"start_character":13,"end_line":3677,"end_character":17},"updated":"2019-08-21 19:51:19.000000000","message":"nix","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b928e5dc101f27ec232fae17ffc3413aaf7f6481","unresolved":false,"context_lines":[{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve"},{"line_number":3676,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dFalse, need"},{"line_number":3677,"context_line":"        # to this determine if their AZ matches the user-specified AZ."},{"line_number":3678,"context_line":"        if not CONF.cinder.cross_az_attach:"},{"line_number":3679,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3680,"context_line":"                context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_8d6310b1","line":3677,"range":{"start_line":3677,"start_character":13,"end_line":3677,"end_character":17},"in_reply_to":"7faddb67_5ff2a506","updated":"2019-08-22 02:31:36.000000000","message":"Done","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b928e5dc101f27ec232fae17ffc3413aaf7f6481","unresolved":false,"context_lines":[{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve"},{"line_number":3676,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dFalse, need"},{"line_number":3677,"context_line":"        # to this determine if their AZ matches the user-specified AZ."},{"line_number":3678,"context_line":"        if not CONF.cinder.cross_az_attach:"},{"line_number":3679,"context_line":"            bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":3680,"context_line":"                context, instance.uuid)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_2d569ccf","line":3677,"range":{"start_line":3677,"start_character":31,"end_line":3677,"end_character":36},"in_reply_to":"7faddb67_dfdd356d","updated":"2019-08-22 02:31:36.000000000","message":"Done","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":3684,"context_line":"                if bdm.is_volume and bdm.volume_id:"},{"line_number":3685,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.volume_id)"},{"line_number":3686,"context_line":"                    if availability_zone !\u003d volume[\u0027availability_zone\u0027]:"},{"line_number":3687,"context_line":"                        msg \u003d _(\"The specified availability zone does not \""},{"line_number":3688,"context_line":"                                \"match the volume %(vol_id)s attached to the \""},{"line_number":3689,"context_line":"                                \"server. Specified availability zone is \""},{"line_number":3690,"context_line":"                                \"%(az)s. Volume is in %(vol_zone)s.\") % {"},{"line_number":3691,"context_line":"                            \"vol_id\": volume[\u0027id\u0027],"},{"line_number":3692,"context_line":"                            \"az\": availability_zone,"},{"line_number":3693,"context_line":"                            \"vol_zone\": volume[\u0027availability_zone\u0027]}"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_e10cd63a","line":3690,"range":{"start_line":3687,"start_character":24,"end_line":3690,"end_character":69},"updated":"2019-08-26 08:17:05.000000000","message":"you can put those message into the exeption.","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"886c458f90f8803c09bb67864a46dbe9f84bda48","unresolved":false,"context_lines":[{"line_number":3684,"context_line":"                if bdm.is_volume and bdm.volume_id:"},{"line_number":3685,"context_line":"                    volume \u003d self.volume_api.get(context, bdm.volume_id)"},{"line_number":3686,"context_line":"                    if availability_zone !\u003d volume[\u0027availability_zone\u0027]:"},{"line_number":3687,"context_line":"                        msg \u003d _(\"The specified availability zone does not \""},{"line_number":3688,"context_line":"                                \"match the volume %(vol_id)s attached to the \""},{"line_number":3689,"context_line":"                                \"server. Specified availability zone is \""},{"line_number":3690,"context_line":"                                \"%(az)s. Volume is in %(vol_zone)s.\") % {"},{"line_number":3691,"context_line":"                            \"vol_id\": volume[\u0027id\u0027],"},{"line_number":3692,"context_line":"                            \"az\": availability_zone,"},{"line_number":3693,"context_line":"                            \"vol_zone\": volume[\u0027availability_zone\u0027]}"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_4c4f216a","line":3690,"range":{"start_line":3687,"start_character":24,"end_line":3690,"end_character":69},"in_reply_to":"7faddb67_e10cd63a","updated":"2019-08-26 09:59:37.000000000","message":"IMO, that\u0027s the log when their availability zone are not match, put here is clearly, and isnot has some many place to use this.","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."},{"line_number":3713,"context_line":"            request_spec.availability_zone \u003d new_az"},{"line_number":3714,"context_line":"            request_spec.save()"},{"line_number":3715,"context_line":""},{"line_number":3716,"context_line":"        instance.task_state \u003d task_states.UNSHELVING"},{"line_number":3717,"context_line":"        instance.save(expected_task_state\u003d[None])"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_3e920ffe","line":3714,"range":{"start_line":3714,"start_character":12,"end_line":3714,"end_character":31},"updated":"2019-08-26 08:17:05.000000000","message":"can we save this later?","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"886c458f90f8803c09bb67864a46dbe9f84bda48","unresolved":false,"context_lines":[{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."},{"line_number":3713,"context_line":"            request_spec.availability_zone \u003d new_az"},{"line_number":3714,"context_line":"            request_spec.save()"},{"line_number":3715,"context_line":""},{"line_number":3716,"context_line":"        instance.task_state \u003d task_states.UNSHELVING"},{"line_number":3717,"context_line":"        instance.save(expected_task_state\u003d[None])"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_6ce3fd35","line":3714,"range":{"start_line":3714,"start_character":12,"end_line":3714,"end_character":31},"in_reply_to":"7faddb67_3e920ffe","updated":"2019-08-26 09:59:37.000000000","message":"There is not much difference between the back and putting it here.I just add a TODO for now for thinking about this later. In PS34, said this issue.\n[1]https://review.opendev.org/#/c/663851/34/nova/compute/api.py@3703","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":3659,"context_line":"            clean_shutdown\u003dclean_shutdown)"},{"line_number":3660,"context_line":""},{"line_number":3661,"context_line":"    def _validate_unshelve_az(self, context, instance, availability_zone):"},{"line_number":3662,"context_line":"        \"\"\"Verify the specified availability_zone unshelve a server.\"\"\""},{"line_number":3663,"context_line":"        if instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":3664,"context_line":"            # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, it still"},{"line_number":3665,"context_line":"            # belongs to a host, the availability_zone has not changed."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1fdff466","line":3662,"range":{"start_line":3662,"start_character":50,"end_line":3662,"end_character":68},"updated":"2019-08-27 14:53:25.000000000","message":"during unshelve","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":3659,"context_line":"            clean_shutdown\u003dclean_shutdown)"},{"line_number":3660,"context_line":""},{"line_number":3661,"context_line":"    def _validate_unshelve_az(self, context, instance, availability_zone):"},{"line_number":3662,"context_line":"        \"\"\"Verify the specified availability_zone unshelve a server.\"\"\""},{"line_number":3663,"context_line":"        if instance.vm_state !\u003d vm_states.SHELVED_OFFLOADED:"},{"line_number":3664,"context_line":"            # NOTE(brinzhang): If the server status is \u0027SHELVED\u0027, it still"},{"line_number":3665,"context_line":"            # belongs to a host, the availability_zone has not changed."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5c5fb774","line":3662,"range":{"start_line":3662,"start_character":50,"end_line":3662,"end_character":68},"in_reply_to":"7faddb67_1fdff466","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":3669,"context_line":"                state\u003dinstance.vm_state, instance_uuid\u003dinstance.uuid)"},{"line_number":3670,"context_line":""},{"line_number":3671,"context_line":"        available_zones \u003d availability_zones.get_availability_zones("},{"line_number":3672,"context_line":"            context.elevated(), self.host_api, get_only_available\u003dTrue)"},{"line_number":3673,"context_line":"        if availability_zone not in available_zones:"},{"line_number":3674,"context_line":"            msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3675,"context_line":"            raise exception.InvalidRequest(msg)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_9fcc44bc","line":3672,"range":{"start_line":3672,"start_character":20,"end_line":3672,"end_character":28},"updated":"2019-08-27 14:53:25.000000000","message":"I don\u0027t think we need this.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":3669,"context_line":"                state\u003dinstance.vm_state, instance_uuid\u003dinstance.uuid)"},{"line_number":3670,"context_line":""},{"line_number":3671,"context_line":"        available_zones \u003d availability_zones.get_availability_zones("},{"line_number":3672,"context_line":"            context.elevated(), self.host_api, get_only_available\u003dTrue)"},{"line_number":3673,"context_line":"        if availability_zone not in available_zones:"},{"line_number":3674,"context_line":"            msg \u003d _(\u0027The requested availability zone is not available\u0027)"},{"line_number":3675,"context_line":"            raise exception.InvalidRequest(msg)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_7c62b33f","line":3672,"range":{"start_line":3672,"start_character":20,"end_line":3672,"end_character":28},"in_reply_to":"7faddb67_9fcc44bc","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":3705,"context_line":"            self._validate_unshelve_az(context, instance, new_az)"},{"line_number":3706,"context_line":"            LOG.debug(\"Replace the old AZ %(old_az)s in RequestSpec \""},{"line_number":3707,"context_line":"                      \"with a new AZ %(new_az)s of the instance.\", {"},{"line_number":3708,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3709,"context_line":"                \"new_az\": new_az}, instance\u003dinstance)"},{"line_number":3710,"context_line":"            # TODO(brinzhang): Need to figure out if the unshelve fails, or"},{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5fc80c74","line":3709,"range":{"start_line":3708,"start_character":16,"end_line":3709,"end_character":53},"updated":"2019-08-27 14:53:25.000000000","message":"nit: the alignment is a bit weird here","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":3705,"context_line":"            self._validate_unshelve_az(context, instance, new_az)"},{"line_number":3706,"context_line":"            LOG.debug(\"Replace the old AZ %(old_az)s in RequestSpec \""},{"line_number":3707,"context_line":"                      \"with a new AZ %(new_az)s of the instance.\", {"},{"line_number":3708,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3709,"context_line":"                \"new_az\": new_az}, instance\u003dinstance)"},{"line_number":3710,"context_line":"            # TODO(brinzhang): Need to figure out if the unshelve fails, or"},{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_dc52c768","line":3709,"range":{"start_line":3708,"start_character":16,"end_line":3709,"end_character":53},"in_reply_to":"7faddb67_5fc80c74","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":3707,"context_line":"                      \"with a new AZ %(new_az)s of the instance.\", {"},{"line_number":3708,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3709,"context_line":"                \"new_az\": new_az}, instance\u003dinstance)"},{"line_number":3710,"context_line":"            # TODO(brinzhang): Need to figure out if the unshelve fails, or"},{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."},{"line_number":3713,"context_line":"            request_spec.availability_zone \u003d new_az"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3f92f059","line":3710,"range":{"start_line":3710,"start_character":31,"end_line":3710,"end_character":49},"updated":"2019-08-27 14:53:25.000000000","message":"Well, we don\u0027t need to figure it out - we know the RequestSpec is changed here with the new AZ. What we need to determine is if that\u0027s acceptable, or if we should defer updating and saving the RequestSpec until conductor when we call select_destinations in the scheduler and only save the change when we get a host back. That said, I don\u0027t think this is critical since we have other cases like this where we save something to the request spec and we could fail later:\n\nhttps://github.com/openstack/nova/blob/912a46c9d4d3a8cc63724adff70acf8a4fc34d9b/nova/compute/api.py#L3425\n\nhttps://github.com/openstack/nova/blob/912a46c9d4d3a8cc63724adff70acf8a4fc34d9b/nova/conductor/tasks/live_migrate.py#L136\n\nMaybe we should just change your TODO to a NOTE that we know this isn\u0027t great and can change it later if needed.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":3707,"context_line":"                      \"with a new AZ %(new_az)s of the instance.\", {"},{"line_number":3708,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3709,"context_line":"                \"new_az\": new_az}, instance\u003dinstance)"},{"line_number":3710,"context_line":"            # TODO(brinzhang): Need to figure out if the unshelve fails, or"},{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."},{"line_number":3713,"context_line":"            request_spec.availability_zone \u003d new_az"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5c9257fe","line":3710,"range":{"start_line":3710,"start_character":31,"end_line":3710,"end_character":49},"in_reply_to":"7faddb67_3f92f059","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e8f047fec6dc117133e7efaffdcf38437b6cc544","unresolved":false,"context_lines":[{"line_number":3707,"context_line":"                      \"with a new AZ %(new_az)s of the instance.\", {"},{"line_number":3708,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3709,"context_line":"                \"new_az\": new_az}, instance\u003dinstance)"},{"line_number":3710,"context_line":"            # TODO(brinzhang): Need to figure out if the unshelve fails, or"},{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."},{"line_number":3713,"context_line":"            request_spec.availability_zone \u003d new_az"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_fc0a1825","line":3710,"range":{"start_line":3710,"start_character":31,"end_line":3710,"end_character":49},"in_reply_to":"7faddb67_5c3b2ce9","updated":"2019-08-28 04:20:59.000000000","message":"ok, it doesn\u0027t work, since we nil out the instance.available_zone after shelve the instance.\n\nSo the only option saves the request_spec after unshelve the instance successful. Not sure how much cost it. But Matt said it is ok, then I\u0027m ok.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"77420b56fc626c2047bfd6fb40823d5848a6e85f","unresolved":false,"context_lines":[{"line_number":3707,"context_line":"                      \"with a new AZ %(new_az)s of the instance.\", {"},{"line_number":3708,"context_line":"                \"old_az\": request_spec.availability_zone,"},{"line_number":3709,"context_line":"                \"new_az\": new_az}, instance\u003dinstance)"},{"line_number":3710,"context_line":"            # TODO(brinzhang): Need to figure out if the unshelve fails, or"},{"line_number":3711,"context_line":"            # scheduling fails, the RequestSpec is stuck with the availability"},{"line_number":3712,"context_line":"            # zone on it."},{"line_number":3713,"context_line":"            request_spec.availability_zone \u003d new_az"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5c3b2ce9","line":3710,"range":{"start_line":3710,"start_character":31,"end_line":3710,"end_character":49},"in_reply_to":"7faddb67_5c9257fe","updated":"2019-08-28 04:15:30.000000000","message":"If we are going to save here, we can change this code a little like this:\n\naz_zone \u003d instance.available_zone\n\nif new_az:\n     self._validate_unshelve_az(context, instance, new_az)\n     az_zone \u003d new_az\n\nrequest_spec.available_zone \u003d az_zone\nrequest_spec.save()\n\nThen we can ensure the second time unshelve, we still can get original az if the user doesn\u0027t specified one.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"72df65663e6bc331c9927ee0d364ccf5e11a1cbd","unresolved":false,"context_lines":[{"line_number":3723,"context_line":"                      {\"old_az\": request_spec.availability_zone,"},{"line_number":3724,"context_line":"                       \"new_az\": new_az}, instance\u003dinstance)"},{"line_number":3725,"context_line":"            # Unshelving a shelved offloaded server will go through the"},{"line_number":3726,"context_line":"            # scheduler to pick a new host, so we update the"},{"line_number":3727,"context_line":"            # RequestSpec.availability_zone here. Note that if scheduling"},{"line_number":3728,"context_line":"            # fails the RequestSpec will remain updated, which is not great,"},{"line_number":3729,"context_line":"            # but if we want to change that we need to defer updating the"}],"source_content_type":"text/x-python","patch_set":43,"id":"7faddb67_7ccf08b3","line":3726,"updated":"2019-08-28 03:09:02.000000000","message":"That\u0027s looks good, thanks.","commit_id":"27b6c18c666389ee68935f28cf340b7673879d6f"}],"nova/conductor/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def unshelve_instance(self, context, instance,"},{"line_number":139,"context_line":"                          request_spec\u003dNone, new_az\u003dNone):"},{"line_number":140,"context_line":"        self.conductor_compute_rpcapi.unshelve_instance("},{"line_number":141,"context_line":"            context, instance\u003dinstance,"},{"line_number":142,"context_line":"            request_spec\u003drequest_spec, new_az\u003dnew_az)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_2ba8188a","line":140,"range":{"start_line":140,"start_character":31,"end_line":140,"end_character":55},"updated":"2019-06-11 18:30:27.000000000","message":"Alternatively, we could avoid the conductor method changes if the API updates the RequestSpec to set the availability_zone.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def unshelve_instance(self, context, instance,"},{"line_number":139,"context_line":"                          request_spec\u003dNone, new_az\u003dNone):"},{"line_number":140,"context_line":"        self.conductor_compute_rpcapi.unshelve_instance("},{"line_number":141,"context_line":"            context, instance\u003dinstance,"},{"line_number":142,"context_line":"            request_spec\u003drequest_spec, new_az\u003dnew_az)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_94591c36","line":140,"range":{"start_line":140,"start_character":31,"end_line":140,"end_character":55},"in_reply_to":"9fb8cfa7_2ba8188a","updated":"2019-06-12 09:00:28.000000000","message":"Yes, this solution looks better and avoids changes to the conductor. At first I also considered this kind of solution, but chose a complicated one, ... little stupid.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":230,"context_line":"    may involve coordinating activities on multiple compute nodes."},{"line_number":231,"context_line":"    \"\"\""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    target \u003d messaging.Target(namespace\u003d\u0027compute_task\u0027, version\u003d\u00271.20\u0027)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def __init__(self):"},{"line_number":236,"context_line":"        super(ComputeTaskManager, self).__init__()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_6bbdb0d6","line":233,"range":{"start_line":233,"start_character":67,"end_line":233,"end_character":69},"updated":"2019-06-11 18:30:27.000000000","message":"This should be updated for the unshelve_instance interface change.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":889,"context_line":"                        context, request_spec, instance)"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"                    if new_az:"},{"line_number":892,"context_line":"                        request_spec.availability_zone \u003d new_az"},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"                    host_lists \u003d self._schedule_instances(context,"},{"line_number":895,"context_line":"                            request_spec, [instance.uuid],"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_cb985c76","line":892,"updated":"2019-06-11 18:30:27.000000000","message":"This isn\u0027t getting persisted anywhere, correct?\n\nSo let\u0027s say I create my server in AZ1, shelve offload and then unshelve in AZ2, delete AZ1 and then resize the server, it will try to be scheduled to AZ1 and fail.\n\nLike I said before, we could avoid the conductor interface changes if you do this in the API and save the changes to the RequestSpec. One issue we could have with doing it in the API is if anything fails in conductor we\u0027ll have persisted the change to the RequestSpec and won\u0027t be rolling it back. I\u0027m not sure yet how much of a problem that is.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":889,"context_line":"                        context, request_spec, instance)"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"                    if new_az:"},{"line_number":892,"context_line":"                        request_spec.availability_zone \u003d new_az"},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"                    host_lists \u003d self._schedule_instances(context,"},{"line_number":895,"context_line":"                            request_spec, [instance.uuid],"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_d4ef941b","line":892,"in_reply_to":"9fb8cfa7_cb985c76","updated":"2019-06-12 09:00:28.000000000","message":"Update the RequestSpec in compute api, ignore this handle here.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"}],"nova/conductor/rpcapi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":410,"context_line":"              }"},{"line_number":411,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":412,"context_line":"            version \u003d \u00271.14\u0027"},{"line_number":413,"context_line":"            del kw[\u0027new_az\u0027]"},{"line_number":414,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":415,"context_line":"            version \u003d \u00271.3\u0027"},{"line_number":416,"context_line":"            del kw[\u0027request_spec\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_8bbee4b1","line":413,"updated":"2019-06-11 18:30:27.000000000","message":"If we\u0027re going to plumb this new parameter through conductor\u0027s RPC API interface, I think we need to raise an exception here if the conductor service is too old to accept the new parameter because otherwise we\u0027re effectively ignoring the user request, and then the API controller code would have to handle that exception here somewhere:\n\nhttps://github.com/openstack/nova/blob/e8b6b0bc78ec229803d1d27f8a4706e2c425bd77/nova/api/openstack/compute/shelve.py#L96","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":410,"context_line":"              }"},{"line_number":411,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":412,"context_line":"            version \u003d \u00271.14\u0027"},{"line_number":413,"context_line":"            del kw[\u0027new_az\u0027]"},{"line_number":414,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":415,"context_line":"            version \u003d \u00271.3\u0027"},{"line_number":416,"context_line":"            del kw[\u0027request_spec\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_344cf040","line":413,"in_reply_to":"9fb8cfa7_8bbee4b1","updated":"2019-06-12 09:00:28.000000000","message":"Ignore this handle please.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"}],"nova/exception.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"    msg_fmt \u003d _(\"Error during unshelve instance %(instance_id)s: %(reason)s\")"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_22ffa202","line":1866,"range":{"start_line":1866,"start_character":25,"end_line":1866,"end_character":32},"updated":"2019-08-20 23:03:11.000000000","message":"I\u0027m not sure if this should be a 400 or a 409 response. The request body is OK but the state of the resource is not valid for the request, but if you changed the AZ you\u0027re using to match the volume(s) or detached the volumes you could make the request again and it might succeed. This is probably a question for the API SIG people (cdent and/or edleafe).","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"    msg_fmt \u003d _(\"Error during unshelve instance %(instance_id)s: %(reason)s\")"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_d61a107b","line":1866,"range":{"start_line":1866,"start_character":25,"end_line":1866,"end_character":32},"in_reply_to":"7faddb67_22ffa202","updated":"2019-08-21 08:16:31.000000000","message":"\u003e The request body is OK but the state of the resource is not\n \u003e valid for the request, but if you changed the AZ you\u0027re using\n \u003e to match the volume(s) or detached the volumes you could make\n \u003e the request again and it might succeed. \n\nIf so, then 409 is more appropriate.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"class UnshelveInstanceInvalidState(InstanceInvalidState):"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_210bce24","line":1869,"range":{"start_line":1869,"start_character":4,"end_line":1869,"end_character":14},"updated":"2019-08-26 08:17:05.000000000","message":"emm...we don\u0027t use this code","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"886c458f90f8803c09bb67864a46dbe9f84bda48","unresolved":false,"context_lines":[{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"class UnshelveInstanceInvalidState(InstanceInvalidState):"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_2c2505af","line":1869,"range":{"start_line":1869,"start_character":4,"end_line":1869,"end_character":14},"in_reply_to":"7faddb67_210bce24","updated":"2019-08-26 09:59:37.000000000","message":"I think specify the code is clearly. The paraent Invalid default code is 400, add this code with 409, to declare it is HttpConflict https://review.opendev.org/#/c/663851/41/nova/api/openstack/compute/shelve.py@122","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":1872,"context_line":"class UnshelveInstanceInvalidState(InstanceInvalidState):"},{"line_number":1873,"context_line":"    msg_fmt \u003d _(\"Specifying the availability zone to the %(state)s \""},{"line_number":1874,"context_line":"                \"status instance %(instance_uuid)s is not supported.\")"},{"line_number":1875,"context_line":"    code \u003d 409"},{"line_number":1876,"context_line":""},{"line_number":1877,"context_line":""},{"line_number":1878,"context_line":"class ImageVCPULimitsRangeExceeded(Invalid):"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_c10f5a2d","line":1875,"updated":"2019-08-26 08:17:05.000000000","message":"ditto","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"    msg_fmt \u003d _(\"Error during unshelve instance %(instance_id)s: %(reason)s\")"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1fd37403","line":1866,"range":{"start_line":1866,"start_character":6,"end_line":1866,"end_character":24},"updated":"2019-08-27 14:53:25.000000000","message":"Since this is specific to volumes, maybe call it UnmatchVolumeAZException.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"    msg_fmt \u003d _(\"Error during unshelve instance %(instance_id)s: %(reason)s\")"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3cb8bb73","line":1866,"range":{"start_line":1866,"start_character":6,"end_line":1866,"end_character":24},"in_reply_to":"7faddb67_1fd37403","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"},{"line_number":1870,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_fff0d893","line":1867,"range":{"start_line":1867,"start_character":58,"end_line":1867,"end_character":66},"updated":"2019-08-27 14:53:25.000000000","message":"its attached volumes","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"},{"line_number":1870,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5ff24c9d","line":1867,"range":{"start_line":1867,"start_character":47,"end_line":1867,"end_character":53},"updated":"2019-08-27 14:53:25.000000000","message":"the server","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"},{"line_number":1870,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_9ca8cf20","line":1867,"range":{"start_line":1867,"start_character":47,"end_line":1867,"end_character":53},"in_reply_to":"7faddb67_5ff24c9d","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":""},{"line_number":1866,"context_line":"class UnmatchAZException(Invalid):"},{"line_number":1867,"context_line":"    msg_fmt \u003d _(\"The availability zone between server and attached volumes \""},{"line_number":1868,"context_line":"                \"do not match: %(reason)s.\")"},{"line_number":1869,"context_line":"    code \u003d 409"},{"line_number":1870,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_7c63931a","line":1867,"range":{"start_line":1867,"start_character":58,"end_line":1867,"end_character":66},"in_reply_to":"7faddb67_fff0d893","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"class UnshelveInstanceInvalidState(InstanceInvalidState):"},{"line_number":1873,"context_line":"    msg_fmt \u003d _(\"Specifying the availability zone to the %(state)s \""},{"line_number":1874,"context_line":"                \"status instance %(instance_uuid)s is not supported.\")"},{"line_number":1875,"context_line":"    code \u003d 409"},{"line_number":1876,"context_line":""},{"line_number":1877,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_9f352448","line":1874,"range":{"start_line":1873,"start_character":17,"end_line":1874,"end_character":68},"updated":"2019-08-27 14:53:25.000000000","message":"This reads a bit weird, let\u0027s say:\n\nSpecifying an availability zone when unshelving server %(instance_uuid)s with status \"%(state)s\" is not supported. The server status must be SHELVED_OFFLOADED.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"class UnshelveInstanceInvalidState(InstanceInvalidState):"},{"line_number":1873,"context_line":"    msg_fmt \u003d _(\"Specifying the availability zone to the %(state)s \""},{"line_number":1874,"context_line":"                \"status instance %(instance_uuid)s is not supported.\")"},{"line_number":1875,"context_line":"    code \u003d 409"},{"line_number":1876,"context_line":""},{"line_number":1877,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5c49f78b","line":1874,"range":{"start_line":1873,"start_character":17,"end_line":1874,"end_character":68},"in_reply_to":"7faddb67_9f352448","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"nova/tests/functional/api_sample_tests/api_samples/os-shelve/v2.74/os-unshelve-null.json.tpl":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":16,"id":"7faddb67_11a87d1d","line":2,"range":{"start_line":2,"start_character":5,"end_line":2,"end_character":13},"updated":"2019-07-05 06:22:42.000000000","message":"you can use \"%(action)s\" here too","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":16,"id":"7faddb67_16761d08","line":2,"range":{"start_line":2,"start_character":5,"end_line":2,"end_character":13},"in_reply_to":"7faddb67_11a87d1d","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"}],"nova/tests/functional/api_sample_tests/api_samples/os-shelve/v2.74/os-unshelve.json.tpl":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {}"},{"line_number":3,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":9,"id":"9fb8cfa7_8200f403","line":2,"updated":"2019-06-27 16:06:15.000000000","message":"I was expecting to see one where we specify the AZ?","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {}"},{"line_number":3,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":9,"id":"9fb8cfa7_5d54f2fd","line":2,"in_reply_to":"9fb8cfa7_8200f403","updated":"2019-07-01 13:27:29.000000000","message":"Yeah, specifying the the AZ is better.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": \"%(availability_zone)s\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":16,"id":"7faddb67_b162c915","line":2,"range":{"start_line":2,"start_character":5,"end_line":2,"end_character":13},"updated":"2019-07-05 06:22:42.000000000","message":"ditto","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"unshelve\": {"},{"line_number":3,"context_line":"        \"availability_zone\": \"%(availability_zone)s\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":16,"id":"7faddb67_d661653b","line":2,"range":{"start_line":2,"start_character":5,"end_line":2,"end_character":13},"in_reply_to":"7faddb67_b162c915","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"}],"nova/tests/functional/api_sample_tests/api_samples/os-shelve/v2.77/os-shelve-offload.json.tpl":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"%(action)s\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":42,"id":"7faddb67_ff1e98b9","line":1,"updated":"2019-08-27 14:53:25.000000000","message":"This template isn\u0027t used since you don\u0027t have a functional test for shelve offload, just remove this file.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"%(action)s\": null"},{"line_number":3,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":42,"id":"7faddb67_1c437f6e","line":1,"in_reply_to":"7faddb67_ff1e98b9","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"nova/tests/functional/api_sample_tests/test_shelve.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def setUp(self):"},{"line_number":59,"context_line":"        super(UnshelveJson277Test, self).setUp()"},{"line_number":60,"context_line":"        # Don\u0027t offload instance, so we can test the offload call."},{"line_number":61,"context_line":"        CONF.set_override(\u0027shelved_offload_time\u0027, -1)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _test_server_action(self, uuid, template, action, subs\u003dNone):"},{"line_number":64,"context_line":"        subs \u003d subs or {}"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_02faa641","line":61,"range":{"start_line":60,"start_character":8,"end_line":61,"end_character":53},"updated":"2019-08-20 23:03:11.000000000","message":"I don\u0027t think we need this, we only care about the unshelve call.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def setUp(self):"},{"line_number":59,"context_line":"        super(UnshelveJson277Test, self).setUp()"},{"line_number":60,"context_line":"        # Don\u0027t offload instance, so we can test the offload call."},{"line_number":61,"context_line":"        CONF.set_override(\u0027shelved_offload_time\u0027, -1)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def _test_server_action(self, uuid, template, action, subs\u003dNone):"},{"line_number":64,"context_line":"        subs \u003d subs or {}"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_f19e36b6","line":61,"range":{"start_line":60,"start_character":8,"end_line":61,"end_character":53},"in_reply_to":"7faddb67_02faa641","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def test_specified_az_unshelve(self):"},{"line_number":72,"context_line":"        uuid \u003d self._post_server()"},{"line_number":73,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":74,"context_line":"        self._test_server_action(uuid, \u0027os-shelve-offload\u0027, \u0027shelveOffload\u0027)"},{"line_number":75,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"},{"line_number":76,"context_line":"                                 subs\u003d{\"availability_zone\": \"us-west\"})"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_e298aa1b","line":74,"updated":"2019-08-20 23:03:11.000000000","message":"We shouldn\u0027t need this if you remove the flag setting above. I realize you copied this from the other test but the other test cares about shelve and shelveOffload actions, we only care about unshelve.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    def test_specified_az_unshelve(self):"},{"line_number":72,"context_line":"        uuid \u003d self._post_server()"},{"line_number":73,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":74,"context_line":"        self._test_server_action(uuid, \u0027os-shelve-offload\u0027, \u0027shelveOffload\u0027)"},{"line_number":75,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"},{"line_number":76,"context_line":"                                 subs\u003d{\"availability_zone\": \"us-west\"})"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_1160b2ce","line":74,"in_reply_to":"7faddb67_e298aa1b","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"},{"line_number":76,"context_line":"                                 subs\u003d{\"availability_zone\": \"us-west\"})"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_unshelve_specified_null(self):"},{"line_number":79,"context_line":"        uuid \u003d self._post_server()"},{"line_number":80,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":81,"context_line":"        self._test_server_action(uuid, \u0027os-shelve-offload\u0027, \u0027shelveOffload\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_42897ec7","line":78,"range":{"start_line":78,"start_character":22,"end_line":78,"end_character":36},"updated":"2019-08-20 23:03:11.000000000","message":"no_az","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"},{"line_number":76,"context_line":"                                 subs\u003d{\"availability_zone\": \"us-west\"})"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_unshelve_specified_null(self):"},{"line_number":79,"context_line":"        uuid \u003d self._post_server()"},{"line_number":80,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":81,"context_line":"        self._test_server_action(uuid, \u0027os-shelve-offload\u0027, \u0027shelveOffload\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_315b6e22","line":78,"range":{"start_line":78,"start_character":22,"end_line":78,"end_character":36},"in_reply_to":"7faddb67_42897ec7","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def test_unshelve_specified_null(self):"},{"line_number":79,"context_line":"        uuid \u003d self._post_server()"},{"line_number":80,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":81,"context_line":"        self._test_server_action(uuid, \u0027os-shelve-offload\u0027, \u0027shelveOffload\u0027)"},{"line_number":82,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve-null\u0027, \u0027unshelve\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_829bf614","line":81,"updated":"2019-08-20 23:03:11.000000000","message":"same","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def test_unshelve_specified_null(self):"},{"line_number":79,"context_line":"        uuid \u003d self._post_server()"},{"line_number":80,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":81,"context_line":"        self._test_server_action(uuid, \u0027os-shelve-offload\u0027, \u0027shelveOffload\u0027)"},{"line_number":82,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve-null\u0027, \u0027unshelve\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_d19bfac5","line":81,"in_reply_to":"7faddb67_829bf614","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    scenarios \u003d [(\u0027v2_77\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":56,"context_line":"    USE_NEUTRON \u003d True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def setUp(self):"},{"line_number":59,"context_line":"        super(UnshelveJson277Test, self).setUp()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _test_server_action(self, uuid, template, action, subs\u003dNone):"},{"line_number":62,"context_line":"        subs \u003d subs or {}"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_7e040719","line":59,"range":{"start_line":58,"start_character":4,"end_line":59,"end_character":48},"updated":"2019-08-26 08:17:05.000000000","message":"you needn\u0027t write setUp method if you nothing add to it.","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"886c458f90f8803c09bb67864a46dbe9f84bda48","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    scenarios \u003d [(\u0027v2_77\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":56,"context_line":"    USE_NEUTRON \u003d True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def setUp(self):"},{"line_number":59,"context_line":"        super(UnshelveJson277Test, self).setUp()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _test_server_action(self, uuid, template, action, subs\u003dNone):"},{"line_number":62,"context_line":"        subs \u003d subs or {}"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_ace33506","line":59,"range":{"start_line":58,"start_character":4,"end_line":59,"end_character":48},"in_reply_to":"7faddb67_7e040719","updated":"2019-08-26 09:59:37.000000000","message":"Done","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":67,"context_line":"        self.assertEqual(\"\", response.text)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_specified_az_unshelve(self):"},{"line_number":70,"context_line":"        uuid \u003d self._post_server()"},{"line_number":71,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":72,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_41fcca0b","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":34},"updated":"2019-08-26 08:17:05.000000000","message":"test_unshelve_with_az","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"886c458f90f8803c09bb67864a46dbe9f84bda48","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":67,"context_line":"        self.assertEqual(\"\", response.text)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_specified_az_unshelve(self):"},{"line_number":70,"context_line":"        uuid \u003d self._post_server()"},{"line_number":71,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":72,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_cce0f1fb","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":34},"in_reply_to":"7faddb67_41fcca0b","updated":"2019-08-26 09:59:37.000000000","message":"Done","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    def test_specified_az_unshelve(self):"},{"line_number":70,"context_line":"        uuid \u003d self._post_server()"},{"line_number":71,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":72,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"},{"line_number":73,"context_line":"                                 subs\u003d{\"availability_zone\": \"us-west\"})"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def test_unshelve_no_az(self):"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_fe10f75b","line":72,"range":{"start_line":72,"start_character":40,"end_line":72,"end_character":51},"updated":"2019-08-26 08:17:05.000000000","message":"nit, maybe name as os-unshelve-with-az","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def test_unshelve_no_az(self):"},{"line_number":76,"context_line":"        uuid \u003d self._post_server()"},{"line_number":77,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":78,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve-null\u0027, \u0027unshelve\u0027)"}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_1e163357","line":78,"range":{"start_line":78,"start_character":40,"end_line":78,"end_character":56},"updated":"2019-08-26 08:17:05.000000000","message":"just name as os-unshelve","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        uuid \u003d self._post_server()"},{"line_number":68,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":69,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"},{"line_number":70,"context_line":"                                 subs\u003d{\"availability_zone\": \"us-west\"})"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_unshelve_no_az(self):"},{"line_number":73,"context_line":"        uuid \u003d self._post_server()"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3fd8b0ee","line":70,"range":{"start_line":70,"start_character":61,"end_line":70,"end_character":68},"updated":"2019-08-27 14:53:25.000000000","message":"This doesn\u0027t match the AZ in your sample, did you generate the doc samples using \"tox -e api-samples\"? I think us-west is the only one you can use because of the fixture:\n\nhttps://github.com/openstack/nova/blob/912a46c9d4d3a8cc63724adff70acf8a4fc34d9b/nova/tests/functional/api_sample_tests/api_sample_base.py#L68","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        uuid \u003d self._post_server()"},{"line_number":68,"context_line":"        self._test_server_action(uuid, \u0027os-shelve\u0027, \u0027shelve\u0027)"},{"line_number":69,"context_line":"        self._test_server_action(uuid, \u0027os-unshelve\u0027, \u0027unshelve\u0027,"},{"line_number":70,"context_line":"                                 subs\u003d{\"availability_zone\": \"us-west\"})"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_unshelve_no_az(self):"},{"line_number":73,"context_line":"        uuid \u003d self._post_server()"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5c2ed7ab","line":70,"range":{"start_line":70,"start_character":61,"end_line":70,"end_character":68},"in_reply_to":"7faddb67_3fd8b0ee","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"nova/tests/functional/notification_sample_tests/test_instance.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":841,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":842,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[1])"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], {\u0027unshelve\u0027: {}})"},{"line_number":845,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"    def _test_unshelve_server(self, server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_05a64e10","line":844,"updated":"2019-06-27 16:06:15.000000000","message":"Why did this change? It should still be a valid request.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":841,"context_line":"                \u0027uuid\u0027: server[\u0027id\u0027]},"},{"line_number":842,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[1])"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], {\u0027unshelve\u0027: {}})"},{"line_number":845,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"    def _test_unshelve_server(self, server):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_fa260ccb","line":844,"in_reply_to":"9fb8cfa7_05a64e10","updated":"2019-07-01 13:27:29.000000000","message":"Done","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":857,"context_line":"                                        {\u0027status\u0027: \u0027SHELVED_OFFLOADED\u0027,"},{"line_number":858,"context_line":"                                         \u0027OS-EXT-SRV-ATTR:host\u0027: None})"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"        post \u003d {\u0027unshelve\u0027: {}}"},{"line_number":861,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":862,"context_line":"        self._wait_for_state_change(self.admin_api, server, \u0027ACTIVE\u0027)"},{"line_number":863,"context_line":"        self.assertEqual(9, len(fake_notifier.VERSIONED_NOTIFICATIONS))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_c50fd62b","line":860,"updated":"2019-06-27 16:06:15.000000000","message":"Hang on... shouldn\u0027t None still work just fine here? Else we messed up the code somehow.","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":857,"context_line":"                                        {\u0027status\u0027: \u0027SHELVED_OFFLOADED\u0027,"},{"line_number":858,"context_line":"                                         \u0027OS-EXT-SRV-ATTR:host\u0027: None})"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"        post \u003d {\u0027unshelve\u0027: {}}"},{"line_number":861,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], post)"},{"line_number":862,"context_line":"        self._wait_for_state_change(self.admin_api, server, \u0027ACTIVE\u0027)"},{"line_number":863,"context_line":"        self.assertEqual(9, len(fake_notifier.VERSIONED_NOTIFICATIONS))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_3a2104b5","line":860,"in_reply_to":"9fb8cfa7_c50fd62b","updated":"2019-07-01 13:27:29.000000000","message":"Done","commit_id":"848edbe57609d1a4bdae4faacd246b292ad4a276"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"91cce7cabc4fac6456749d9f37fcd7d2015863eb","unresolved":false,"context_lines":[{"line_number":3614,"context_line":"             \u0027DISK_GB\u0027: 0}, rp_uuid)"},{"line_number":3615,"context_line":""},{"line_number":3616,"context_line":"        # unshelve the server, which should fail"},{"line_number":3617,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], {\u0027unshelve\u0027: None})"},{"line_number":3618,"context_line":"        self._wait_for_action_fail_completion("},{"line_number":3619,"context_line":"            server, instance_actions.UNSHELVE, \u0027compute_unshelve_instance\u0027)"},{"line_number":3620,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_c5d91683","side":"PARENT","line":3617,"updated":"2019-06-27 16:06:15.000000000","message":"Similar issues here, should this not just work?","commit_id":"d7bad342981eb843cf349fce4f6b8f0309e2af3a"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"01921fb93ba23a0c7fad8dda27e2ba69574b59f2","unresolved":false,"context_lines":[{"line_number":3614,"context_line":"             \u0027DISK_GB\u0027: 0}, rp_uuid)"},{"line_number":3615,"context_line":""},{"line_number":3616,"context_line":"        # unshelve the server, which should fail"},{"line_number":3617,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], {\u0027unshelve\u0027: None})"},{"line_number":3618,"context_line":"        self._wait_for_action_fail_completion("},{"line_number":3619,"context_line":"            server, instance_actions.UNSHELVE, \u0027compute_unshelve_instance\u0027)"},{"line_number":3620,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_9a1b507f","side":"PARENT","line":3617,"in_reply_to":"9fb8cfa7_c5d91683","updated":"2019-07-01 13:27:29.000000000","message":"Done","commit_id":"d7bad342981eb843cf349fce4f6b8f0309e2af3a"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":2545,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":2546,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":2547,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":2548,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":2549,"context_line":""},{"line_number":2550,"context_line":"        source_hostname \u003d self.compute1.host"},{"line_number":2551,"context_line":"        source_rp_uuid \u003d self._get_provider_uuid_by_host(source_hostname)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_396725c0","line":2548,"range":{"start_line":2548,"start_character":0,"end_line":2548,"end_character":38},"updated":"2019-07-13 13:40:32.000000000","message":"this is due to microversion is set to \u0027latest\u0027 in base[1].\n\nI will suggest changing the req body to null so that these tests can keep testing the \u0027latest\u0027 microversion.\n\nIf needed, you can add explicit tests for 2.75 microversion for AZ verification.\n\n@L2557\n req \u003d {\n            \u0027unshelve\u0027: null\n        }\n\n[1] https://opendev.org/openstack/nova/src/branch/master/nova/tests/functional/integrated_helpers.py#L378","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":2545,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":2546,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":2547,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":2548,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":2549,"context_line":""},{"line_number":2550,"context_line":"        source_hostname \u003d self.compute1.host"},{"line_number":2551,"context_line":"        source_rp_uuid \u003d self._get_provider_uuid_by_host(source_hostname)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_ae1c26c1","line":2548,"range":{"start_line":2548,"start_character":0,"end_line":2548,"end_character":38},"in_reply_to":"7faddb67_396725c0","updated":"2019-07-14 07:38:37.000000000","message":"Yeah, this is test the \u0027latest\u0027 microversion, s/{}/None","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":2590,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":2591,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":2592,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":2593,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":2594,"context_line":""},{"line_number":2595,"context_line":"        source_hostname \u003d self.compute1.host"},{"line_number":2596,"context_line":"        source_rp_uuid \u003d self._get_provider_uuid_by_host(source_hostname)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_f95c2dee","line":2593,"range":{"start_line":2593,"start_character":0,"end_line":2593,"end_character":38},"updated":"2019-07-13 13:40:32.000000000","message":"ditto","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":2590,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":2591,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":2592,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":2593,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":2594,"context_line":""},{"line_number":2595,"context_line":"        source_hostname \u003d self.compute1.host"},{"line_number":2596,"context_line":"        source_rp_uuid \u003d self._get_provider_uuid_by_host(source_hostname)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_4e7b32f4","line":2593,"range":{"start_line":2593,"start_character":0,"end_line":2593,"end_character":38},"in_reply_to":"7faddb67_f95c2dee","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":2630,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":2631,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":2632,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":2633,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":2634,"context_line":""},{"line_number":2635,"context_line":"        source_hostname \u003d self.compute1.host"},{"line_number":2636,"context_line":"        source_rp_uuid \u003d self._get_provider_uuid_by_host(source_hostname)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_b972357a","line":2633,"range":{"start_line":2633,"start_character":0,"end_line":2633,"end_character":38},"updated":"2019-07-13 13:40:32.000000000","message":"ditto","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":2630,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":2631,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":2632,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":2633,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":2634,"context_line":""},{"line_number":2635,"context_line":"        source_hostname \u003d self.compute1.host"},{"line_number":2636,"context_line":"        source_rp_uuid \u003d self._get_provider_uuid_by_host(source_hostname)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_6e806ec1","line":2633,"range":{"start_line":2633,"start_character":0,"end_line":2633,"end_character":38},"in_reply_to":"7faddb67_b972357a","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":3128,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":3129,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":3130,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":3131,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":3132,"context_line":""},{"line_number":3133,"context_line":"        dest_hostname \u003d self.compute2.host"},{"line_number":3134,"context_line":"        created_server \u003d self._server_created_with_host()"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_596b0184","line":3131,"range":{"start_line":3131,"start_character":0,"end_line":3131,"end_character":38},"updated":"2019-07-13 13:40:32.000000000","message":"ditto","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":3128,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":3129,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":3130,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":3131,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":3132,"context_line":""},{"line_number":3133,"context_line":"        dest_hostname \u003d self.compute2.host"},{"line_number":3134,"context_line":"        created_server \u003d self._server_created_with_host()"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_0e81bac3","line":3131,"range":{"start_line":3131,"start_character":0,"end_line":3131,"end_character":38},"in_reply_to":"7faddb67_596b0184","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":5878,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":5879,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":5880,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":5881,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":5882,"context_line":""},{"line_number":5883,"context_line":"        server \u003d self._create_server("},{"line_number":5884,"context_line":"            flavor\u003dself.flavor,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_79683d86","line":5881,"range":{"start_line":5881,"start_character":0,"end_line":5881,"end_character":38},"updated":"2019-07-13 13:40:32.000000000","message":"ditto","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":5878,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":5879,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":5880,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":5881,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":5882,"context_line":""},{"line_number":5883,"context_line":"        server \u003d self._create_server("},{"line_number":5884,"context_line":"            flavor\u003dself.flavor,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_2e86f6dc","line":5881,"range":{"start_line":5881,"start_character":0,"end_line":5881,"end_character":38},"in_reply_to":"7faddb67_79683d86","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":5917,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":5918,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":5919,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":5920,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":5921,"context_line":""},{"line_number":5922,"context_line":"        server \u003d self._create_server("},{"line_number":5923,"context_line":"            flavor\u003dself.flavor,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_390c05ec","line":5920,"range":{"start_line":5920,"start_character":0,"end_line":5920,"end_character":38},"updated":"2019-07-13 13:40:32.000000000","message":"ditto","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":5917,"context_line":"        # NOTE(brinzhang): For microversion 2.75 add the \u0027availability_zone\u0027"},{"line_number":5918,"context_line":"        # field to the request body with unshevle a server API, but anything"},{"line_number":5919,"context_line":"        # working in old version (\u003c\u003d2.74) keep working as it is."},{"line_number":5920,"context_line":"        self.api.microversion \u003d \u00272.74\u0027"},{"line_number":5921,"context_line":""},{"line_number":5922,"context_line":"        server \u003d self._create_server("},{"line_number":5923,"context_line":"            flavor\u003dself.flavor,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_ce6e422e","line":5920,"range":{"start_line":5920,"start_character":0,"end_line":5920,"end_character":38},"in_reply_to":"7faddb67_390c05ec","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8638b0529cbd73a8faf4ddd09f35a245d8c5248d","unresolved":false,"context_lines":[{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":2584,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7faddb67_7204b314","line":2581,"range":{"start_line":2581,"start_character":8,"end_line":2581,"end_character":9},"updated":"2019-08-19 09:16:00.000000000","message":"yeah these changes are needed but it does not mean there is something change in for older microvesion. These tests are run with \u0027latest\u0027 microversion so needs to accommodate all the latest changes. \n\nNature of old and changed microversion behaviour is verified in unit tests.","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"477359c88a49f4f9568dab9be24ca8db52b517ae","unresolved":false,"context_lines":[{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":2584,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7faddb67_a59ae3c1","line":2581,"range":{"start_line":2581,"start_character":8,"end_line":2581,"end_character":9},"in_reply_to":"7faddb67_7204b314","updated":"2019-08-19 11:16:53.000000000","message":"Yeah, the \u0027latest\u0027 microversion changes should be compatible with the older microversion, because 2.77 changed the request body, so changes need to be made here (a special case).","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_028f06cd","line":2580,"updated":"2019-08-20 23:03:11.000000000","message":"This is likely a result of breaking backward compatibility, correct? Is this really necessary?","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c2cb507a1db328beb951a6922f8fea730d5a3100","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_779316a4","line":2580,"in_reply_to":"7faddb67_028f06cd","updated":"2019-08-21 08:33:12.000000000","message":"Actually this test use \u0027latest\u0027 microversion so request changes in 2.77 microversion should be adjusted here.\n\nThis is needed if we restrict the unused empty dict in request otherwise it will be allowed. So it is more discussion of what type of request we allow for 2.77.\n\n- https://review.opendev.org/#/c/663851/33/nova/tests/functional/test_servers.py@2581","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_716fa691","line":2580,"in_reply_to":"7faddb67_028f06cd","updated":"2019-08-21 08:16:31.000000000","message":"Beacuse of \u0027required\u0027: [\u0027availability_zone\u0027] in schema valid, the request of the {} cannot allowed, but now as you said, use the case of:\n{\n   \u0027lock\u0027: null\n}\n\nor\n\n{\n    \u0027lock\u0027: {\n        \u0027locked_reason\u0027: \u0027something\u0027\n    }\n}\n\nI think these change no needed now.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9d50ddecd99d7c5590a3f16c434fc509452cbd11","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_2d69aef7","line":2580,"in_reply_to":"7faddb67_060e1d31","updated":"2019-08-22 15:40:45.000000000","message":"I don\u0027t know that we really need a full test class/case for this, you can just modify the microversion of this one test\u0027s request:\n\n# Make sure pre-2.77 schema validation is not enforced on\n# on the empty dict.\nwith nova.utils.temporary_mutation(self.api, microversion\u003d\u00272.76\u0027):\n    self.api.post_server_action(server[\u0027id\u0027], req)","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"427991ca1180aebfb342515f8cf556f45a62dd89","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_da3f801f","line":2580,"in_reply_to":"7faddb67_1f650de1","updated":"2019-08-22 01:59:31.000000000","message":"@brin can you add the additional tests to test the old microversion and check existing request \u0027unshelve\u0027: {} for \u003c2.77\n\nYou can set the microversion via self.api.microversion \u003d \u00272.76\u0027 and setUp of base class will reset it back to \u0027latest\u0027\n- https://opendev.org/openstack/nova/src/commit/772c911f55b4f9f3c1ef14a38cf2bf309ed2a8f2/nova/tests/functional/integrated_helpers.py","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_faa583a0","line":2580,"in_reply_to":"7faddb67_2d69aef7","updated":"2019-08-23 00:33:03.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_1f650de1","line":2580,"in_reply_to":"7faddb67_779316a4","updated":"2019-08-21 19:51:19.000000000","message":"OK I didn\u0027t realize these changed tests were using the \u0027latest\u0027 microversion.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"90e2979b693a2d5b073faa04725b898b0660afc0","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: None"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], req)"},{"line_number":2583,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_060e1d31","line":2580,"in_reply_to":"7faddb67_da3f801f","updated":"2019-08-22 07:06:01.000000000","message":"Okey, I will add the functional test for this.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66eee72a4a9bb807243a22385ac15a220d5b0434","unresolved":false,"context_lines":[{"line_number":4553,"context_line":"        self.assertNotEqual(other_host, found_server[\u0027OS-EXT-SRV-ATTR:host\u0027])"},{"line_number":4554,"context_line":""},{"line_number":4555,"context_line":""},{"line_number":4556,"context_line":"class ServerTestV277UnshelveServerTestCase(ServersTestBase):"},{"line_number":4557,"context_line":"    microversion \u003d \u0027latest\u0027"},{"line_number":4558,"context_line":""},{"line_number":4559,"context_line":"    def _create_server(self, target_host\u003dNone):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_70fbfd14","line":4556,"updated":"2019-08-22 15:45:57.000000000","message":"Do we really need a full new set of functional tests for this? Don\u0027t the base unit tests already use an empty dict that covers the pre-2.76 validation we care about for backward compat, meaning these:\n\nhttps://review.opendev.org/#/c/663851/38/nova/tests/unit/api/openstack/compute/test_shelve.py\n\nIf we really cared about a functional test for the pre-2.77 ability to specify an empty dict for the value, you can just modify a few lines in the existing functional test like I said here:\n\nhttps://review.opendev.org/#/c/663851/34/nova/tests/functional/test_servers.py@2580\n\nBut I don\u0027t know what that is going to buy us for test coverage when the unit tests are already doing this for us, correct? This just seems like unnecessary duplication to me. Plus it\u0027s a confusing test since it says 2.77 but uses the latest microversion by default and then hits 2.76 in some tests.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":4553,"context_line":"        self.assertNotEqual(other_host, found_server[\u0027OS-EXT-SRV-ATTR:host\u0027])"},{"line_number":4554,"context_line":""},{"line_number":4555,"context_line":""},{"line_number":4556,"context_line":"class ServerTestV277UnshelveServerTestCase(ServersTestBase):"},{"line_number":4557,"context_line":"    microversion \u003d \u0027latest\u0027"},{"line_number":4558,"context_line":""},{"line_number":4559,"context_line":"    def _create_server(self, target_host\u003dNone):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_1ac89f54","line":4556,"in_reply_to":"7faddb67_70fbfd14","updated":"2019-08-23 00:33:03.000000000","message":"Okey, removed.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"66eee72a4a9bb807243a22385ac15a220d5b0434","unresolved":false,"context_lines":[{"line_number":4592,"context_line":"            \u0027shelve\u0027: {}"},{"line_number":4593,"context_line":"        }"},{"line_number":4594,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], shelve_req)"},{"line_number":4595,"context_line":"        unshelve_req \u003d {"},{"line_number":4596,"context_line":"            \u0027unshelve\u0027: {}"},{"line_number":4597,"context_line":"        }"},{"line_number":4598,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], unshelve_req)"},{"line_number":4599,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":4600,"context_line":""},{"line_number":4601,"context_line":"    def test_unshelve_offloaded_server_with_none_request(self):"},{"line_number":4602,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_d015113f","line":4599,"range":{"start_line":4595,"start_character":8,"end_line":4599,"end_character":53},"updated":"2019-08-22 15:45:57.000000000","message":"If we were using the latest microversion, wouldn\u0027t you expect this to fail? Or does test_unshelve_offloaded_server_request_old_version setting self.api.microversion \u003d \u00272.76\u0027 leak into this test somehow?\n\nI guess it\u0027s because you didn\u0027t change the schema to enforce that empty dict isn\u0027t allowed with 2.77:\n\nhttps://review.opendev.org/#/c/663851/38/nova/api/openstack/compute/schemas/shelve.py\n\nBut I thought gmann wanted you to do that?","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":4592,"context_line":"            \u0027shelve\u0027: {}"},{"line_number":4593,"context_line":"        }"},{"line_number":4594,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], shelve_req)"},{"line_number":4595,"context_line":"        unshelve_req \u003d {"},{"line_number":4596,"context_line":"            \u0027unshelve\u0027: {}"},{"line_number":4597,"context_line":"        }"},{"line_number":4598,"context_line":"        self.api.post_server_action(server[\u0027id\u0027], unshelve_req)"},{"line_number":4599,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":4600,"context_line":""},{"line_number":4601,"context_line":"    def test_unshelve_offloaded_server_with_none_request(self):"},{"line_number":4602,"context_line":"        server \u003d self._create_server()"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_3ac55b3e","line":4599,"range":{"start_line":4595,"start_character":8,"end_line":4599,"end_character":53},"in_reply_to":"7faddb67_d015113f","updated":"2019-08-23 00:33:03.000000000","message":"it\u0027s my mean, the schema didn\u0027t change, so redundant.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f7dff9293a8d7ab9a9ca011786cf08ea15d6962d","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: {}"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        # Make sure pre-2.77 schema validation is not enforced on"},{"line_number":2583,"context_line":"        # on the empty dict."}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_fe3797fd","line":2580,"range":{"start_line":2580,"start_character":24,"end_line":2580,"end_character":26},"updated":"2019-08-26 08:17:05.000000000","message":"why we didn\u0027t change this body to null just like other test?","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"886c458f90f8803c09bb67864a46dbe9f84bda48","unresolved":false,"context_lines":[{"line_number":2577,"context_line":"            source_hostname, source_rp_uuid)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"        req \u003d {"},{"line_number":2580,"context_line":"            \u0027unshelve\u0027: {}"},{"line_number":2581,"context_line":"        }"},{"line_number":2582,"context_line":"        # Make sure pre-2.77 schema validation is not enforced on"},{"line_number":2583,"context_line":"        # on the empty dict."}],"source_content_type":"text/x-python","patch_set":41,"id":"7faddb67_ac1ed50a","line":2580,"range":{"start_line":2580,"start_character":24,"end_line":2580,"end_character":26},"in_reply_to":"7faddb67_fe3797fd","updated":"2019-08-26 09:59:37.000000000","message":"Yeah, this should be tests by latest version with schema limit.","commit_id":"52a20d45ae008ac2cf392c614c62a5eda34c591c"}],"nova/tests/unit/api/openstack/compute/test_shelve.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            body\u003d{\u0027unshelve\u0027: {}})"},{"line_number":178,"context_line":"        self.assertEqual("},{"line_number":179,"context_line":"            \"Policy doesn\u0027t allow %s to be performed.\" % rule_name,"},{"line_number":180,"context_line":"            exc.format_message())"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_112b9d94","line":180,"range":{"start_line":180,"start_character":0,"end_line":180,"end_character":33},"updated":"2019-07-05 06:22:42.000000000","message":"here we need more tests of this microverison like:\n\n1. verify the AZ passing with new microvesion allowed\n2. verify the AZ passing with old microvesion not allowed\n3. AZ name verification\n4. request object with old and new microversion.\n\nyou can refer to this as an example - https://review.opendev.org/#/c/666889/6/nova/tests/unit/api/openstack/compute/test_hypervisors.py","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            body\u003d{\u0027unshelve\u0027: {}})"},{"line_number":178,"context_line":"        self.assertEqual("},{"line_number":179,"context_line":"            \"Policy doesn\u0027t allow %s to be performed.\" % rule_name,"},{"line_number":180,"context_line":"            exc.format_message())"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_613c6693","line":180,"range":{"start_line":180,"start_character":0,"end_line":180,"end_character":33},"in_reply_to":"7faddb67_112b9d94","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0b7aa1a44fae089319b202b29cc4ea1dbc828982","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Add availability_zone parameter to unshelve a shelved-offloaded server of"},{"line_number":190,"context_line":"    2.74 microversion."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":"    wsgi_api_version \u003d \u00272.74\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_a6e00dce","line":191,"range":{"start_line":191,"start_character":4,"end_line":191,"end_character":7},"updated":"2019-07-10 03:45:32.000000000","message":"thanks. nice tests.\n\nAs one of the case you found for empty dict. can you add tests for pre-2.74 allow empty dict and 2.74 doest not.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"8573890e3b4a53db4675f627034ba51114987bbe","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    Add availability_zone parameter to unshelve a shelved-offloaded server of"},{"line_number":190,"context_line":"    2.74 microversion."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":"    wsgi_api_version \u003d \u00272.74\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_dcbabc08","line":191,"range":{"start_line":191,"start_character":4,"end_line":191,"end_character":7},"in_reply_to":"7faddb67_a6e00dce","updated":"2019-07-10 07:03:37.000000000","message":"Yeah, add that test cases.","commit_id":"1ac4439f1075a3b638216e9fcc4351dd9cc258f3"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"31ceb667f5c79e602e5aaa6c1e3c7f29a44ba150","unresolved":false,"context_lines":[{"line_number":289,"context_line":"            exception.ValidationError,"},{"line_number":290,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":291,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":292,"context_line":"        self.assertIn(\"An invalid \u0027name\u0027 value was provided\","},{"line_number":293,"context_line":"                      six.text_type(exc))"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"7faddb67_e54d709a","line":292,"range":{"start_line":292,"start_character":23,"end_line":292,"end_character":59},"updated":"2019-07-12 06:19:21.000000000","message":"s/Invalid input for field/attribute availability_zone","commit_id":"0a4671bbec9fdd1fbfc23b54f7663c3c4e718ad9"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"31ceb667f5c79e602e5aaa6c1e3c7f29a44ba150","unresolved":false,"context_lines":[{"line_number":306,"context_line":"            exception.ValidationError,"},{"line_number":307,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":308,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":309,"context_line":"        self.assertIn(\"An invalid \u0027name\u0027 value was provided\","},{"line_number":310,"context_line":"                      six.text_type(exc))"}],"source_content_type":"text/x-python","patch_set":24,"id":"7faddb67_c5487488","line":309,"range":{"start_line":309,"start_character":23,"end_line":309,"end_character":59},"updated":"2019-07-12 06:19:21.000000000","message":"s/Invalid input for field/attribute availability_zone","commit_id":"0a4671bbec9fdd1fbfc23b54f7663c3c4e718ad9"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":245,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":246,"context_line":"    def test_unshelve_with_no_az_failed("},{"line_number":247,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":248,"context_line":"        \"\"\"Make sure we can unshelve server without az before mocroversion 2.75"},{"line_number":249,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_b920f549","line":246,"range":{"start_line":246,"start_character":8,"end_line":246,"end_character":39},"updated":"2019-07-13 13:40:32.000000000","message":"test_unshelve_with_empty_dict_failed","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":245,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":246,"context_line":"    def test_unshelve_with_no_az_failed("},{"line_number":247,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":248,"context_line":"        \"\"\"Make sure we can unshelve server without az before mocroversion 2.75"},{"line_number":249,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_ee6bfe1a","line":246,"range":{"start_line":246,"start_character":8,"end_line":246,"end_character":39},"in_reply_to":"7faddb67_b920f549","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":246,"context_line":"    def test_unshelve_with_no_az_failed("},{"line_number":247,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":248,"context_line":"        \"\"\"Make sure we can unshelve server without az before mocroversion 2.75"},{"line_number":249,"context_line":"        \"\"\""},{"line_number":250,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":251,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_5919c11f","line":248,"range":{"start_line":248,"start_character":11,"end_line":248,"end_character":79},"updated":"2019-07-13 13:40:32.000000000","message":"please update this as per tests. empty dict fail from 2.75","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":246,"context_line":"    def test_unshelve_with_no_az_failed("},{"line_number":247,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":248,"context_line":"        \"\"\"Make sure we can unshelve server without az before mocroversion 2.75"},{"line_number":249,"context_line":"        \"\"\""},{"line_number":250,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":251,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_ce572258","line":248,"range":{"start_line":248,"start_character":11,"end_line":248,"end_character":79},"in_reply_to":"7faddb67_5919c11f","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"7217d9efa7737262f427251d8f107e78ea1830f3","unresolved":false,"context_lines":[{"line_number":307,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":308,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":309,"context_line":"        self.assertIn(\"Invalid input for field/attribute availability_zone\","},{"line_number":310,"context_line":"                      six.text_type(exc))"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_19d5891c","line":310,"range":{"start_line":310,"start_character":0,"end_line":310,"end_character":22},"updated":"2019-07-13 13:40:32.000000000","message":"add one more tests for unknown param.\n\n    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)\n    def test_unshelve_with_additional_param(self, mock_get_instance):\n        instance \u003d self.fake_get_instance()\n        mock_get_instance.return_value \u003d instance\n\n        body \u003d {\n            \u0027unshelve\u0027: {\n                \u0027availability_zone\u0027: \u0027us-east\u0027\n                \u0027additional_param\u0027: 1\n            }}\n        self.req.body \u003d jsonutils.dump_as_bytes(body)\n        exc \u003d self.assertRaises(\n            exception.ValidationError,\n            self.controller._unshelve, self.req,\n            fakes.FAKE_UUID, body\u003dbody)\n        self.assertIn(\"Invalid input for field/attribute availability_zone\",\n                      six.text_type(exc))","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b07a1dde550b40376e4b147cdb1f7db788e61456","unresolved":false,"context_lines":[{"line_number":307,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":308,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":309,"context_line":"        self.assertIn(\"Invalid input for field/attribute availability_zone\","},{"line_number":310,"context_line":"                      six.text_type(exc))"}],"source_content_type":"text/x-python","patch_set":26,"id":"7faddb67_ee545e55","line":310,"range":{"start_line":310,"start_character":0,"end_line":310,"end_character":22},"in_reply_to":"7faddb67_19d5891c","updated":"2019-07-14 07:38:37.000000000","message":"Done","commit_id":"25abde03b9f2dbfb24bfe7ae8c5b32160524df1d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":228,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":229,"context_line":"    def test_unshelve_with_empty_dict_pre_2_77_success("},{"line_number":230,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":231,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_20e35a07","line":229,"range":{"start_line":229,"start_character":22,"end_line":229,"end_character":37},"updated":"2019-08-16 09:04:38.000000000","message":"Name does not match with the test. The test passed in None as the request body not an empty dict.","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":228,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":229,"context_line":"    def test_unshelve_with_empty_dict_pre_2_77_success("},{"line_number":230,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":231,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_430a20d1","line":229,"range":{"start_line":229,"start_character":22,"end_line":229,"end_character":37},"in_reply_to":"7faddb67_20e35a07","updated":"2019-08-17 01:02:45.000000000","message":"Done","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def test_unshelve_with_empty_dict_pre_2_77_success("},{"line_number":230,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":231,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        before mocroversion 2.77."},{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        instance \u003d self.fake_get_instance()"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_80d24e33","line":232,"updated":"2019-08-16 09:04:38.000000000","message":"this empty line seems weird to me in the middle of a sentence.","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    def test_unshelve_with_empty_dict_pre_2_77_success("},{"line_number":230,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":231,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        before mocroversion 2.77."},{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        instance \u003d self.fake_get_instance()"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_23f5a4cb","line":232,"in_reply_to":"7faddb67_80d24e33","updated":"2019-08-17 01:02:45.000000000","message":"Done","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":231,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        before mocroversion 2.77."},{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":236,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_a0d74a23","line":233,"range":{"start_line":233,"start_character":15,"end_line":233,"end_character":27},"updated":"2019-08-16 09:04:38.000000000","message":"nit: microversion","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":231,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        before mocroversion 2.77."},{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":236,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_c3fdb0b2","line":233,"range":{"start_line":233,"start_character":15,"end_line":233,"end_character":27},"in_reply_to":"7faddb67_a0d74a23","updated":"2019-08-17 01:02:45.000000000","message":"Done","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":248,"context_line":"    def test_unshelve_with_empty_dict_failed("},{"line_number":249,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":250,"context_line":"        \"\"\"Unshelve server with empty dict before mocroversion 2.77"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        will be failed."},{"line_number":253,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_c0eb66da","line":250,"range":{"start_line":250,"start_character":50,"end_line":250,"end_character":62},"updated":"2019-08-16 09:04:38.000000000","message":"microversion","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":248,"context_line":"    def test_unshelve_with_empty_dict_failed("},{"line_number":249,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":250,"context_line":"        \"\"\"Unshelve server with empty dict before mocroversion 2.77"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        will be failed."},{"line_number":253,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_e3fa2cb8","line":250,"range":{"start_line":250,"start_character":50,"end_line":250,"end_character":62},"in_reply_to":"7faddb67_c0eb66da","updated":"2019-08-17 01:02:45.000000000","message":"Done","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":267,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":268,"context_line":"    def test_unshelve_with_az_success(self, mock_get_instance, mock_unshelve):"},{"line_number":269,"context_line":"        \"\"\"Make sure we can use availability_zone with mocroversion 2.77\"\"\""},{"line_number":270,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":271,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_e0e8e2df","line":269,"range":{"start_line":269,"start_character":55,"end_line":269,"end_character":67},"updated":"2019-08-16 09:04:38.000000000","message":"microversion","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":267,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":268,"context_line":"    def test_unshelve_with_az_success(self, mock_get_instance, mock_unshelve):"},{"line_number":269,"context_line":"        \"\"\"Make sure we can use availability_zone with mocroversion 2.77\"\"\""},{"line_number":270,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":271,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":272,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_832d7847","line":269,"range":{"start_line":269,"start_character":55,"end_line":269,"end_character":67},"in_reply_to":"7faddb67_e0e8e2df","updated":"2019-08-17 01:02:45.000000000","message":"Done","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            self.req.environ[\u0027nova.context\u0027], instance, new_az\u003d\u0027us-east\u0027)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":283,"context_line":"    def test_valid_az_name_with_int(self, mock_get_instance):"},{"line_number":284,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":285,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_60b632fc","line":283,"range":{"start_line":283,"start_character":13,"end_line":283,"end_character":18},"updated":"2019-08-16 09:04:38.000000000","message":"invalid?","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            self.req.environ[\u0027nova.context\u0027], instance, new_az\u003d\u0027us-east\u0027)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":283,"context_line":"    def test_valid_az_name_with_int(self, mock_get_instance):"},{"line_number":284,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":285,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7faddb67_63287c32","line":283,"range":{"start_line":283,"start_character":13,"end_line":283,"end_character":18},"in_reply_to":"7faddb67_60b632fc","updated":"2019-08-17 01:02:45.000000000","message":"Done","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": None})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_82b45683","line":56,"updated":"2019-08-20 23:03:11.000000000","message":"same - do we really need to specify None here for \u003c2.77? If so, we broke something.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"427991ca1180aebfb342515f8cf556f45a62dd89","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": None})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_da18e0cd","line":56,"in_reply_to":"7faddb67_7f3761b1","updated":"2019-08-22 01:59:31.000000000","message":"ah you are right. This test should work as it is. I misread this along with other functional tests. we should not change this test.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": None})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_711d660d","line":56,"in_reply_to":"7faddb67_82b45683","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c2cb507a1db328beb951a6922f8fea730d5a3100","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": None})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_97a1f2f9","line":56,"in_reply_to":"7faddb67_82b45683","updated":"2019-08-21 08:33:12.000000000","message":"we are not breaking anything here. This test is run with \u0027latest\u0027 microversion which includes the 2.77 changes which has different request than for previous microversion.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": None})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_7f3761b1","line":56,"in_reply_to":"7faddb67_97a1f2f9","updated":"2019-08-21 19:51:19.000000000","message":"\u003e we are not breaking anything here. This test is run with \u0027latest\u0027\n \u003e microversion which includes the 2.77 changes which has different\n \u003e request than for previous microversion.\n\nWhere are these unit tests declaring that they are using the latest microversion? The request is:\n\n  self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027)\n\nWhich defaults to 2.1:\n\nhttps://github.com/openstack/nova/blob/e3a55493ba0cb405f14b9090282d93eb230c5715/nova/tests/unit/api/openstack/fakes.py#L273","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":220,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":221,"context_line":"                APIVersionRequest(\u00272.76\u0027))"},{"line_number":222,"context_line":"        self.assertRaises("},{"line_number":223,"context_line":"            webob.exc.HTTPBadRequest,"},{"line_number":224,"context_line":"            self.controller._unshelve, self.req, fakes.FAKE_UUID,"},{"line_number":225,"context_line":"            body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_42b2de95","line":222,"updated":"2019-08-20 23:03:11.000000000","message":"trap the exception and assert it\u0027s the error you expect, e.g.:\n\nex \u003d self.assertRaises(...)\nself.assertIn(\u0027some error message substring\u0027, six.text_type(ex))","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":220,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":221,"context_line":"                APIVersionRequest(\u00272.76\u0027))"},{"line_number":222,"context_line":"        self.assertRaises("},{"line_number":223,"context_line":"            webob.exc.HTTPBadRequest,"},{"line_number":224,"context_line":"            self.controller._unshelve, self.req, fakes.FAKE_UUID,"},{"line_number":225,"context_line":"            body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_b183de02","line":222,"in_reply_to":"7faddb67_42b2de95","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":235,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        body \u003d {\u0027unshelve\u0027: None}"},{"line_number":238,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":239,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":240,"context_line":"                APIVersionRequest(\u00272.76\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_62ad9a2f","line":237,"range":{"start_line":237,"start_character":28,"end_line":237,"end_character":32},"updated":"2019-08-20 23:03:11.000000000","message":"this is not an empty dict like the comment in the test suggests","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":235,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        body \u003d {\u0027unshelve\u0027: None}"},{"line_number":238,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":239,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":240,"context_line":"                APIVersionRequest(\u00272.76\u0027))"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_517e2a19","line":237,"range":{"start_line":237,"start_character":28,"end_line":237,"end_character":32},"in_reply_to":"7faddb67_62ad9a2f","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":246,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":247,"context_line":"    def test_unshelve_with_empty_dict_failed("},{"line_number":248,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":249,"context_line":"        \"\"\"Unshelve server with empty dict before microversion 2.77"},{"line_number":250,"context_line":"        will be failed."},{"line_number":251,"context_line":"        \"\"\""},{"line_number":252,"context_line":"        instance \u003d self.fake_get_instance()"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_22a32245","line":249,"range":{"start_line":249,"start_character":43,"end_line":249,"end_character":49},"updated":"2019-08-20 23:03:11.000000000","message":"before or with 2.77?","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":246,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":247,"context_line":"    def test_unshelve_with_empty_dict_failed("},{"line_number":248,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":249,"context_line":"        \"\"\"Unshelve server with empty dict before microversion 2.77"},{"line_number":250,"context_line":"        will be failed."},{"line_number":251,"context_line":"        \"\"\""},{"line_number":252,"context_line":"        instance \u003d self.fake_get_instance()"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_71f56682","line":249,"range":{"start_line":249,"start_character":43,"end_line":249,"end_character":49},"in_reply_to":"7faddb67_22a32245","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":265,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":266,"context_line":"    def test_unshelve_with_az_success(self, mock_get_instance, mock_unshelve):"},{"line_number":267,"context_line":"        \"\"\"Make sure we can use availability_zone with microversion 2.77\"\"\""},{"line_number":268,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":269,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_e2666a29","line":266,"updated":"2019-08-20 23:03:11.000000000","message":"This is redundant with the functional test so I don\u0027t think we need it. The unit tests are mostly only useful for negative scenario testing.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":265,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":266,"context_line":"    def test_unshelve_with_az_success(self, mock_get_instance, mock_unshelve):"},{"line_number":267,"context_line":"        \"\"\"Make sure we can use availability_zone with microversion 2.77\"\"\""},{"line_number":268,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":269,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_b10d1e90","line":266,"in_reply_to":"7faddb67_e2666a29","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"427991ca1180aebfb342515f8cf556f45a62dd89","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": {}})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_3a581488","line":56,"range":{"start_line":56,"start_character":26,"end_line":56,"end_character":47},"updated":"2019-08-22 01:59:31.000000000","message":"let\u0027s keep as it is so that we make sure no change in old version.","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"90e2979b693a2d5b073faa04725b898b0660afc0","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": {}})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_6dbed465","line":56,"range":{"start_line":56,"start_character":26,"end_line":56,"end_character":47},"in_reply_to":"7faddb67_3a581488","updated":"2019-08-22 07:06:01.000000000","message":"Yeah, this can keep the old version, but need to change this as \"body\u003d{}\".","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97d42a8332dce74a124f49a85c1d2e10efa7ec35","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake,"},{"line_number":56,"context_line":"                          body\u003d{\"unshelve\": {}})"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":59,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_10d64955","line":56,"range":{"start_line":56,"start_character":26,"end_line":56,"end_character":47},"in_reply_to":"7faddb67_6dbed465","updated":"2019-08-22 15:52:22.000000000","message":"\u003e Yeah, this can keep the old version, but need to change this as\n \u003e \"body\u003d{}\".\n\nIs that because of the @validation.schema decorator?\n\nYup:\n\n  _schema_validation_helper(request_body_schema, kwargs[\u0027body\u0027],","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97d42a8332dce74a124f49a85c1d2e10efa7ec35","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.stub_out(\u0027nova.compute.api.API.unshelve\u0027,"},{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake, body\u003d{})"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":58,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_303d858e","line":55,"range":{"start_line":55,"start_character":55,"end_line":55,"end_character":63},"updated":"2019-08-22 15:52:22.000000000","message":"This should be:\n\n  body\u003d{\u0027unshelve\u0027: {}}","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2678638812d0bf061673af3baa5f5d6fef12d5a3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.stub_out(\u0027nova.compute.api.API.unshelve\u0027,"},{"line_number":53,"context_line":"                      fakes.fake_actions_to_locked_server)"},{"line_number":54,"context_line":"        self.assertRaises(webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":55,"context_line":"                          self.req, uuidsentinel.fake, body\u003d{})"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":58,"context_line":"    def test_shelve_offload_locked_server(self, get_instance_mock):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_5fe03327","line":55,"range":{"start_line":55,"start_character":55,"end_line":55,"end_character":63},"in_reply_to":"7faddb67_303d858e","updated":"2019-08-24 03:26:01.000000000","message":"yeah, otherwise it will fail with new schema \u003e2.77","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97d42a8332dce74a124f49a85c1d2e10efa7ec35","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        policy.set_rules(oslo_policy.Rules.from_dict(rules))"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        self.assertRaises(exception.Forbidden, self.controller._unshelve,"},{"line_number":171,"context_line":"                self.req, uuidsentinel.fake, body\u003d{})"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_unshelve_policy_failed(self):"},{"line_number":174,"context_line":"        rule_name \u003d \"os_compute_api:os-shelve:unshelve\""}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_50428111","line":171,"range":{"start_line":171,"start_character":45,"end_line":171,"end_character":52},"updated":"2019-08-22 15:52:22.000000000","message":"same","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9720081768efa4373d3c1f1e91f202935ababe56","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        mock_unshelve.assert_called_once_with("},{"line_number":260,"context_line":"            self.req.environ[\u0027nova.context\u0027], instance, new_az\u003dNone)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":263,"context_line":"    def test_invalid_az_name_with_int(self, mock_get_instance):"},{"line_number":264,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":265,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_702a1d30","line":262,"updated":"2019-08-22 16:02:54.000000000","message":"We shouldn\u0027t need this mock - we won\u0027t get past the schema validation decorator.","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        mock_unshelve.assert_called_once_with("},{"line_number":260,"context_line":"            self.req.environ[\u0027nova.context\u0027], instance, new_az\u003dNone)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":263,"context_line":"    def test_invalid_az_name_with_int(self, mock_get_instance):"},{"line_number":264,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":265,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_faeca3bc","line":262,"in_reply_to":"7faddb67_702a1d30","updated":"2019-08-23 00:33:03.000000000","message":"Done","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9720081768efa4373d3c1f1e91f202935ababe56","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        self.assertIn(\"Invalid input for field/attribute availability_zone\","},{"line_number":277,"context_line":"                      six.text_type(exc))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":280,"context_line":"    def test_valid_az_name_with_null(self, mock_get_instance):"},{"line_number":281,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":282,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_3024a560","line":279,"updated":"2019-08-22 16:02:54.000000000","message":"same","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"bb12bf2c5becb04b2cebcef6e31c2b96308ab855","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        self.assertIn(\"Invalid input for field/attribute availability_zone\","},{"line_number":277,"context_line":"                      six.text_type(exc))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":280,"context_line":"    def test_valid_az_name_with_null(self, mock_get_instance):"},{"line_number":281,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":282,"context_line":"        mock_get_instance.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_9a27af1f","line":279,"in_reply_to":"7faddb67_3024a560","updated":"2019-08-23 00:33:03.000000000","message":"Done","commit_id":"59cbdc98fff02b3d84296b9f898a8f94b14f6dfb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"16f7db4843a16fd8823c47e1629bd60eea9513b4","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":252,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        body \u003d {\u0027unshelve\u0027: {}}"},{"line_number":255,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":256,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":257,"context_line":"                APIVersionRequest(\u00272.76\u0027))"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_1fbabbbf","line":254,"range":{"start_line":254,"start_character":0,"end_line":254,"end_character":31},"updated":"2019-08-24 03:42:56.000000000","message":"you can add this tests for 2.77 also which can verify the 400 in this case.","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"81b6f62544b351f4f6267913b6464be745368372","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        instance \u003d self.fake_get_instance()"},{"line_number":252,"context_line":"        mock_get_instance.return_value \u003d instance"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        body \u003d {\u0027unshelve\u0027: {}}"},{"line_number":255,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":256,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":257,"context_line":"                APIVersionRequest(\u00272.76\u0027))"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_31ea4bd8","line":254,"range":{"start_line":254,"start_character":0,"end_line":254,"end_character":31},"in_reply_to":"7faddb67_1fbabbbf","updated":"2019-08-24 09:53:18.000000000","message":"Done","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"16f7db4843a16fd8823c47e1629bd60eea9513b4","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            exception.ValidationError,"},{"line_number":270,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":271,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":272,"context_line":"        self.assertIn(\"Invalid input for field/attribute availability_zone\","},{"line_number":273,"context_line":"                      six.text_type(exc))"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def test_valid_az_name_with_null(self):"},{"line_number":276,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_3fa9b77b","line":273,"range":{"start_line":272,"start_character":0,"end_line":273,"end_character":41},"updated":"2019-08-24 03:42:56.000000000","message":"I will suggest to skip the assertion on error message.","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"81b6f62544b351f4f6267913b6464be745368372","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            exception.ValidationError,"},{"line_number":270,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":271,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":272,"context_line":"        self.assertIn(\"Invalid input for field/attribute availability_zone\","},{"line_number":273,"context_line":"                      six.text_type(exc))"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def test_valid_az_name_with_null(self):"},{"line_number":276,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"7faddb67_f1bd93d7","line":273,"range":{"start_line":272,"start_character":0,"end_line":273,"end_character":41},"in_reply_to":"7faddb67_3fa9b77b","updated":"2019-08-24 09:53:18.000000000","message":"I agree, the py27 and py37 checksums were investigated, and no difference was found. The follow-up will continue.","commit_id":"ea0105fef9da8b5c4937b49619ba611bbabee5b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova import test"},{"line_number":26,"context_line":"from nova.tests.unit.api.openstack import fakes"},{"line_number":27,"context_line":"from nova.tests.unit import fake_instance"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class ShelvePolicyTestV21(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_fffa1841","line":28,"updated":"2019-08-27 14:53:25.000000000","message":"This is a third party import so it should be grouped above with webob and the oslo imports.\n\nImports generally are grouped as:\n\n\u003cstandard library\u003e\n\n\u003cthird party dependencies - things you get from pypi\u003e\n\n\u003cnova imports\u003e","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from nova import test"},{"line_number":26,"context_line":"from nova.tests.unit.api.openstack import fakes"},{"line_number":27,"context_line":"from nova.tests.unit import fake_instance"},{"line_number":28,"context_line":"import six"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class ShelvePolicyTestV21(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1c385fec","line":28,"in_reply_to":"7faddb67_fffa1841","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            exc.format_message())"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class ShelveServerControllerTestV277(test.NoDBTestCase):"},{"line_number":186,"context_line":"    \"\"\"Server controller test for microversion 2.77"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    Add availability_zone parameter to unshelve a shelved-offloaded server of"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_7fb5c87d","line":185,"range":{"start_line":185,"start_character":6,"end_line":185,"end_character":12},"updated":"2019-08-27 14:53:25.000000000","message":"Unshelve","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            exc.format_message())"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"class ShelveServerControllerTestV277(test.NoDBTestCase):"},{"line_number":186,"context_line":"    \"\"\"Server controller test for microversion 2.77"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    Add availability_zone parameter to unshelve a shelved-offloaded server of"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5c17b755","line":185,"range":{"start_line":185,"start_character":6,"end_line":185,"end_character":12},"in_reply_to":"7faddb67_7fb5c87d","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    def fake_get_instance(self):"},{"line_number":201,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":202,"context_line":"            self.req.environ[\u0027nova.context\u0027],"},{"line_number":203,"context_line":"            user_id\u003dself.req.environ[\u0027nova.context\u0027].user_id)"},{"line_number":204,"context_line":"        instance.vm_state \u003d \u0027SHELVED_OFFLOADED\u0027"},{"line_number":205,"context_line":"        return instance"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_bf5b3d20","line":203,"updated":"2019-08-27 16:57:48.000000000","message":"I\u0027m not sure why user_id matters here - did you copy this from a policy test above?","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"827675c6e0c781739c3767a3fab360bb8de19b69","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    def fake_get_instance(self):"},{"line_number":201,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":202,"context_line":"            self.req.environ[\u0027nova.context\u0027],"},{"line_number":203,"context_line":"            user_id\u003dself.req.environ[\u0027nova.context\u0027].user_id)"},{"line_number":204,"context_line":"        instance.vm_state \u003d \u0027SHELVED_OFFLOADED\u0027"},{"line_number":205,"context_line":"        return instance"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_02c8f472","line":203,"in_reply_to":"7faddb67_bf5b3d20","updated":"2019-08-27 17:02:34.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":202,"context_line":"            self.req.environ[\u0027nova.context\u0027],"},{"line_number":203,"context_line":"            user_id\u003dself.req.environ[\u0027nova.context\u0027].user_id)"},{"line_number":204,"context_line":"        instance.vm_state \u003d \u0027SHELVED_OFFLOADED\u0027"},{"line_number":205,"context_line":"        return instance"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3fa50d04","line":204,"range":{"start_line":204,"start_character":29,"end_line":204,"end_character":46},"updated":"2019-08-27 16:57:48.000000000","message":"This is not a valid vm_state, see nova.compute.vm_states.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"827675c6e0c781739c3767a3fab360bb8de19b69","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":202,"context_line":"            self.req.environ[\u0027nova.context\u0027],"},{"line_number":203,"context_line":"            user_id\u003dself.req.environ[\u0027nova.context\u0027].user_id)"},{"line_number":204,"context_line":"        instance.vm_state \u003d \u0027SHELVED_OFFLOADED\u0027"},{"line_number":205,"context_line":"        return instance"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_a2c6c067","line":204,"range":{"start_line":204,"start_character":29,"end_line":204,"end_character":46},"in_reply_to":"7faddb67_3fa50d04","updated":"2019-08-27 17:02:34.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":219,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":220,"context_line":"                APIVersionRequest(\u00272.76\u0027))"},{"line_number":221,"context_line":"        ex \u003d self.assertRaises("},{"line_number":222,"context_line":"           webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":223,"context_line":"           self.req, fakes.FAKE_UUID, body\u003dbody)"},{"line_number":224,"context_line":"        self.assertIn(\"Cannot \u0027unshelve\u0027 instance\", six.text_type(ex))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":227,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5f6facf9","line":224,"range":{"start_line":221,"start_character":8,"end_line":224,"end_character":70},"updated":"2019-08-27 14:53:25.000000000","message":"Why does this fail? The provided AZ should be ignored when using a microversion less than 2.76. Seems you should be mocking nova.compute.api.API.unshelve and just make sure that it\u0027s called with new_az\u003dNone.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"827675c6e0c781739c3767a3fab360bb8de19b69","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":219,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":220,"context_line":"                APIVersionRequest(\u00272.76\u0027))"},{"line_number":221,"context_line":"        ex \u003d self.assertRaises("},{"line_number":222,"context_line":"           webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":223,"context_line":"           self.req, fakes.FAKE_UUID, body\u003dbody)"},{"line_number":224,"context_line":"        self.assertIn(\"Cannot \u0027unshelve\u0027 instance\", six.text_type(ex))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":227,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_e2911855","line":224,"range":{"start_line":221,"start_character":8,"end_line":224,"end_character":70},"in_reply_to":"7faddb67_3f22eda4","updated":"2019-08-27 17:02:34.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.req.body \u003d jsonutils.dump_as_bytes(body)"},{"line_number":219,"context_line":"        self.req.api_version_request \u003d (api_version_request."},{"line_number":220,"context_line":"                APIVersionRequest(\u00272.76\u0027))"},{"line_number":221,"context_line":"        ex \u003d self.assertRaises("},{"line_number":222,"context_line":"           webob.exc.HTTPConflict, self.controller._unshelve,"},{"line_number":223,"context_line":"           self.req, fakes.FAKE_UUID, body\u003dbody)"},{"line_number":224,"context_line":"        self.assertIn(\"Cannot \u0027unshelve\u0027 instance\", six.text_type(ex))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":227,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3f22eda4","line":224,"range":{"start_line":221,"start_character":8,"end_line":224,"end_character":70},"in_reply_to":"7faddb67_5f6facf9","updated":"2019-08-27 16:57:48.000000000","message":"You\u0027re probably getting InstanceInvalidState because fake_get_instance doesn\u0027t set task_state to None or launched_at to some non-None value. Mocking compute.API.unshelve will avoid that false failure.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":245,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":246,"context_line":"    def test_unshelve_with_empty_dict_pre_2_77_success("},{"line_number":247,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":248,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":249,"context_line":"        before microversion 2.77."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1f529436","line":246,"range":{"start_line":246,"start_character":8,"end_line":246,"end_character":54},"updated":"2019-08-27 14:53:25.000000000","message":"This is redundant with the ShelvePolicyTestV21 and ShelvePolicyEnforcementV21 unshelve tests above so we could drop it.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @mock.patch(\u0027nova.compute.api.API.unshelve\u0027)"},{"line_number":245,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":246,"context_line":"    def test_unshelve_with_empty_dict_pre_2_77_success("},{"line_number":247,"context_line":"            self, mock_get_instance, mock_unshelve):"},{"line_number":248,"context_line":"        \"\"\"Make sure we can unshelve server with empty dict"},{"line_number":249,"context_line":"        before microversion 2.77."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_7f84e55d","line":246,"range":{"start_line":246,"start_character":8,"end_line":246,"end_character":54},"in_reply_to":"7faddb67_1f529436","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                                self.controller._unshelve,"},{"line_number":274,"context_line":"                                self.req, fakes.FAKE_UUID,"},{"line_number":275,"context_line":"                                body\u003dbody)"},{"line_number":276,"context_line":"        self.assertIn(\"Invalid input for field/attribute unshelve\","},{"line_number":277,"context_line":"                      six.text_type(exc))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def test_invalid_az_name_with_int(self):"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_9f3be4e8","line":276,"updated":"2019-08-27 14:53:25.000000000","message":"Is there something more contextual in the error message about the availability_zone being required?","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                                self.controller._unshelve,"},{"line_number":274,"context_line":"                                self.req, fakes.FAKE_UUID,"},{"line_number":275,"context_line":"                                body\u003dbody)"},{"line_number":276,"context_line":"        self.assertIn(\"Invalid input for field/attribute unshelve\","},{"line_number":277,"context_line":"                      six.text_type(exc))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def test_invalid_az_name_with_int(self):"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_9fe3e134","line":276,"in_reply_to":"7faddb67_9f3be4e8","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":287,"context_line":"                          self.req, fakes.FAKE_UUID,"},{"line_number":288,"context_line":"                          body\u003dbody)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def test_valid_az_name_with_null(self):"},{"line_number":291,"context_line":"        body \u003d {"},{"line_number":292,"context_line":"            \u0027unshelve\u0027: {"},{"line_number":293,"context_line":"                \u0027availability_zone\u0027: None"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_e4628b3d","line":290,"range":{"start_line":290,"start_character":13,"end_line":290,"end_character":36},"updated":"2019-08-27 14:53:25.000000000","message":"This is a confusing test name since no AZ name is given in the request body. Maybe call this instead test_az_key_null_value or test_no_az_value or something like that.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":287,"context_line":"                          self.req, fakes.FAKE_UUID,"},{"line_number":288,"context_line":"                          body\u003dbody)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def test_valid_az_name_with_null(self):"},{"line_number":291,"context_line":"        body \u003d {"},{"line_number":292,"context_line":"            \u0027unshelve\u0027: {"},{"line_number":293,"context_line":"                \u0027availability_zone\u0027: None"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3ff3cd0b","line":290,"range":{"start_line":290,"start_character":13,"end_line":290,"end_character":36},"in_reply_to":"7faddb67_e4628b3d","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            exception.ValidationError,"},{"line_number":310,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":311,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":312,"context_line":"        self.assertIn(\"Invalid input for field/attribute unshelve\","},{"line_number":313,"context_line":"                      six.text_type(exc))"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_ff2bf891","line":312,"updated":"2019-08-27 14:53:25.000000000","message":"Is there something more contextual in the error message about additional properties not being allowed or additional_param not being known?","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":309,"context_line":"            exception.ValidationError,"},{"line_number":310,"context_line":"            self.controller._unshelve, self.req,"},{"line_number":311,"context_line":"            fakes.FAKE_UUID, body\u003dbody)"},{"line_number":312,"context_line":"        self.assertIn(\"Invalid input for field/attribute unshelve\","},{"line_number":313,"context_line":"                      six.text_type(exc))"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_ffd4554d","line":312,"in_reply_to":"7faddb67_ff2bf891","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"nova/tests/unit/compute/test_shelve.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf06baf70d35109bbee4b5f676efa6f4a2d8e449","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"7faddb67_20911a53","line":934,"updated":"2019-08-16 09:04:38.000000000","message":"I think we don\u0027t have test coverage for the codeblock starting at https://review.opendev.org/#/c/663851/29/nova/compute/api.py@3677","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d5c165eecd37c79c2fb6246f1e8e076ff79aaeae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"7faddb67_ce4ce977","line":934,"in_reply_to":"7faddb67_03d0a8f6","updated":"2019-08-17 08:20:41.000000000","message":"Done","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"89d455008fedbcdcfcedcaf8bb1982e25000ab4d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"7faddb67_03d0a8f6","line":934,"in_reply_to":"7faddb67_20911a53","updated":"2019-08-17 01:02:45.000000000","message":"Supplement later.","commit_id":"5a70e960fba61f9c35400d3f9ea0ff8ef4358fbb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":891,"context_line":"            vm_states.SHELVED_OFFLOADED)"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"        new_az \u003d \"fake-new-az\""},{"line_number":894,"context_line":"        self.compute_api._validate_unshelve_az("},{"line_number":895,"context_line":"            self.context, instance, new_az)"},{"line_number":896,"context_line":"        mock_validate_unshelve_az.assert_called_once_with("},{"line_number":897,"context_line":"            self.context, instance, new_az)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_027dc6b0","line":894,"updated":"2019-08-20 23:03:11.000000000","message":"What is the point? You\u0027re mocking the method you\u0027re calling?","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":891,"context_line":"            vm_states.SHELVED_OFFLOADED)"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"        new_az \u003d \"fake-new-az\""},{"line_number":894,"context_line":"        self.compute_api._validate_unshelve_az("},{"line_number":895,"context_line":"            self.context, instance, new_az)"},{"line_number":896,"context_line":"        mock_validate_unshelve_az.assert_called_once_with("},{"line_number":897,"context_line":"            self.context, instance, new_az)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_f1663629","line":894,"in_reply_to":"7faddb67_027dc6b0","updated":"2019-08-21 08:16:31.000000000","message":"Oh... remove this test, it\u0027s a mistake.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":897,"context_line":"            self.context, instance, new_az)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"    @mock.patch(\u0027nova.availability_zones.get_availability_zones\u0027)"},{"line_number":900,"context_line":"    def test__validate_unshelve_invalid_az(self, mock_get_azs):"},{"line_number":901,"context_line":"        # Ensure instance can be unshelved."},{"line_number":902,"context_line":"        instance \u003d self._get_specify_state_instance("},{"line_number":903,"context_line":"            vm_states.SHELVED_OFFLOADED)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_c24c8e9f","line":900,"updated":"2019-08-20 23:03:11.000000000","message":"How is this different from test_specified_az_ushelve_invalid_request?","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":897,"context_line":"            self.context, instance, new_az)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"    @mock.patch(\u0027nova.availability_zones.get_availability_zones\u0027)"},{"line_number":900,"context_line":"    def test__validate_unshelve_invalid_az(self, mock_get_azs):"},{"line_number":901,"context_line":"        # Ensure instance can be unshelved."},{"line_number":902,"context_line":"        instance \u003d self._get_specify_state_instance("},{"line_number":903,"context_line":"            vm_states.SHELVED_OFFLOADED)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_117d12b1","line":900,"in_reply_to":"7faddb67_c24c8e9f","updated":"2019-08-21 08:16:31.000000000","message":"They are same, removed.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":915,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.check_availability_zone\u0027)"},{"line_number":916,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":917,"context_line":"    @mock.patch(\u0027nova.availability_zones.get_availability_zones\u0027)"},{"line_number":918,"context_line":"    def test__validate_unshelve_az_with_bdms("},{"line_number":919,"context_line":"            self, mock_get_azs, mock_get, mock_check_az, mock_get_bdms):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_a245d270","line":916,"updated":"2019-08-20 23:03:11.000000000","message":"Why mock this if you\u0027re mocking check_availability_zone? It\u0027s not used.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":880,"context_line":"        fake_spec.availability_zone \u003d \"fake-old-az\""},{"line_number":881,"context_line":"        get_by_instance_uuid.return_value \u003d fake_spec"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self.assertRaises(exception.InstanceInvalidState,"},{"line_number":884,"context_line":"                          self.compute_api.unshelve,"},{"line_number":885,"context_line":"                          self.context, instance, new_az\u003dnew_az)"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1f005402","line":883,"range":{"start_line":883,"start_character":36,"end_line":883,"end_character":56},"updated":"2019-08-27 14:53:25.000000000","message":"This should be UnshelveInstanceInvalidState.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":880,"context_line":"        fake_spec.availability_zone \u003d \"fake-old-az\""},{"line_number":881,"context_line":"        get_by_instance_uuid.return_value \u003d fake_spec"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self.assertRaises(exception.InstanceInvalidState,"},{"line_number":884,"context_line":"                          self.compute_api.unshelve,"},{"line_number":885,"context_line":"                          self.context, instance, new_az\u003dnew_az)"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_ff8c553a","line":883,"range":{"start_line":883,"start_character":36,"end_line":883,"end_character":56},"in_reply_to":"7faddb67_1f005402","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":884,"context_line":"                          self.compute_api.unshelve,"},{"line_number":885,"context_line":"                          self.context, instance, new_az\u003dnew_az)"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"    @mock.patch(\u0027nova.volume.cinder.API.get\u0027)"},{"line_number":888,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":889,"context_line":"    @mock.patch(\u0027nova.availability_zones.get_availability_zones\u0027)"},{"line_number":890,"context_line":"    @mock.patch.object(compute_api.API, \u0027_validate_unshelve_az\u0027)"},{"line_number":891,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027save\u0027)"},{"line_number":892,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027get_by_instance_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_5f8c892d","line":889,"range":{"start_line":887,"start_character":4,"end_line":889,"end_character":65},"updated":"2019-08-27 16:57:48.000000000","message":"These aren\u0027t used in this test.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":890,"context_line":"    @mock.patch.object(compute_api.API, \u0027_validate_unshelve_az\u0027)"},{"line_number":891,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027save\u0027)"},{"line_number":892,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027get_by_instance_uuid\u0027)"},{"line_number":893,"context_line":"    def test_specified_az_ushelve(self, get_by_instance_uuid,"},{"line_number":894,"context_line":"                                  mock_save, mock_validate_unshelve_az,"},{"line_number":895,"context_line":"                                  mock_get_azs, mock_get_bdms, mock_get):"},{"line_number":896,"context_line":"        # Ensure instance can be unshelved."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_3f842d0b","line":893,"range":{"start_line":893,"start_character":26,"end_line":893,"end_character":33},"updated":"2019-08-27 16:57:48.000000000","message":"unshelve","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"827675c6e0c781739c3767a3fab360bb8de19b69","unresolved":false,"context_lines":[{"line_number":890,"context_line":"    @mock.patch.object(compute_api.API, \u0027_validate_unshelve_az\u0027)"},{"line_number":891,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027save\u0027)"},{"line_number":892,"context_line":"    @mock.patch.object(objects.RequestSpec, \u0027get_by_instance_uuid\u0027)"},{"line_number":893,"context_line":"    def test_specified_az_ushelve(self, get_by_instance_uuid,"},{"line_number":894,"context_line":"                                  mock_save, mock_validate_unshelve_az,"},{"line_number":895,"context_line":"                                  mock_get_azs, mock_get_bdms, mock_get):"},{"line_number":896,"context_line":"        # Ensure instance can be unshelved."}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_62876814","line":893,"range":{"start_line":893,"start_character":26,"end_line":893,"end_character":33},"in_reply_to":"7faddb67_3f842d0b","updated":"2019-08-27 17:02:34.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":909,"context_line":"                                           volume_id\u003d\u0027fake-volume-id\u0027)]"},{"line_number":910,"context_line":"        mock_get_bdms.return_value \u003d bdms"},{"line_number":911,"context_line":"        volume \u003d {\u0027id\u0027: \u0027fake-volume-id\u0027,"},{"line_number":912,"context_line":"                  \u0027availability_zone\u0027: \u0027east_az\u0027}"},{"line_number":913,"context_line":"        mock_get.return_value \u003d volume"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"        self.compute_api.unshelve(self.context, instance, new_az\u003dnew_az)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_ba734eb4","line":912,"range":{"start_line":912,"start_character":40,"end_line":912,"end_character":47},"updated":"2019-08-27 14:53:25.000000000","message":"This is not valid with west_az passed in, but since you\u0027ve mocked out _validate_unshelve_az the test doesn\u0027t fail. You should probably have a test directly against _validate_unshelve_az for the invalid volume AZ mismatch case.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":909,"context_line":"                                           volume_id\u003d\u0027fake-volume-id\u0027)]"},{"line_number":910,"context_line":"        mock_get_bdms.return_value \u003d bdms"},{"line_number":911,"context_line":"        volume \u003d {\u0027id\u0027: \u0027fake-volume-id\u0027,"},{"line_number":912,"context_line":"                  \u0027availability_zone\u0027: \u0027east_az\u0027}"},{"line_number":913,"context_line":"        mock_get.return_value \u003d volume"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"        self.compute_api.unshelve(self.context, instance, new_az\u003dnew_az)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_1f8131fc","line":912,"range":{"start_line":912,"start_character":40,"end_line":912,"end_character":47},"in_reply_to":"7faddb67_ba734eb4","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":915,"context_line":"        self.compute_api.unshelve(self.context, instance, new_az\u003dnew_az)"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        mock_save.assert_called_once_with()"},{"line_number":918,"context_line":"        self.assertEqual(fake_spec.availability_zone, new_az)"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        mock_validate_unshelve_az.assert_called_once_with("},{"line_number":921,"context_line":"            self.context, instance, new_az)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_fa60e6d1","line":918,"range":{"start_line":918,"start_character":25,"end_line":918,"end_character":60},"updated":"2019-08-27 14:53:25.000000000","message":"swap the order of these arguments, since the signature is (expected, actual) - it makes a difference if you get a MismatchError message if the assertion fails.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":915,"context_line":"        self.compute_api.unshelve(self.context, instance, new_az\u003dnew_az)"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        mock_save.assert_called_once_with()"},{"line_number":918,"context_line":"        self.assertEqual(fake_spec.availability_zone, new_az)"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        mock_validate_unshelve_az.assert_called_once_with("},{"line_number":921,"context_line":"            self.context, instance, new_az)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7faddb67_7f8aa51a","line":918,"range":{"start_line":918,"start_character":25,"end_line":918,"end_character":60},"in_reply_to":"7faddb67_fa60e6d1","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}],"nova/volume/cinder.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                                              \"status\": volume[\u0027status\u0027]}"},{"line_number":507,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def check_availability_zone(self, context, volume, instance\u003dNone,"},{"line_number":510,"context_line":"                                new_az\u003dNone):"},{"line_number":511,"context_line":"        \"\"\"Ensure that the availability zone is the same.\"\"\""},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        # TODO(walter-boring): move this check to Cinder as part of"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_4b10eca8","line":510,"range":{"start_line":509,"start_character":38,"end_line":510,"end_character":43},"updated":"2019-06-11 18:30:27.000000000","message":"It would probably be good at this point to describe these parameters in the docstring, especially if new_az can/should be used without passing the instance parameter.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                                              \"status\": volume[\u0027status\u0027]}"},{"line_number":507,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def check_availability_zone(self, context, volume, instance\u003dNone,"},{"line_number":510,"context_line":"                                new_az\u003dNone):"},{"line_number":511,"context_line":"        \"\"\"Ensure that the availability zone is the same.\"\"\""},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        # TODO(walter-boring): move this check to Cinder as part of"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_f904111a","line":510,"range":{"start_line":509,"start_character":38,"end_line":510,"end_character":43},"in_reply_to":"9fb8cfa7_4b10eca8","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                            \u0027vol_zone\u0027: volume[\u0027availability_zone\u0027]}"},{"line_number":525,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve of"},{"line_number":528,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":529,"context_line":"        # be to determine if their AZ matches the user-specified AZ."},{"line_number":530,"context_line":"        if new_az:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_4b022c71","line":527,"range":{"start_line":527,"start_character":75,"end_line":527,"end_character":77},"updated":"2019-06-11 18:30:27.000000000","message":"nix","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                            \u0027vol_zone\u0027: volume[\u0027availability_zone\u0027]}"},{"line_number":525,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve of"},{"line_number":528,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":529,"context_line":"        # be to determine if their AZ matches the user-specified AZ."},{"line_number":530,"context_line":"        if new_az:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_f9c2d133","line":527,"range":{"start_line":527,"start_character":75,"end_line":527,"end_character":77},"in_reply_to":"9fb8cfa7_4b022c71","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve of"},{"line_number":528,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":529,"context_line":"        # be to determine if their AZ matches the user-specified AZ."},{"line_number":530,"context_line":"        if new_az:"},{"line_number":531,"context_line":"            if (CONF.cinder.cross_az_attach and"},{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_8b0ca4a5","line":529,"range":{"start_line":529,"start_character":10,"end_line":529,"end_character":15},"updated":"2019-06-11 18:30:27.000000000","message":"nix this","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve of"},{"line_number":528,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":529,"context_line":"        # be to determine if their AZ matches the user-specified AZ."},{"line_number":530,"context_line":"        if new_az:"},{"line_number":531,"context_line":"            if (CONF.cinder.cross_az_attach and"},{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_19c0052a","line":529,"range":{"start_line":529,"start_character":10,"end_line":529,"end_character":15},"in_reply_to":"9fb8cfa7_8b0ca4a5","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve of"},{"line_number":528,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":529,"context_line":"        # be to determine if their AZ matches the user-specified AZ."},{"line_number":530,"context_line":"        if new_az:"},{"line_number":531,"context_line":"            if (CONF.cinder.cross_az_attach and"},{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"},{"line_number":533,"context_line":"                msg \u003d _(\"The specified availability zone does not match \""},{"line_number":534,"context_line":"                        \"the volumes %(vol_id)s being attached to the server. \""},{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_cbedbcb7","line":532,"range":{"start_line":530,"start_character":8,"end_line":532,"end_character":63},"updated":"2019-06-11 18:30:27.000000000","message":"This could all be a single condition:\n\nif (new_az and\n        CONF.cinder.cross_az_attach and\n        new_az !\u003d volume[\u0027availability_zone\u0027]):\n   ...","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve of"},{"line_number":528,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":529,"context_line":"        # be to determine if their AZ matches the user-specified AZ."},{"line_number":530,"context_line":"        if new_az:"},{"line_number":531,"context_line":"            if (CONF.cinder.cross_az_attach and"},{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"},{"line_number":533,"context_line":"                msg \u003d _(\"The specified availability zone does not match \""},{"line_number":534,"context_line":"                        \"the volumes %(vol_id)s being attached to the server. \""},{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_d90cada6","line":532,"range":{"start_line":530,"start_character":8,"end_line":532,"end_character":63},"in_reply_to":"9fb8cfa7_cbedbcb7","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":531,"context_line":"            if (CONF.cinder.cross_az_attach and"},{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"},{"line_number":533,"context_line":"                msg \u003d _(\"The specified availability zone does not match \""},{"line_number":534,"context_line":"                        \"the volumes %(vol_id)s being attached to the server. \""},{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""},{"line_number":536,"context_line":"                        \"Volume is in %(vol_zone)s.\") % {"},{"line_number":537,"context_line":"                    \"vol_id\": volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_8b31045d","line":534,"range":{"start_line":534,"start_character":48,"end_line":534,"end_character":53},"updated":"2019-06-11 18:30:27.000000000","message":"nix this - the volumes aren\u0027t being attached to the server, they are already attached.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":531,"context_line":"            if (CONF.cinder.cross_az_attach and"},{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"},{"line_number":533,"context_line":"                msg \u003d _(\"The specified availability zone does not match \""},{"line_number":534,"context_line":"                        \"the volumes %(vol_id)s being attached to the server. \""},{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""},{"line_number":536,"context_line":"                        \"Volume is in %(vol_zone)s.\") % {"},{"line_number":537,"context_line":"                    \"vol_id\": volume[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_3442b03f","line":534,"range":{"start_line":534,"start_character":48,"end_line":534,"end_character":53},"in_reply_to":"9fb8cfa7_8b31045d","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"},{"line_number":533,"context_line":"                msg \u003d _(\"The specified availability zone does not match \""},{"line_number":534,"context_line":"                        \"the volumes %(vol_id)s being attached to the server. \""},{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""},{"line_number":536,"context_line":"                        \"Volume is in %(vol_zone)s.\") % {"},{"line_number":537,"context_line":"                    \"vol_id\": volume[\u0027id\u0027],"},{"line_number":538,"context_line":"                    \"support_az\": new_az,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_eb3f6022","line":535,"range":{"start_line":535,"start_character":58,"end_line":535,"end_character":68},"updated":"2019-06-11 18:30:27.000000000","message":"nit: new_az","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                        new_az !\u003d volume[\u0027availability_zone\u0027]):"},{"line_number":533,"context_line":"                msg \u003d _(\"The specified availability zone does not match \""},{"line_number":534,"context_line":"                        \"the volumes %(vol_id)s being attached to the server. \""},{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""},{"line_number":536,"context_line":"                        \"Volume is in %(vol_zone)s.\") % {"},{"line_number":537,"context_line":"                    \"vol_id\": volume[\u0027id\u0027],"},{"line_number":538,"context_line":"                    \"support_az\": new_az,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_79fd816c","line":535,"range":{"start_line":535,"start_character":58,"end_line":535,"end_character":68},"in_reply_to":"9fb8cfa7_eb3f6022","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""},{"line_number":536,"context_line":"                        \"Volume is in %(vol_zone)s.\") % {"},{"line_number":537,"context_line":"                    \"vol_id\": volume[\u0027id\u0027],"},{"line_number":538,"context_line":"                    \"support_az\": new_az,"},{"line_number":539,"context_line":"                    \"vol_zone\": volume[\u0027availability_zone\u0027]}"},{"line_number":540,"context_line":"                raise exception.InvalidVolume(explanation\u003dmsg)"},{"line_number":541,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_0b3d142a","line":538,"range":{"start_line":538,"start_character":21,"end_line":538,"end_character":31},"updated":"2019-06-11 18:30:27.000000000","message":"new_az","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                        \"Specified availability zone is %(support_az)s. \""},{"line_number":536,"context_line":"                        \"Volume is in %(vol_zone)s.\") % {"},{"line_number":537,"context_line":"                    \"vol_id\": volume[\u0027id\u0027],"},{"line_number":538,"context_line":"                    \"support_az\": new_az,"},{"line_number":539,"context_line":"                    \"vol_zone\": volume[\u0027availability_zone\u0027]}"},{"line_number":540,"context_line":"                raise exception.InvalidVolume(explanation\u003dmsg)"},{"line_number":541,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_59f8bd79","line":538,"range":{"start_line":538,"start_character":21,"end_line":538,"end_character":31},"in_reply_to":"9fb8cfa7_0b3d142a","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve"},{"line_number":536,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":537,"context_line":"        # this determine if their AZ matches the user-specified AZ."},{"line_number":538,"context_line":"        if (new_az and"},{"line_number":539,"context_line":"                not CONF.cinder.cross_az_attach and"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_315fb942","line":536,"range":{"start_line":536,"start_character":63,"end_line":536,"end_character":67},"updated":"2019-07-05 06:22:42.000000000","message":"False","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve"},{"line_number":536,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":537,"context_line":"        # this determine if their AZ matches the user-specified AZ."},{"line_number":538,"context_line":"        if (new_az and"},{"line_number":539,"context_line":"                not CONF.cinder.cross_az_attach and"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_4137eab1","line":536,"range":{"start_line":536,"start_character":63,"end_line":536,"end_character":67},"in_reply_to":"7faddb67_315fb942","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3a4027eed149a16a42e0ea02f77e122f57e4fb11","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        # NOTE(brinzhang): When specifying a availability zone to unshelve"},{"line_number":536,"context_line":"        # a shelved offloaded server, and conf cross_az_attach\u003dTrue, need to"},{"line_number":537,"context_line":"        # this determine if their AZ matches the user-specified AZ."},{"line_number":538,"context_line":"        if (new_az and"},{"line_number":539,"context_line":"                not CONF.cinder.cross_az_attach and"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_d4bc13bd","line":536,"range":{"start_line":536,"start_character":63,"end_line":536,"end_character":67},"in_reply_to":"7faddb67_315fb942","updated":"2019-07-05 06:33:32.000000000","message":"the current spec also mentioned it wrongly, fixing that in https://review.opendev.org/#/c/669261/","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                                new_az\u003dNone):"},{"line_number":511,"context_line":"        \"\"\"Ensure that the availability zone is the same."},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        If the new_az can be used without passing the instance parameter."},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        :param context: the nova request context"},{"line_number":516,"context_line":"        :param volume: the volume attached to the nova"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_2226c2cc","line":513,"updated":"2019-08-20 23:03:11.000000000","message":"This is kind of weird semantically. Could we just put the new_az validation in the compute API where it\u0027s specific to the unshelve case and not munge it in here?","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                                new_az\u003dNone):"},{"line_number":511,"context_line":"        \"\"\"Ensure that the availability zone is the same."},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        If the new_az can be used without passing the instance parameter."},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        :param context: the nova request context"},{"line_number":516,"context_line":"        :param volume: the volume attached to the nova"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_eb4f258f","line":513,"in_reply_to":"7faddb67_2226c2cc","updated":"2019-08-21 08:16:31.000000000","message":"Remove the new_az processing, reserved the param description.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"65d2db7c3738eee9ce2fa5647d295da096dbf12a","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        \"\"\"Ensure that the availability zone is the same."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        :param context: the nova request context"},{"line_number":513,"context_line":"        :param volume: the volume attached to the nova"},{"line_number":514,"context_line":"        :param instance: nova.objects.instance.Instance object"},{"line_number":515,"context_line":"        \"\"\""},{"line_number":516,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_9f633db1","line":513,"range":{"start_line":513,"start_character":50,"end_line":513,"end_character":54},"updated":"2019-08-21 19:51:19.000000000","message":"instance - but let\u0027s just undo the docstring additions to this method in this change, it just makes the already large patch bigger.","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"fb9587c8180ac7e3b969826720eb15faba2a56d7","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        \"\"\"Ensure that the availability zone is the same."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        :param context: the nova request context"},{"line_number":513,"context_line":"        :param volume: the volume attached to the nova"},{"line_number":514,"context_line":"        :param instance: nova.objects.instance.Instance object"},{"line_number":515,"context_line":"        \"\"\""},{"line_number":516,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"7faddb67_3a56d4cf","line":513,"range":{"start_line":513,"start_character":50,"end_line":513,"end_character":54},"in_reply_to":"7faddb67_9f633db1","updated":"2019-08-22 01:03:55.000000000","message":"I was pushed this to https://review.opendev.org/#/c/677858/, it will be removed from this patch.","commit_id":"929254359eaa8fa29835f35f897c056b67f94eb4"}],"releasenotes/notes/bp-specifying-az-to-unshelve-server-aa355fef1eab2c02.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.74 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the unshelve/restore shelved server (unshelve Action) API. Supporting"},{"line_number":5,"context_line":"    for specifying unshelve a shelved offloaded server."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_ab1e48b8","line":4,"range":{"start_line":4,"start_character":16,"end_line":4,"end_character":24},"updated":"2019-06-11 18:30:27.000000000","message":"nix","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.74 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the unshelve/restore shelved server (unshelve Action) API. Supporting"},{"line_number":5,"context_line":"    for specifying unshelve a shelved offloaded server."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_6b7a90f1","line":4,"range":{"start_line":4,"start_character":25,"end_line":4,"end_character":32},"updated":"2019-06-11 18:30:27.000000000","message":"shelved offloaded","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.74 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the unshelve/restore shelved server (unshelve Action) API. Supporting"},{"line_number":5,"context_line":"    for specifying unshelve a shelved offloaded server."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_99b4f5d2","line":4,"range":{"start_line":4,"start_character":25,"end_line":4,"end_character":32},"in_reply_to":"9fb8cfa7_6b7a90f1","updated":"2019-06-12 09:00:28.000000000","message":"This said the \"Unshelve (Restore) Shelved Server (unshelve Action) API\" [1], I would I keep it in line with the API.\nhttps://developer.openstack.org/api-ref/compute/#unshelve-restore-shelved-server-unshelve-action","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0436c3fd166acf710d6ddda1c8b5ce1abaad511a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.74 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the unshelve/restore shelved server (unshelve Action) API. Supporting"},{"line_number":5,"context_line":"    for specifying unshelve a shelved offloaded server."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_eb6d2032","line":5,"range":{"start_line":4,"start_character":63,"end_line":5,"end_character":55},"updated":"2019-06-11 18:30:27.000000000","message":"This doesn\u0027t make anything more clear in my mind so I\u0027d remove this sentence.","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"dbf865b3dca08adc42b511a23ad1c167469c24f8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.74 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the unshelve/restore shelved server (unshelve Action) API. Supporting"},{"line_number":5,"context_line":"    for specifying unshelve a shelved offloaded server."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_1999e577","line":5,"range":{"start_line":4,"start_character":63,"end_line":5,"end_character":55},"in_reply_to":"9fb8cfa7_eb6d2032","updated":"2019-06-12 09:00:28.000000000","message":"Done","commit_id":"cb97d51cf742ae71df6e60fbb8060946d5c7804c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"546924ab832ad4e29fa4b7d5fd1a8ef3ad1a9d14","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.74 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"7faddb67_d13505f9","line":4,"range":{"start_line":4,"start_character":67,"end_line":4,"end_character":68},"updated":"2019-07-05 06:22:42.000000000","message":"Please elaborate more about the use case and 2 special cases.\n\n1. only work in case of shelved-offload case and 400 if you unshelve the shelve (not shelve-offload) server\n\n2. if cross_az_attach is False then this AZ has to be same as Volume attached to shelved-offload server otherwise it will be 400","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"872a441af99fffdae07175f0ec1be2d223eb8328","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.74 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"7faddb67_21466e25","line":4,"range":{"start_line":4,"start_character":67,"end_line":4,"end_character":68},"in_reply_to":"7faddb67_d13505f9","updated":"2019-07-08 09:53:16.000000000","message":"Done","commit_id":"7d1fd13afe14946d5172f81d8e156b84f440f239"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"8638b0529cbd73a8faf4ddd09f35a245d8c5248d","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"      * Only work in case of ``SHELVED_OFFLOADED`` status server and will be"},{"line_number":7,"context_line":"        return a 400 if you unshelve the shelve (not shelved-offloaded) server."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"}],"source_content_type":"text/x-yaml","patch_set":33,"id":"7faddb67_0f2758c9","line":7,"range":{"start_line":6,"start_character":7,"end_line":7,"end_character":79},"updated":"2019-08-19 09:16:00.000000000","message":"ditto","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"477359c88a49f4f9568dab9be24ca8db52b517ae","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"      * Only work in case of ``SHELVED_OFFLOADED`` status server and will be"},{"line_number":7,"context_line":"        return a 400 if you unshelve the shelve (not shelved-offloaded) server."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"        the same as volume attached to shelved-offloaded server, otherwise it"}],"source_content_type":"text/x-yaml","patch_set":33,"id":"7faddb67_8557a701","line":7,"range":{"start_line":6,"start_character":7,"end_line":7,"end_character":79},"in_reply_to":"7faddb67_0f2758c9","updated":"2019-08-19 11:16:53.000000000","message":"Done","commit_id":"67e94a1ad3b324b140a1210547a2a5b661b7f83b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"        return a 400."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_c21a4e7b","line":4,"range":{"start_line":4,"start_character":8,"end_line":4,"end_character":63},"updated":"2019-08-20 23:03:11.000000000","message":"``unshelve`` server action API","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"        return a 400."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_fc084dd9","line":4,"range":{"start_line":4,"start_character":8,"end_line":4,"end_character":63},"in_reply_to":"7faddb67_c21a4e7b","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b756e637a2463e489c9fb5477c612821539b6a86","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"        return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_8210d65a","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":6},"updated":"2019-08-20 23:03:11.000000000","message":"This is indented too far so formatting is not correct. Anyway, same comments as in the API reference.","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"842bf0b61983feaac0df64f49fecca8c952b7d28","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``Unshelve (Restore) Shelved Server (unshelve Action)`` API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"      * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"        return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"      * If ``cross_az_attach`` is False then this availability zone has to be"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7faddb67_dc0551c3","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":6},"in_reply_to":"7faddb67_8210d65a","updated":"2019-08-21 08:16:31.000000000","message":"Done","commit_id":"2c98619658b80167bed412c07428bd31d772c430"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``unshelve`` server action API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_fab54633","line":3,"updated":"2019-08-27 14:53:25.000000000","message":"The bullet list doesn\u0027t render properly:\n\nhttps://ac13160b9f6505cb4f48-58ad23e4ce64c146e6acb1a522568306.ssl.cf1.rackcdn.com/663851/42/check/build-openstack-releasenotes/87e4195/html/unreleased.html\n\nYou need to format the note like this:\n\nfeatures:\n  - |\n    Microversion 2.77 ...\n\n    * Only works if server status...","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``unshelve`` server action API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_82ff04ff","line":3,"in_reply_to":"7faddb67_fab54633","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``unshelve`` server action API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_5a901a97","line":6,"updated":"2019-08-27 14:53:25.000000000","message":"Re-word this:\n\n\"Specifying an availability zone during unshelve is only supported when the server status is ``SHELVED_OFFLOADED`` otherwise a 409 HTTPConflict error response is returned.\"","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Microversion 2.77 adds the optional parameter ``availability_zone`` to"},{"line_number":4,"context_line":"    the ``unshelve`` server action API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_2206501e","line":6,"in_reply_to":"7faddb67_5a901a97","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    the ``unshelve`` server action API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_da840a60","line":7,"range":{"start_line":7,"start_character":15,"end_line":7,"end_character":18},"updated":"2019-08-27 14:53:25.000000000","message":"This is wrong - it\u0027s a 409.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    the ``unshelve`` server action API."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_42090c29","line":7,"range":{"start_line":7,"start_character":15,"end_line":7,"end_character":18},"in_reply_to":"7faddb67_da840a60","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_dae96a19","line":9,"range":{"start_line":9,"start_character":6,"end_line":9,"end_character":37},"updated":"2019-08-27 14:53:25.000000000","message":"If the ``[cinder]/cross_az_attach`` configuration option is False...","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_bae6ee49","line":9,"range":{"start_line":9,"start_character":43,"end_line":9,"end_character":47},"updated":"2019-08-27 14:53:25.000000000","message":"the specified","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_c2141c44","line":9,"range":{"start_line":9,"start_character":43,"end_line":9,"end_character":47},"in_reply_to":"7faddb67_bae6ee49","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    * Only work if server status is ``SHELVED_OFFLOADED`` otherwise it will"},{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_020b1422","line":9,"range":{"start_line":9,"start_character":6,"end_line":9,"end_character":37},"in_reply_to":"7faddb67_dae96a19","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_fabc6607","line":10,"range":{"start_line":10,"start_character":18,"end_line":10,"end_character":61},"updated":"2019-08-27 14:53:25.000000000","message":"has to be the same as the availability zone or any volumes attached to the shelved offloaded server, otherwise a 409 HTTPConflict error response is returned.","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"      return a 400."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_82286485","line":10,"range":{"start_line":10,"start_character":18,"end_line":10,"end_character":61},"in_reply_to":"7faddb67_fabc6607","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6987cdd88ff7eeb9d24d69e53a9e196f8a1d95f7","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_fae30633","line":11,"range":{"start_line":11,"start_character":23,"end_line":11,"end_character":26},"updated":"2019-08-27 14:53:25.000000000","message":"409","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d8140a9ff5870ac77e1304e0b8651336b15a331a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    * If ``cross_az_attach`` is False then this availability zone has to be"},{"line_number":10,"context_line":"      the same as volume attached to shelved-offloaded server, otherwise it"},{"line_number":11,"context_line":"      will be return a 400."}],"source_content_type":"text/x-yaml","patch_set":42,"id":"7faddb67_42226ca5","line":11,"range":{"start_line":11,"start_character":23,"end_line":11,"end_character":26},"in_reply_to":"7faddb67_fae30633","updated":"2019-08-27 16:57:48.000000000","message":"Done","commit_id":"1830b5bd079d2a48ece0d8809e79963f1d32cb75"}]}
