)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":20,"context_line":"payload object to include the \"locked_reason\" field."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Note that \"locked\" will be allowed as a valid filtering/sorting parameter"},{"line_number":23,"context_line":"for ``GET /servers/detail`` from this new microversion."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Implements blueprint add-locked-reason"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"dfbec78f_412efba5","line":23,"updated":"2019-05-07 14:17:35.000000000","message":"And GET /servers, right?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":20,"context_line":"payload object to include the \"locked_reason\" field."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Note that \"locked\" will be allowed as a valid filtering/sorting parameter"},{"line_number":23,"context_line":"for ``GET /servers/detail`` from this new microversion."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Implements blueprint add-locked-reason"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"dfbec78f_77ed008a","line":23,"in_reply_to":"dfbec78f_412efba5","updated":"2019-05-07 18:37:14.000000000","message":"corect. I\u0027ll add this.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"api-guide/source/server_concepts.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":136,"context_line":"For different user roles, the user has different query options set:"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"- For general user, there is limited set of attributes of the servers can be"},{"line_number":139,"context_line":"  used as query option. ``reservation_id``, ``name``, ``status``, ``image``,"},{"line_number":140,"context_line":"  ``flavor``, ``ip``, ``changes-since``, ``changes-before``, ``ip6``,"},{"line_number":141,"context_line":"  ``tags``, ``tags-any``, ``not-tags``, ``not-tags-any``, ``locked`` are"},{"line_number":142,"context_line":"  supported options to be used. Other options will be ignored by nova silently."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dfbec78f_3146b823","line":139,"updated":"2019-05-07 14:17:35.000000000","message":"Can we turn this into a bulleted list so we can annotate which ones require a newer microversion? Like the list here:\n\nhttps://opendev.org/openstack/nova/src/branch/master/api-ref/source/servers.inc#L159\n\nThat could be done separately I guess (or as a preceding change) since it\u0027s already not showing things like the microversions for the ip6/tags/changes-before entries.\n\nI also see that all_tenants is mentioned in the API reference but not here in the guide. The confusion is probably because of this code including it:\n\nhttps://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/api/openstack/compute/servers.py#L1216\n\nbut then the policy only allows that filter for admins (I\u0027m not sure why it\u0027s checked explicitly different in this case):\n\nhttps://docs.openstack.org/nova/latest/configuration/policy.html\n\nos_compute_api:servers:index:get_all_tenants\n\n    Default\n\n        rule:admin_api\n    Operations\n\n            GET /servers\n\n    List all servers for all projects\nos_compute_api:servers:detail:get_all_tenants\n\n    Default\n\n        rule:admin_api\n    Operations\n\n            GET /servers/detail\n\n\nAnyway, that seems like an unrelated docs bug in the API reference. I\u0027ve reported bug 1828042 for it (I\u0027ll push a patch later).","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":136,"context_line":"For different user roles, the user has different query options set:"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"- For general user, there is limited set of attributes of the servers can be"},{"line_number":139,"context_line":"  used as query option. ``reservation_id``, ``name``, ``status``, ``image``,"},{"line_number":140,"context_line":"  ``flavor``, ``ip``, ``changes-since``, ``changes-before``, ``ip6``,"},{"line_number":141,"context_line":"  ``tags``, ``tags-any``, ``not-tags``, ``not-tags-any``, ``locked`` are"},{"line_number":142,"context_line":"  supported options to be used. Other options will be ignored by nova silently."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dfbec78f_7a81654a","line":139,"in_reply_to":"dfbec78f_3146b823","updated":"2019-05-07 18:37:14.000000000","message":"thanks for the bug and fix, I will do a cleanup of this list before adding the new one in it like you have suggested.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"5121cf88b3229889f17ec76c00c72c082b2f6013","unresolved":false,"context_lines":[{"line_number":975,"context_line":"  in: query"},{"line_number":976,"context_line":"  required: false"},{"line_number":977,"context_line":"  type: string"},{"line_number":978,"context_line":"locked_query_server:"},{"line_number":979,"context_line":"  description: |"},{"line_number":980,"context_line":"    Specify the ``locked`` query parameter to list all locked or unlocked"},{"line_number":981,"context_line":"    instances. If the value is specified, ``1``, ``t``, ``true``,"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_5355834f","line":978,"updated":"2019-05-06 12:32:31.000000000","message":"is it okay to do this like the all-tenants but without a default ? wondering what the client side would look like - https://review.opendev.org/#/c/648659/2/novaclient/v2/shell.py@1569","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":975,"context_line":"  in: query"},{"line_number":976,"context_line":"  required: false"},{"line_number":977,"context_line":"  type: string"},{"line_number":978,"context_line":"locked_query_server:"},{"line_number":979,"context_line":"  description: |"},{"line_number":980,"context_line":"    Specify the ``locked`` query parameter to list all locked or unlocked"},{"line_number":981,"context_line":"    instances. If the value is specified, ``1``, ``t``, ``true``,"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_d62160b6","line":978,"in_reply_to":"dfbec78f_5355834f","updated":"2019-05-06 16:23:45.000000000","message":"The nova client works today in a way that if the --all-tenants flag is not specified then the REST request does not have all_tenants query param included. I think we can do the same here as this query param also optional.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"78cb05cd3a4b7accb16311331c878dfdeddab22e","unresolved":false,"context_lines":[{"line_number":975,"context_line":"  in: query"},{"line_number":976,"context_line":"  required: false"},{"line_number":977,"context_line":"  type: string"},{"line_number":978,"context_line":"locked_query_server:"},{"line_number":979,"context_line":"  description: |"},{"line_number":980,"context_line":"    Specify the ``locked`` query parameter to list all locked or unlocked"},{"line_number":981,"context_line":"    instances. If the value is specified, ``1``, ``t``, ``true``,"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_b1094896","line":978,"in_reply_to":"dfbec78f_d62160b6","updated":"2019-05-07 13:24:12.000000000","message":"thanks for confirming :)","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"    - ``key_name``"},{"line_number":1272,"context_line":"    - ``launch_index``"},{"line_number":1273,"context_line":"    - ``launched_at``"},{"line_number":1274,"context_line":"    - ``locked``"},{"line_number":1275,"context_line":"    - ``locked_by``"},{"line_number":1276,"context_line":"    - ``node``"},{"line_number":1277,"context_line":"    - ``power_state``"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_f1eb40d9","line":1274,"range":{"start_line":1274,"start_character":6,"end_line":1274,"end_character":16},"updated":"2019-05-07 14:17:35.000000000","message":"Can we annotate this, something like:\n\n- ``locked`` (New in version 2.73)","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"    - ``key_name``"},{"line_number":1272,"context_line":"    - ``launch_index``"},{"line_number":1273,"context_line":"    - ``launched_at``"},{"line_number":1274,"context_line":"    - ``locked``"},{"line_number":1275,"context_line":"    - ``locked_by``"},{"line_number":1276,"context_line":"    - ``node``"},{"line_number":1277,"context_line":"    - ``power_state``"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_17a364a0","line":1274,"range":{"start_line":1274,"start_character":6,"end_line":1274,"end_character":16},"in_reply_to":"dfbec78f_f1eb40d9","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":4342,"context_line":"  min_version: 2.9"},{"line_number":4343,"context_line":"locked_reason:"},{"line_number":4344,"context_line":"  description: |"},{"line_number":4345,"context_line":"    The reason behind locking a server."},{"line_number":4346,"context_line":"  in: body"},{"line_number":4347,"context_line":"  required: false"},{"line_number":4348,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_91b8c4c8","line":4345,"updated":"2019-05-07 14:17:35.000000000","message":"For the request parameter, you should specify any limits on the string, like length (255 right?).","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":4342,"context_line":"  min_version: 2.9"},{"line_number":4343,"context_line":"locked_reason:"},{"line_number":4344,"context_line":"  description: |"},{"line_number":4345,"context_line":"    The reason behind locking a server."},{"line_number":4346,"context_line":"  in: body"},{"line_number":4347,"context_line":"  required: false"},{"line_number":4348,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_37c78848","line":4345,"in_reply_to":"dfbec78f_91b8c4c8","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":4344,"context_line":"  description: |"},{"line_number":4345,"context_line":"    The reason behind locking a server."},{"line_number":4346,"context_line":"  in: body"},{"line_number":4347,"context_line":"  required: false"},{"line_number":4348,"context_line":"  type: string"},{"line_number":4349,"context_line":"  min_version: 2.73"},{"line_number":4350,"context_line":"mac_addr:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_319eb854","line":4347,"updated":"2019-05-07 14:17:35.000000000","message":"This is correct for the request parameter to the lock action API, but not the response in the GET/PUT/rebuild responses, so you\u0027ll need separate parameters for that. It\u0027s optional in the lock request, but required in the responses with the server representation (the value can be None, that\u0027s fine, required means the key is in the response body).","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":4344,"context_line":"  description: |"},{"line_number":4345,"context_line":"    The reason behind locking a server."},{"line_number":4346,"context_line":"  in: body"},{"line_number":4347,"context_line":"  required: false"},{"line_number":4348,"context_line":"  type: string"},{"line_number":4349,"context_line":"  min_version: 2.73"},{"line_number":4350,"context_line":"mac_addr:"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_77eae0ac","line":4347,"in_reply_to":"dfbec78f_319eb854","updated":"2019-05-07 18:37:14.000000000","message":"oh didn\u0027t think of that behaviour change. I\u0027ll add a another parameter for the response then.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"api-ref/source/servers-actions.inc":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"65e8484704f804bbe3c4c6f1db48f59b36f062d5","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"**Example Lock Server (lock Action) (v2.73)**"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":".. literalinclude:: ../../doc/api_samples/os-lock-server/v2.73/lock-server.json"},{"line_number":427,"context_line":"   :language: javascript"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"Response"}],"source_content_type":"text/x-c++src","patch_set":3,"id":"ffb9cba7_892bc392","line":426,"range":{"start_line":426,"start_character":63,"end_line":426,"end_character":74},"updated":"2019-04-23 18:43:27.000000000","message":"lock-server-with-reason","commit_id":"7996399347d2f45b28a9af3b7a31b92148498836"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":414,"context_line":""},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"  - server_id: server_id_path"},{"line_number":417,"context_line":"  - lock: lock"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"**Example Lock Server (lock Action)**"},{"line_number":420,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_b18dc832","line":417,"updated":"2019-05-07 14:17:35.000000000","message":"I\u0027d expect there to be a change here - why isn\u0027t locked_reason specified?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":414,"context_line":""},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"  - server_id: server_id_path"},{"line_number":417,"context_line":"  - lock: lock"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"**Example Lock Server (lock Action)**"},{"line_number":420,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_57dd5c40","line":417,"in_reply_to":"dfbec78f_b18dc832","updated":"2019-05-07 18:37:14.000000000","message":"yea you are right, I forgot to change it here. thanks for catching this.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":637,"context_line":"**Example Rebuild Server (rebuild Action) (v2.63)**"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-action-rebuild-resp.json"},{"line_number":640,"context_line":"   :language: javascript"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"Remove (Disassociate) Floating Ip (removeFloatingIp Action) (DEPRECATED)"},{"line_number":643,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_99b55934","line":640,"updated":"2019-05-06 16:23:45.000000000","message":"Do we want to update the sample here to 2.73?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":637,"context_line":"**Example Rebuild Server (rebuild Action) (v2.63)**"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-action-rebuild-resp.json"},{"line_number":640,"context_line":"   :language: javascript"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"Remove (Disassociate) Floating Ip (removeFloatingIp Action) (DEPRECATED)"},{"line_number":643,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_77cf40b0","line":640,"in_reply_to":"dfbec78f_914c449f","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"78cb05cd3a4b7accb16311331c878dfdeddab22e","unresolved":false,"context_lines":[{"line_number":637,"context_line":"**Example Rebuild Server (rebuild Action) (v2.63)**"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-action-rebuild-resp.json"},{"line_number":640,"context_line":"   :language: javascript"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"Remove (Disassociate) Floating Ip (removeFloatingIp Action) (DEPRECATED)"},{"line_number":643,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_d1487ccd","line":640,"in_reply_to":"dfbec78f_99b55934","updated":"2019-05-07 13:24:12.000000000","message":"For one of the last microversions the 2.71 server groups one, mriedem was against adding new samples which are trivial changes, but your idea is better to just update the version to the latest. I can do that, let me just confirm with mriedem.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":637,"context_line":"**Example Rebuild Server (rebuild Action) (v2.63)**"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-action-rebuild-resp.json"},{"line_number":640,"context_line":"   :language: javascript"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"Remove (Disassociate) Floating Ip (removeFloatingIp Action) (DEPRECATED)"},{"line_number":643,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_b1a4e8ba","line":640,"in_reply_to":"dfbec78f_99b55934","updated":"2019-05-07 14:17:35.000000000","message":"That doesn\u0027t seem necessary since it\u0027s a trivial new field being added.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":637,"context_line":"**Example Rebuild Server (rebuild Action) (v2.63)**"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-action-rebuild-resp.json"},{"line_number":640,"context_line":"   :language: javascript"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"Remove (Disassociate) Floating Ip (removeFloatingIp Action) (DEPRECATED)"},{"line_number":643,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_914c449f","line":640,"in_reply_to":"dfbec78f_d1487ccd","updated":"2019-05-07 14:17:35.000000000","message":"As noted elsewhere, I\u0027m OK if you want to update to 2.73, I just don\u0027t want both 2.63 and 2.73.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":391,"context_line":"will unlock a server in locked state so additional actions can"},{"line_number":392,"context_line":"be performed on the server by non-admin users."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"You can know whether a server is locked or not and the locked_reason"},{"line_number":395,"context_line":"(if specified, from the 2.73 microversion) by the `List Servers Detailed API"},{"line_number":396,"context_line":"\u003chttps://developer.openstack.org/api-ref/compute/#list-servers-detailed\u003e`_"},{"line_number":397,"context_line":"or"}],"source_content_type":"text/x-c++src","patch_set":11,"id":"dfbec78f_29a7ee51","line":394,"range":{"start_line":394,"start_character":55,"end_line":394,"end_character":68},"updated":"2019-05-10 14:50:15.000000000","message":"nit: ``literal``","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":391,"context_line":"will unlock a server in locked state so additional actions can"},{"line_number":392,"context_line":"be performed on the server by non-admin users."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"You can know whether a server is locked or not and the locked_reason"},{"line_number":395,"context_line":"(if specified, from the 2.73 microversion) by the `List Servers Detailed API"},{"line_number":396,"context_line":"\u003chttps://developer.openstack.org/api-ref/compute/#list-servers-detailed\u003e`_"},{"line_number":397,"context_line":"or"}],"source_content_type":"text/x-c++src","patch_set":11,"id":"dfbec78f_bc5ebd73","line":394,"range":{"start_line":394,"start_character":55,"end_line":394,"end_character":68},"in_reply_to":"dfbec78f_29a7ee51","updated":"2019-05-10 16:50:35.000000000","message":"Done","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"}],"api-ref/source/servers.inc":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":654,"context_line":"**Example List Servers Detailed (2.63)**"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":".. literalinclude:: /../../doc/api_samples/servers/v2.63/servers-details-resp.json"},{"line_number":657,"context_line":"   :language: javascript"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"**Example List Servers Detailed (2.69)**"},{"line_number":660,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_d96671ee","line":657,"updated":"2019-05-06 16:23:45.000000000","message":"Do we want to replace this sample here with the latest sample (2.73)?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":654,"context_line":"**Example List Servers Detailed (2.63)**"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":".. literalinclude:: /../../doc/api_samples/servers/v2.63/servers-details-resp.json"},{"line_number":657,"context_line":"   :language: javascript"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"**Example List Servers Detailed (2.69)**"},{"line_number":660,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_97e9941b","line":657,"in_reply_to":"dfbec78f_11d134fc","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":654,"context_line":"**Example List Servers Detailed (2.63)**"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":".. literalinclude:: /../../doc/api_samples/servers/v2.63/servers-details-resp.json"},{"line_number":657,"context_line":"   :language: javascript"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"**Example List Servers Detailed (2.69)**"},{"line_number":660,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_11d134fc","line":657,"in_reply_to":"dfbec78f_d96671ee","updated":"2019-05-07 14:17:35.000000000","message":"Same response as in the rebuild case - we could update with 2.73, I just don\u0027t want to have more than one here for a single new field (meaning let\u0027s not have both 2.63 and 2.73).","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":778,"context_line":"**Example Show Server Details (2.63)**"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-get-resp.json"},{"line_number":781,"context_line":"   :language: javascript"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"**Example Show Server Details (2.69)**"},{"line_number":784,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_7963c5dd","line":781,"updated":"2019-05-06 16:23:45.000000000","message":"ditto","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":778,"context_line":"**Example Show Server Details (2.63)**"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-get-resp.json"},{"line_number":781,"context_line":"   :language: javascript"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"**Example Show Server Details (2.69)**"},{"line_number":784,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_d7914c9b","line":781,"in_reply_to":"dfbec78f_7963c5dd","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":871,"context_line":"**Example Update Server (2.63)**"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-update-resp.json"},{"line_number":874,"context_line":"   :language: javascript"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"Delete Server"},{"line_number":877,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_9960f9d0","line":874,"updated":"2019-05-06 16:23:45.000000000","message":"ditto","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":871,"context_line":"**Example Update Server (2.63)**"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":".. literalinclude:: ../../doc/api_samples/servers/v2.63/server-update-resp.json"},{"line_number":874,"context_line":"   :language: javascript"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"Delete Server"},{"line_number":877,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"dfbec78f_f78c9080","line":874,"in_reply_to":"dfbec78f_9960f9d0","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"doc/api_samples/os-lock-server/v2.73/lock-server-with-reason.json":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"lock\": {\"locked_reason\": \"I don\u0027t want to work\"}"},{"line_number":3,"context_line":"}"}],"source_content_type":"application/json","patch_set":11,"id":"dfbec78f_c931720d","line":2,"range":{"start_line":2,"start_character":31,"end_line":2,"end_character":51},"updated":"2019-05-10 14:50:15.000000000","message":"nice","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"lock\": {\"locked_reason\": \"I don\u0027t want to work\"}"},{"line_number":3,"context_line":"}"}],"source_content_type":"application/json","patch_set":11,"id":"dfbec78f_5c578159","line":2,"range":{"start_line":2,"start_character":31,"end_line":2,"end_character":51},"in_reply_to":"dfbec78f_c931720d","updated":"2019-05-10 16:50:35.000000000","message":":D","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"}],"doc/api_samples/servers/v2.73/server-action-rebuild-resp.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            }"},{"line_number":47,"context_line":"        ],"},{"line_number":48,"context_line":"        \"locked\": false,"},{"line_number":49,"context_line":"        \"locked_reason\": \"\","},{"line_number":50,"context_line":"        \"metadata\": {"},{"line_number":51,"context_line":"            \"meta_var\": \"meta_val\""},{"line_number":52,"context_line":"        },"}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_7103d074","line":49,"range":{"start_line":49,"start_character":25,"end_line":49,"end_character":27},"updated":"2019-05-07 14:17:35.000000000","message":"This should be null, right? That\u0027s what the spec said if it\u0027s unlocked:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/train/approved/add-locked-reason.html#rest-api-impact","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            }"},{"line_number":47,"context_line":"        ],"},{"line_number":48,"context_line":"        \"locked\": false,"},{"line_number":49,"context_line":"        \"locked_reason\": \"\","},{"line_number":50,"context_line":"        \"metadata\": {"},{"line_number":51,"context_line":"            \"meta_var\": \"meta_val\""},{"line_number":52,"context_line":"        },"}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_ba7cbdeb","line":49,"range":{"start_line":49,"start_character":25,"end_line":49,"end_character":27},"in_reply_to":"dfbec78f_7103d074","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"doc/api_samples/servers/v2.73/server-update-resp.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            }"},{"line_number":45,"context_line":"        ],"},{"line_number":46,"context_line":"        \"locked\": false,"},{"line_number":47,"context_line":"        \"locked_reason\": \"\","},{"line_number":48,"context_line":"        \"metadata\": {"},{"line_number":49,"context_line":"            \"My Server Name\": \"Apache1\""},{"line_number":50,"context_line":"        },"}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_7138b03c","line":47,"range":{"start_line":47,"start_character":25,"end_line":47,"end_character":27},"updated":"2019-05-07 14:17:35.000000000","message":"same","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            }"},{"line_number":45,"context_line":"        ],"},{"line_number":46,"context_line":"        \"locked\": false,"},{"line_number":47,"context_line":"        \"locked_reason\": \"\","},{"line_number":48,"context_line":"        \"metadata\": {"},{"line_number":49,"context_line":"            \"My Server Name\": \"Apache1\""},{"line_number":50,"context_line":"        },"}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_c5099295","line":47,"range":{"start_line":47,"start_character":25,"end_line":47,"end_character":27},"in_reply_to":"dfbec78f_7138b03c","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"doc/notification_samples/common_payloads/InstancePayload.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \"request_id\": \"req-5b6c791d-5709-4f36-8fbe-c3e02869e35d\","},{"line_number":39,"context_line":"        \"action_initiator_user\": \"fake\","},{"line_number":40,"context_line":"        \"action_initiator_project\": \"6f70656e737461636b20342065766572\","},{"line_number":41,"context_line":"        \"locked_reason\": \"\""},{"line_number":42,"context_line":"    },"},{"line_number":43,"context_line":"    \"nova_object.name\":\"InstancePayload\","},{"line_number":44,"context_line":"    \"nova_object.namespace\":\"nova\","}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_b11708a4","line":41,"range":{"start_line":41,"start_character":25,"end_line":41,"end_character":27},"updated":"2019-05-07 14:17:35.000000000","message":"I\u0027d expect this to be null if locked is false.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        \"request_id\": \"req-5b6c791d-5709-4f36-8fbe-c3e02869e35d\","},{"line_number":39,"context_line":"        \"action_initiator_user\": \"fake\","},{"line_number":40,"context_line":"        \"action_initiator_project\": \"6f70656e737461636b20342065766572\","},{"line_number":41,"context_line":"        \"locked_reason\": \"\""},{"line_number":42,"context_line":"    },"},{"line_number":43,"context_line":"    \"nova_object.name\":\"InstancePayload\","},{"line_number":44,"context_line":"    \"nova_object.namespace\":\"nova\","}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_659f8603","line":41,"range":{"start_line":41,"start_character":25,"end_line":41,"end_character":27},"in_reply_to":"dfbec78f_b11708a4","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"doc/notification_samples/instance-lock-with-reason.json":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"$ref\": \"common_payloads/InstanceActionPayload.json#\","},{"line_number":5,"context_line":"        \"nova_object.data\":{"},{"line_number":6,"context_line":"            \"locked\":true,"},{"line_number":7,"context_line":"            \"locked_reason\":\"global warming\""},{"line_number":8,"context_line":"        }"},{"line_number":9,"context_line":"    },"},{"line_number":10,"context_line":"    \"priority\":\"INFO\","}],"source_content_type":"application/json","patch_set":11,"id":"dfbec78f_6909662f","line":7,"range":{"start_line":7,"start_character":29,"end_line":7,"end_character":43},"updated":"2019-05-10 14:50:15.000000000","message":"it\u0027s a conspiracy","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"$ref\": \"common_payloads/InstanceActionPayload.json#\","},{"line_number":5,"context_line":"        \"nova_object.data\":{"},{"line_number":6,"context_line":"            \"locked\":true,"},{"line_number":7,"context_line":"            \"locked_reason\":\"global warming\""},{"line_number":8,"context_line":"        }"},{"line_number":9,"context_line":"    },"},{"line_number":10,"context_line":"    \"priority\":\"INFO\","}],"source_content_type":"application/json","patch_set":11,"id":"dfbec78f_bcd31dd5","line":7,"range":{"start_line":7,"start_character":29,"end_line":7,"end_character":43},"in_reply_to":"dfbec78f_6909662f","updated":"2019-05-10 16:50:35.000000000","message":"is it? ;)","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"}],"doc/notification_samples/instance-lock.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"$ref\": \"common_payloads/InstanceActionPayload.json#\","},{"line_number":5,"context_line":"        \"nova_object.data\":{"},{"line_number":6,"context_line":"            \"locked\":true,"},{"line_number":7,"context_line":"            \"locked_reason\": \"\""},{"line_number":8,"context_line":"        }"},{"line_number":9,"context_line":"    },"},{"line_number":10,"context_line":"    \"priority\":\"INFO\","}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_9179a4fd","line":7,"range":{"start_line":7,"start_character":29,"end_line":7,"end_character":31},"updated":"2019-05-07 14:17:35.000000000","message":"Not sure why this is empty. I wouldn\u0027t expect us to store an entry in the instance.system_metadata if there is no value, and if there is no value, just default to None for backward compat.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"$ref\": \"common_payloads/InstanceActionPayload.json#\","},{"line_number":5,"context_line":"        \"nova_object.data\":{"},{"line_number":6,"context_line":"            \"locked\":true,"},{"line_number":7,"context_line":"            \"locked_reason\": \"\""},{"line_number":8,"context_line":"        }"},{"line_number":9,"context_line":"    },"},{"line_number":10,"context_line":"    \"priority\":\"INFO\","}],"source_content_type":"application/json","patch_set":8,"id":"dfbec78f_c566722a","line":7,"range":{"start_line":7,"start_character":29,"end_line":7,"end_character":31},"in_reply_to":"dfbec78f_9179a4fd","updated":"2019-05-07 18:37:14.000000000","message":"yea I guess its because I was defaulting it to an empty string if it didn\u0027t exist. I will change this to null.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"nova/api/openstack/api_version_request.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"202f01699a23edb9d39db445368559d819b47df5","unresolved":false,"context_lines":[{"line_number":180,"context_line":"             with such ports."},{"line_number":181,"context_line":"    * 2.73 - Adds support for specifying a reason when locking the server and"},{"line_number":182,"context_line":"             exposes this via ``GET /servers/detail``,"},{"line_number":183,"context_line":"             ``GET /servers/{server_id}``, ``PUT /servers/detail`` and"},{"line_number":184,"context_line":"             ``POST /servers/{server_id}/action`` where the action is rebuild."},{"line_number":185,"context_line":"             It also supports \"locked\" as a filter parameter for"},{"line_number":186,"context_line":"             ``GET /servers/detail``."}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_7b95d2e3","line":183,"range":{"start_line":183,"start_character":43,"end_line":183,"end_character":68},"updated":"2019-04-25 07:12:22.000000000","message":"I don\u0027t saw this API","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"86d08978400b735f30101855e59f32ebce001dfc","unresolved":false,"context_lines":[{"line_number":180,"context_line":"             with such ports."},{"line_number":181,"context_line":"    * 2.73 - Adds support for specifying a reason when locking the server and"},{"line_number":182,"context_line":"             exposes this via ``GET /servers/detail``,"},{"line_number":183,"context_line":"             ``GET /servers/{server_id}``, ``PUT /servers/detail`` and"},{"line_number":184,"context_line":"             ``POST /servers/{server_id}/action`` where the action is rebuild."},{"line_number":185,"context_line":"             It also supports \"locked\" as a filter parameter for"},{"line_number":186,"context_line":"             ``GET /servers/detail``."}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_f15c7e7f","line":183,"range":{"start_line":183,"start_character":43,"end_line":183,"end_character":68},"in_reply_to":"ffb9cba7_7b95d2e3","updated":"2019-04-25 12:59:55.000000000","message":"I meant ``PUT servers/{server_id}`` looks like when I copied it went bad.","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":179,"context_line":"             create. Server move operations are not yet supported for servers"},{"line_number":180,"context_line":"             with such ports."},{"line_number":181,"context_line":"    * 2.73 - Adds support for specifying a reason when locking the server and"},{"line_number":182,"context_line":"             exposes this via ``GET /servers/detail``,"},{"line_number":183,"context_line":"             ``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":184,"context_line":"             ``POST /servers/{server_id}/action`` where the action is rebuild."},{"line_number":185,"context_line":"             It also supports \"locked\" as a filter/sort parameter for"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_51832ccd","line":182,"range":{"start_line":182,"start_character":26,"end_line":182,"end_character":29},"updated":"2019-05-07 14:17:35.000000000","message":"via the response from","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":179,"context_line":"             create. Server move operations are not yet supported for servers"},{"line_number":180,"context_line":"             with such ports."},{"line_number":181,"context_line":"    * 2.73 - Adds support for specifying a reason when locking the server and"},{"line_number":182,"context_line":"             exposes this via ``GET /servers/detail``,"},{"line_number":183,"context_line":"             ``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":184,"context_line":"             ``POST /servers/{server_id}/action`` where the action is rebuild."},{"line_number":185,"context_line":"             It also supports \"locked\" as a filter/sort parameter for"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_e507f61b","line":182,"range":{"start_line":182,"start_character":26,"end_line":182,"end_character":29},"in_reply_to":"dfbec78f_51832ccd","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":183,"context_line":"             ``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":184,"context_line":"             ``POST /servers/{server_id}/action`` where the action is rebuild."},{"line_number":185,"context_line":"             It also supports \"locked\" as a filter/sort parameter for"},{"line_number":186,"context_line":"             ``GET /servers/detail``."},{"line_number":187,"context_line":"\"\"\""},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_718670de","line":186,"range":{"start_line":186,"start_character":13,"end_line":186,"end_character":36},"updated":"2019-05-07 14:17:35.000000000","message":"GET /servers too right?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":183,"context_line":"             ``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":184,"context_line":"             ``POST /servers/{server_id}/action`` where the action is rebuild."},{"line_number":185,"context_line":"             It also supports \"locked\" as a filter/sort parameter for"},{"line_number":186,"context_line":"             ``GET /servers/detail``."},{"line_number":187,"context_line":"\"\"\""},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"# The minimum and maximum versions of the API supported"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_e01cc46b","line":186,"range":{"start_line":186,"start_character":13,"end_line":186,"end_character":36},"in_reply_to":"dfbec78f_718670de","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":182,"context_line":"             exposes this via the response from ``GET /servers/detail``,"},{"line_number":183,"context_line":"             ``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":184,"context_line":"             ``POST /servers/{server_id}/action`` where the action is rebuild."},{"line_number":185,"context_line":"             It also supports \"locked\" as a filter/sort parameter for"},{"line_number":186,"context_line":"             ``GET /servers/detail`` and ``GET /servers``."},{"line_number":187,"context_line":"\"\"\""},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_99066b1c","line":185,"range":{"start_line":185,"start_character":30,"end_line":185,"end_character":38},"updated":"2019-05-10 14:50:15.000000000","message":"nit: ``literal``","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"}],"nova/api/openstack/common.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":528,"context_line":"    :param dict search_opts: The search options for a request"},{"line_number":529,"context_line":"    :returns: boolean indicating if locked is being requested or not"},{"line_number":530,"context_line":"    \"\"\""},{"line_number":531,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":532,"context_line":"    try:"},{"line_number":533,"context_line":"        locked \u003d strutils.bool_from_string(locked, True)"},{"line_number":534,"context_line":"    except ValueError as err:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_f1dfc0d3","line":531,"updated":"2019-05-07 14:17:35.000000000","message":"This is going to default to None if locked isn\u0027t in search_opts, right? And since strict\u003dTrue in bool_from_string, ValueError will be raised and the user will get a 400 error, which is wrong if I\u0027m not even specifying the locked query param. This should be more graceful yeah?\n\n(later)\n\nOK I guess this isn\u0027t called if \u0027locked\u0027 isn\u0027t in search_opts. The docstring could use some work then, because it says \"Checks to see if the locked flag is in search_opts\" which is not really true, it expects it to be and converts it from a string to a bool. I know you\u0027re copying is_all_tenants but that method actually checks to see if an all_tenants string was specified before calling bool_from_string.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":528,"context_line":"    :param dict search_opts: The search options for a request"},{"line_number":529,"context_line":"    :returns: boolean indicating if locked is being requested or not"},{"line_number":530,"context_line":"    \"\"\""},{"line_number":531,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":532,"context_line":"    try:"},{"line_number":533,"context_line":"        locked \u003d strutils.bool_from_string(locked, True)"},{"line_number":534,"context_line":"    except ValueError as err:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_805aa827","line":531,"in_reply_to":"dfbec78f_f1dfc0d3","updated":"2019-05-07 18:37:14.000000000","message":"yea I will update the doc-strings to clarify that we won\u0027t come into this method unless locked is in the search_opts.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    \"\"\""},{"line_number":531,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":532,"context_line":"    try:"},{"line_number":533,"context_line":"        locked \u003d strutils.bool_from_string(locked, True)"},{"line_number":534,"context_line":"    except ValueError as err:"},{"line_number":535,"context_line":"        raise exception.InvalidInput(six.text_type(err))"},{"line_number":536,"context_line":"    return locked"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_1156145e","line":533,"range":{"start_line":533,"start_character":51,"end_line":533,"end_character":55},"updated":"2019-05-07 14:17:35.000000000","message":"Use a named kwarg here so it\u0027s obvious what this is doing, otherwise people have to look up the method signature to see what this is for.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":530,"context_line":"    \"\"\""},{"line_number":531,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":532,"context_line":"    try:"},{"line_number":533,"context_line":"        locked \u003d strutils.bool_from_string(locked, True)"},{"line_number":534,"context_line":"    except ValueError as err:"},{"line_number":535,"context_line":"        raise exception.InvalidInput(six.text_type(err))"},{"line_number":536,"context_line":"    return locked"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_40d8307e","line":533,"range":{"start_line":533,"start_character":51,"end_line":533,"end_character":55},"in_reply_to":"dfbec78f_1156145e","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":519,"context_line":"    :param dict search_opts: The search options for a request"},{"line_number":520,"context_line":"    :returns: boolean indicating if locked is being requested or not"},{"line_number":521,"context_line":"    \"\"\""},{"line_number":522,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":523,"context_line":"    try:"},{"line_number":524,"context_line":"        locked \u003d strutils.bool_from_string(locked, strict\u003dTrue)"},{"line_number":525,"context_line":"    except ValueError as err:"},{"line_number":526,"context_line":"        raise exception.InvalidInput(six.text_type(err))"},{"line_number":527,"context_line":"    return locked"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"def supports_multiattach_volume(req):"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_19b6fb3f","line":527,"range":{"start_line":522,"start_character":0,"end_line":527,"end_character":17},"updated":"2019-05-10 14:50:15.000000000","message":"this seems worth factoring out into a helper that can be reused in (at least) is_all_tenants above.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":519,"context_line":"    :param dict search_opts: The search options for a request"},{"line_number":520,"context_line":"    :returns: boolean indicating if locked is being requested or not"},{"line_number":521,"context_line":"    \"\"\""},{"line_number":522,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":523,"context_line":"    try:"},{"line_number":524,"context_line":"        locked \u003d strutils.bool_from_string(locked, strict\u003dTrue)"},{"line_number":525,"context_line":"    except ValueError as err:"},{"line_number":526,"context_line":"        raise exception.InvalidInput(six.text_type(err))"},{"line_number":527,"context_line":"    return locked"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"def supports_multiattach_volume(req):"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_bcba3d6b","line":527,"range":{"start_line":522,"start_character":0,"end_line":527,"end_character":17},"in_reply_to":"dfbec78f_19b6fb3f","updated":"2019-05-10 16:50:35.000000000","message":"\u003e this seems worth factoring out into a helper that can be reused in\n \u003e (at least) is_all_tenants above.\n\nI understand that there is code duplication (I thought of merging it with the above function too), but I wasn\u0027t confident to touch the logic behind \"all_tenants\" because its a legacy thing and honestly I am not even sure what the comment on L510 is because I don\u0027t want that for locked at least. Also for all_tenants even if its not in the search_opts, this function is called (which is why they have that weird logic on L509) while for locked this is called only if its actually in the search_opts. Maybe this can be a cleanup/refactor in a FUP patch.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"82967e27d0620737a34f6889735e63bff3b5d864","unresolved":false,"context_lines":[{"line_number":519,"context_line":"    :param dict search_opts: The search options for a request"},{"line_number":520,"context_line":"    :returns: boolean indicating if locked is being requested or not"},{"line_number":521,"context_line":"    \"\"\""},{"line_number":522,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":523,"context_line":"    try:"},{"line_number":524,"context_line":"        locked \u003d strutils.bool_from_string(locked, strict\u003dTrue)"},{"line_number":525,"context_line":"    except ValueError as err:"},{"line_number":526,"context_line":"        raise exception.InvalidInput(six.text_type(err))"},{"line_number":527,"context_line":"    return locked"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"def supports_multiattach_volume(req):"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_d3483c88","line":527,"range":{"start_line":522,"start_character":0,"end_line":527,"end_character":17},"in_reply_to":"dfbec78f_bcba3d6b","updated":"2019-05-10 19:39:01.000000000","message":"Yeah, no biggie","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08a21f1e15db9c5189266f687efabc959e9cc1ee","unresolved":false,"context_lines":[{"line_number":521,"context_line":"    \"\"\""},{"line_number":522,"context_line":"    locked \u003d search_opts.get(\u0027locked\u0027)"},{"line_number":523,"context_line":"    try:"},{"line_number":524,"context_line":"        locked \u003d strutils.bool_from_string(locked, strict\u003dTrue)"},{"line_number":525,"context_line":"    except ValueError as err:"},{"line_number":526,"context_line":"        raise exception.InvalidInput(six.text_type(err))"},{"line_number":527,"context_line":"    return locked"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfbec78f_27a8698b","line":524,"range":{"start_line":524,"start_character":8,"end_line":524,"end_character":16},"updated":"2019-05-11 21:47:19.000000000","message":"nit: could just return here","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08a21f1e15db9c5189266f687efabc959e9cc1ee","unresolved":false,"context_lines":[{"line_number":523,"context_line":"    try:"},{"line_number":524,"context_line":"        locked \u003d strutils.bool_from_string(locked, strict\u003dTrue)"},{"line_number":525,"context_line":"    except ValueError as err:"},{"line_number":526,"context_line":"        raise exception.InvalidInput(six.text_type(err))"},{"line_number":527,"context_line":"    return locked"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"dfbec78f_e7ad719b","line":526,"range":{"start_line":526,"start_character":24,"end_line":526,"end_character":36},"updated":"2019-05-11 21:47:19.000000000","message":"nit: could document this in the docstring with :raises:","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"}],"nova/api/openstack/compute/lock_server.py":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"1440b453cf5c848eab586080cad845b756136693","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        reason \u003d None"},{"line_number":42,"context_line":"        if (api_version_request.is_supported(req, min_version\u003d\u00272.73\u0027) and"},{"line_number":43,"context_line":"            body[\u0027lock\u0027] is not None):"},{"line_number":44,"context_line":"            reason \u003d body[\u0027lock\u0027].get(\u0027lock_reason\u0027)"},{"line_number":45,"context_line":"        self.compute_api.lock(context, instance, reason\u003dreason)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_eea8f18c","line":44,"range":{"start_line":44,"start_character":41,"end_line":44,"end_character":44},"updated":"2019-04-18 13:05:49.000000000","message":"ed","commit_id":"9ce2718aa1635469d0a4e191e25eccd67b4cbd4c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf976f550c9e454b520b6a41451752b5f2e5fda3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def _lock(self, req, id, body):"},{"line_number":35,"context_line":"        \"\"\"Lock a server instance.\"\"\""},{"line_number":36,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":37,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":38,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027,"},{"line_number":39,"context_line":"                    target\u003d{\u0027user_id\u0027: instance.user_id,"},{"line_number":40,"context_line":"                            \u0027project_id\u0027: instance.project_id})"}],"source_content_type":"text/x-python","patch_set":7,"id":"ffb9cba7_d7c12a82","line":37,"updated":"2019-04-25 14:03:58.000000000","message":"Is instance.system_metadata pre-loaded on this call?\n\nhttps://github.com/openstack/nova/blob/a991980863f056323c1ee9fd6a46dbc4cb899eca/nova/api/openstack/common.py#L466\n\nhttps://github.com/openstack/nova/blob/a991980863f056323c1ee9fd6a46dbc4cb899eca/nova/compute/api.py#L2581\n\nSo looks like yes. I just wanted to make sure we didn\u0027t have to lazy-load the system_metadata when setting the locked_reason (or removing it).","commit_id":"1eee4f5ed7bb1fbc811c338bd95dc4c967d72a1a"}],"nova/api/openstack/compute/rest_api_version_history.rst":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"da54f84902c45b872f83731082c97035d799c339","unresolved":false,"context_lines":[{"line_number":936,"context_line":""},{"line_number":937,"context_line":"API microversion 2.73 adds support for specifying a reason when locking the"},{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT /servers/detail`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports \"locked\" as a filter parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":6,"id":"ffb9cba7_1b84d6b0","line":939,"range":{"start_line":939,"start_character":30,"end_line":939,"end_character":52},"updated":"2019-04-25 07:15:01.000000000","message":"ditto, this seems not exist","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":935,"context_line":"----"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"API microversion 2.73 adds support for specifying a reason when locking the"},{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports \"locked\" as a filter/sort parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dfbec78f_b1c148e7","line":938,"range":{"start_line":938,"start_character":36,"end_line":938,"end_character":39},"updated":"2019-05-07 14:17:35.000000000","message":"via the response from","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":935,"context_line":"----"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"API microversion 2.73 adds support for specifying a reason when locking the"},{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports \"locked\" as a filter/sort parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dfbec78f_40c11080","line":938,"range":{"start_line":938,"start_character":36,"end_line":938,"end_character":39},"in_reply_to":"dfbec78f_b1c148e7","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports \"locked\" as a filter/sort parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dfbec78f_31ad5831","line":941,"updated":"2019-05-07 14:17:35.000000000","message":"GET /servers also","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports \"locked\" as a filter/sort parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dfbec78f_20c65c9c","line":941,"in_reply_to":"dfbec78f_31ad5831","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports \"locked\" as a filter/sort parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":11,"id":"dfbec78f_f9ef671b","line":941,"range":{"start_line":941,"start_character":9,"end_line":941,"end_character":17},"updated":"2019-05-10 14:50:15.000000000","message":"nit: ``literal``","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports \"locked\" as a filter/sort parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":11,"id":"dfbec78f_7c5e0545","line":941,"range":{"start_line":941,"start_character":9,"end_line":941,"end_character":17},"in_reply_to":"dfbec78f_f9ef671b","updated":"2019-05-10 16:50:35.000000000","message":"Done","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08a21f1e15db9c5189266f687efabc959e9cc1ee","unresolved":false,"context_lines":[{"line_number":938,"context_line":"server and exposes this information via ``GET /servers/detail``,"},{"line_number":939,"context_line":"``GET /servers/{server_id}``, ``PUT servers/{server_id}`` and"},{"line_number":940,"context_line":"``POST /servers/{server_id}/action`` where the action is rebuild. It also"},{"line_number":941,"context_line":"supports ``locked`` as a filter/sort parameter for ``GET /servers/detail``."}],"source_content_type":"text/x-rst","patch_set":12,"id":"dfbec78f_a793f95a","line":941,"range":{"start_line":941,"start_character":37,"end_line":941,"end_character":74},"updated":"2019-05-11 21:47:19.000000000","message":"and ``GET /servers``.","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"}],"nova/api/openstack/compute/schemas/lock_server.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 NEC Corporation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_f1a6e053","line":2,"range":{"start_line":1,"start_character":0,"end_line":2,"end_character":22},"updated":"2019-05-07 14:17:35.000000000","message":"nix this","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 NEC Corporation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_00a79851","line":2,"range":{"start_line":1,"start_character":0,"end_line":2,"end_character":22},"in_reply_to":"dfbec78f_f1a6e053","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":20,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":21,"context_line":"            \u0027properties\u0027: {"},{"line_number":22,"context_line":"                \u0027locked_reason\u0027: {"},{"line_number":23,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":24,"context_line":"                },"},{"line_number":25,"context_line":"            },"},{"line_number":26,"context_line":"            \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_99c23933","line":23,"range":{"start_line":23,"start_character":38,"end_line":23,"end_character":52},"updated":"2019-05-06 16:23:45.000000000","message":"Empty string is not allowed?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d8d2e4fcefb6d8f1b6dc026978605cf89bc0f5df","unresolved":false,"context_lines":[{"line_number":20,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":21,"context_line":"            \u0027properties\u0027: {"},{"line_number":22,"context_line":"                \u0027locked_reason\u0027: {"},{"line_number":23,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":24,"context_line":"                },"},{"line_number":25,"context_line":"            },"},{"line_number":26,"context_line":"            \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_1d1cac10","line":23,"range":{"start_line":23,"start_character":38,"end_line":23,"end_character":52},"in_reply_to":"dfbec78f_516d6c02","updated":"2019-05-10 10:13:32.000000000","message":"Fair point.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"78cb05cd3a4b7accb16311331c878dfdeddab22e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":21,"context_line":"            \u0027properties\u0027: {"},{"line_number":22,"context_line":"                \u0027locked_reason\u0027: {"},{"line_number":23,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":24,"context_line":"                },"},{"line_number":25,"context_line":"            },"},{"line_number":26,"context_line":"            \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_f11ca0c2","line":23,"range":{"start_line":23,"start_character":38,"end_line":23,"end_character":52},"in_reply_to":"dfbec78f_99c23933","updated":"2019-05-07 13:24:12.000000000","message":"I didn\u0027t because I wanted to keep consistency with the other reason stuff we have like service disable reason: https://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/api/openstack/compute/schemas/services.py#L62 . But we could allow empty strings although it doesn\u0027t make much sense since if they don\u0027t want to put a reason they could always choose not to specify it.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":20,"context_line":"            \u0027type\u0027: [\u0027object\u0027, \u0027null\u0027],"},{"line_number":21,"context_line":"            \u0027properties\u0027: {"},{"line_number":22,"context_line":"                \u0027locked_reason\u0027: {"},{"line_number":23,"context_line":"                    \u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1, \u0027maxLength\u0027: 255,"},{"line_number":24,"context_line":"                },"},{"line_number":25,"context_line":"            },"},{"line_number":26,"context_line":"            \u0027additionalProperties\u0027: False,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_516d6c02","line":23,"range":{"start_line":23,"start_character":38,"end_line":23,"end_character":52},"in_reply_to":"dfbec78f_f11ca0c2","updated":"2019-05-07 14:17:35.000000000","message":"I\u0027m good with keeping the reason fields consistent and yeah if you don\u0027t have a reason, don\u0027t specify it.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_b95ecf73","line":28,"updated":"2019-05-10 14:50:15.000000000","message":"It looks like it\u0027s legal to request\n\n {\u0027lock\u0027: {}}\n\n...because \u0027locked_reason\u0027 isn\u0027t required. Is that true? I didn\u0027t see tests for it...","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ffcdbe4ff5fba157e2c8ecadc5bfcc2e7a51c33","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_b93d6fde","line":28,"in_reply_to":"dfbec78f_1957db28","updated":"2019-05-10 14:58:07.000000000","message":"A simple negative unit test would tell us if locked: {} is allowed (and shouldn\u0027t be, it should result in a ValidationError).","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c9e72ac79a5f75d6c3f3ba4b28333c5af4113cd9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_6d788dc3","line":28,"in_reply_to":"dfbec78f_6275fc63","updated":"2019-05-10 18:04:13.000000000","message":"Yeah that\u0027s a fair point, but one the other hand it\u0027s on a new microversion so you\u0027re opting into this anyway. I\u0027m personally fine with this being like 2.56 I guess in that you could pass an empty dict and nothing blows up.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"ff8e1da6140e033603d9d47eb4b2a230420b833a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_e8bd4bd8","line":28,"in_reply_to":"dfbec78f_6d788dc3","updated":"2019-05-10 18:22:10.000000000","message":"\u003e Yeah that\u0027s a fair point, but one the other hand it\u0027s on a new\n \u003e microversion so you\u0027re opting into this anyway. I\u0027m personally fine\n \u003e with this being like 2.56 I guess in that you could pass an empty\n \u003e dict and nothing blows up.\n\nyea, it won\u0027t blow up for any of the microversions, even for unlock on 2.73 it will accept empty dict (since we add schema only for lock), so I guess I\u0027ll just respin this with a test for that (btw there are already tests showcasing this like https://github.com/openstack/nova/blob/0cb1544106346664b4a53114458417ea62474b8c/nova/tests/unit/api/openstack/compute/test_pause_server.py#L113 and https://github.com/openstack/nova/blob/0cb1544106346664b4a53114458417ea62474b8c/nova/tests/unit/api/openstack/compute/test_lock_server.py#L139)","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"cca67750c344336d0d037f0e8b68bec7c5cd675f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_bcf55def","line":28,"in_reply_to":"dfbec78f_9c06591c","updated":"2019-05-10 15:10:07.000000000","message":"ah yea I see your point, like Matt says, it was done the same way as for 2.56 (since that was the example we decided on in the spec). So I didn\u0027t think it was a problem to allow {\u0027lock\u0027: {}}.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d9619980e54f0d41515865796347d61ea1135a2","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_9c06591c","line":28,"in_reply_to":"dfbec78f_b93d6fde","updated":"2019-05-10 15:01:12.000000000","message":"My guess is this was just copied from the 2.56 schema for cold migrating with a target host:\n\nhttps://github.com/openstack/nova/blob/0cb1544106346664b4a53114458417ea62474b8c/nova/api/openstack/compute/schemas/migrate_server.py#L23\n\nAnd it looks like that would have the same problem where yo can specify migrate: null or migrate: {}. So I guess the question is if we care to enforce not allowing {}.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c8408a2f7ee4430799fef4cd6e57cccd99bf5e7f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_1957db28","line":28,"in_reply_to":"dfbec78f_b95ecf73","updated":"2019-05-10 14:57:34.000000000","message":"I think you\u0027re probably right, and we should be using oneOf where the options are null or an object with a required locked_reason.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_6275fc63","line":28,"in_reply_to":"dfbec78f_bcf55def","updated":"2019-05-10 16:50:35.000000000","message":"So I added a unit test and everything and indeed we allow empty dict in the body all of the actions which don\u0027t have a schema check (like stop/pause/lock/unlock/migrate/migrate_v256 - and btw I guess for these since we have no schema check we can pretty much pass anything in the body). So if I do this strictness of either having None body type versus dict with locked_reason, this api will become inconsistent. Just want to make sure this is what is agreed. Honestly I don\u0027t want this lock api to be the only one not allowing an empty dict from 2.73.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"82967e27d0620737a34f6889735e63bff3b5d864","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    },"},{"line_number":26,"context_line":"    \u0027required\u0027: [\u0027lock\u0027],"},{"line_number":27,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":28,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_f3322010","line":28,"in_reply_to":"dfbec78f_e8bd4bd8","updated":"2019-05-10 19:39:01.000000000","message":"Perhaps we should remove the ability to use {} for all the APIs in gmann\u0027s cleanup bp...","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"}],"nova/api/openstack/compute/schemas/servers.py":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"15e3ae306d6f1035d3e5dafa34364e2ce8aa1b83","unresolved":false,"context_lines":[{"line_number":541,"context_line":"             \u0027launch_index\u0027, \u0027launched_at\u0027, \u0027locked_by\u0027, \u0027node\u0027, \u0027power_state\u0027,"},{"line_number":542,"context_line":"             \u0027progress\u0027, \u0027project_id\u0027, \u0027ramdisk_id\u0027, \u0027root_device_name\u0027,"},{"line_number":543,"context_line":"             \u0027task_state\u0027, \u0027terminated_at\u0027, \u0027updated_at\u0027, \u0027user_id\u0027, \u0027uuid\u0027,"},{"line_number":544,"context_line":"             \u0027vm_state\u0027, \u0027locked\u0027] +"},{"line_number":545,"context_line":"            SERVER_LIST_IGNORE_SORT_KEY"},{"line_number":546,"context_line":"}"},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_49a28f4d","line":544,"updated":"2019-04-24 19:09:28.000000000","message":"okay so this is the one thing that I don\u0027t understand. While I control \"locked\" key being used for filtering, I am not able to do the same for sorting. How do I control the sort key with the new microversion? The moment I remove it from the ignore list and put it into the valid list, it becomes available for all microversions.","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"0437edd6a51cbe171c576eefb6faee89d2b9ed77","unresolved":false,"context_lines":[{"line_number":541,"context_line":"             \u0027launch_index\u0027, \u0027launched_at\u0027, \u0027locked_by\u0027, \u0027node\u0027, \u0027power_state\u0027,"},{"line_number":542,"context_line":"             \u0027progress\u0027, \u0027project_id\u0027, \u0027ramdisk_id\u0027, \u0027root_device_name\u0027,"},{"line_number":543,"context_line":"             \u0027task_state\u0027, \u0027terminated_at\u0027, \u0027updated_at\u0027, \u0027user_id\u0027, \u0027uuid\u0027,"},{"line_number":544,"context_line":"             \u0027vm_state\u0027, \u0027locked\u0027] +"},{"line_number":545,"context_line":"            SERVER_LIST_IGNORE_SORT_KEY"},{"line_number":546,"context_line":"}"},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_f6279711","line":544,"in_reply_to":"ffb9cba7_3ad43bbd","updated":"2019-04-25 08:18:11.000000000","message":"yea I got the part for filters, for sorting I got confused since I didn\u0027t see any past microversions creating a new list. I though this was a standard list forever for all sort of thing.","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c56f987c1c6ab640e6b821752c0f33238453afd5","unresolved":false,"context_lines":[{"line_number":541,"context_line":"             \u0027launch_index\u0027, \u0027launched_at\u0027, \u0027locked_by\u0027, \u0027node\u0027, \u0027power_state\u0027,"},{"line_number":542,"context_line":"             \u0027progress\u0027, \u0027project_id\u0027, \u0027ramdisk_id\u0027, \u0027root_device_name\u0027,"},{"line_number":543,"context_line":"             \u0027task_state\u0027, \u0027terminated_at\u0027, \u0027updated_at\u0027, \u0027user_id\u0027, \u0027uuid\u0027,"},{"line_number":544,"context_line":"             \u0027vm_state\u0027, \u0027locked\u0027] +"},{"line_number":545,"context_line":"            SERVER_LIST_IGNORE_SORT_KEY"},{"line_number":546,"context_line":"}"},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_d44a9625","line":544,"in_reply_to":"ffb9cba7_49a28f4d","updated":"2019-04-24 19:21:24.000000000","message":"Create a different list and use that in your query_params_v273","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a2cb010c6807e41d0b58fd10686024fdca851d6","unresolved":false,"context_lines":[{"line_number":541,"context_line":"             \u0027launch_index\u0027, \u0027launched_at\u0027, \u0027locked_by\u0027, \u0027node\u0027, \u0027power_state\u0027,"},{"line_number":542,"context_line":"             \u0027progress\u0027, \u0027project_id\u0027, \u0027ramdisk_id\u0027, \u0027root_device_name\u0027,"},{"line_number":543,"context_line":"             \u0027task_state\u0027, \u0027terminated_at\u0027, \u0027updated_at\u0027, \u0027user_id\u0027, \u0027uuid\u0027,"},{"line_number":544,"context_line":"             \u0027vm_state\u0027, \u0027locked\u0027] +"},{"line_number":545,"context_line":"            SERVER_LIST_IGNORE_SORT_KEY"},{"line_number":546,"context_line":"}"},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_3ad43bbd","line":544,"in_reply_to":"ffb9cba7_d44a9625","updated":"2019-04-24 21:17:30.000000000","message":"\u003e Create a different list and use that in your query_params_v273\n\nYup, that\u0027s how the filters work as well. Generally for a new filter schema on a new microversion one will copy the latest microversion of that schema (which would be 2.1 in this case) and then make the change and apply that for the new microversion where the schema is needed in the code.","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a2cb010c6807e41d0b58fd10686024fdca851d6","unresolved":false,"context_lines":[{"line_number":590,"context_line":"        \u0027access_ip_v6\u0027: parameter_types.common_query_regex_param,"},{"line_number":591,"context_line":"        \u0027auto_disk_config\u0027: parameter_types.common_query_regex_param,"},{"line_number":592,"context_line":"        \u0027progress\u0027: parameter_types.common_query_regex_param,"},{"line_number":593,"context_line":"        \u0027sort_key\u0027: multi_params(VALID_SORT_KEYS),"},{"line_number":594,"context_line":"        \u0027sort_dir\u0027: parameter_types.common_query_param,"},{"line_number":595,"context_line":"        \u0027all_tenants\u0027: parameter_types.common_query_param,"},{"line_number":596,"context_line":"        \u0027soft_deleted\u0027: parameter_types.common_query_param,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_fad543b8","line":593,"range":{"start_line":593,"start_character":8,"end_line":593,"end_character":50},"updated":"2019-04-24 21:17:30.000000000","message":"This is what you\u0027d need to copy and update in your query_params_v273 below.","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":553,"context_line":"    \"type\": \"string\","},{"line_number":554,"context_line":"    \"enum\": [\u0027locked\u0027] + list("},{"line_number":555,"context_line":"            set(VALID_SORT_KEYS[\"enum\"]) - set(SERVER_LIST_IGNORE_SORT_KEY)) +"},{"line_number":556,"context_line":"            SERVER_LIST_IGNORE_SORT_KEY_V273"},{"line_number":557,"context_line":"}"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"query_params_v21 \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_39fdffb0","line":556,"updated":"2019-05-10 14:50:15.000000000","message":"This seems like a pretty convoluted way to get the exact same thing as VALID_SORT_KEYS\n\n \u003e\u003e\u003e sorted(servers.VALID_SORT_KEYS[\u0027enum\u0027]) \u003d\u003d sorted(servers.VALID_SORT_KEYS_V273[\u0027enum\u0027])\n True\n\nIs it that VALID_SORT_KEYS wasn\u0027t supposed to include \u0027locked\u0027? Oh well...","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":553,"context_line":"    \"type\": \"string\","},{"line_number":554,"context_line":"    \"enum\": [\u0027locked\u0027] + list("},{"line_number":555,"context_line":"            set(VALID_SORT_KEYS[\"enum\"]) - set(SERVER_LIST_IGNORE_SORT_KEY)) +"},{"line_number":556,"context_line":"            SERVER_LIST_IGNORE_SORT_KEY_V273"},{"line_number":557,"context_line":"}"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"query_params_v21 \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_3f45df43","line":556,"in_reply_to":"dfbec78f_39fdffb0","updated":"2019-05-10 16:50:35.000000000","message":"\u003e This seems like a pretty convoluted way to get the exact same thing\n \u003e as VALID_SORT_KEYS\n \u003e \n \u003e \u003e\u003e\u003e sorted(servers.VALID_SORT_KEYS[\u0027enum\u0027]) \u003d\u003d sorted(servers.VALID_SORT_KEYS_V273[\u0027enum\u0027])\n \u003e True\n \u003e \n \u003e Is it that VALID_SORT_KEYS wasn\u0027t supposed to include \u0027locked\u0027? Oh\n \u003e well...\n\nyea its because VALID_SORT_KEYS shouldn\u0027t have had \"locked\" in the first place under the SERVER_LIST_IGNORE_SORT_KEY list. So 2.73 we have to remove it from the ignored list and add it to the valid list.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"82967e27d0620737a34f6889735e63bff3b5d864","unresolved":false,"context_lines":[{"line_number":553,"context_line":"    \"type\": \"string\","},{"line_number":554,"context_line":"    \"enum\": [\u0027locked\u0027] + list("},{"line_number":555,"context_line":"            set(VALID_SORT_KEYS[\"enum\"]) - set(SERVER_LIST_IGNORE_SORT_KEY)) +"},{"line_number":556,"context_line":"            SERVER_LIST_IGNORE_SORT_KEY_V273"},{"line_number":557,"context_line":"}"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"query_params_v21 \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_b33828ee","line":556,"in_reply_to":"dfbec78f_3f45df43","updated":"2019-05-10 19:39:01.000000000","message":"Okay, but my point is that they wind up identical. I\u0027m thinking that\u0027s worth an explanatory comment at least.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"}],"nova/api/openstack/compute/servers.py":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"3641c2d2be42b77d4c6c86a98f85b60049b10dd2","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self.network_api \u003d network_api.API()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @wsgi.expected_errors((400, 403))"},{"line_number":114,"context_line":"    @validation.query_schema(schema_servers.query_params_v266, \u00272.73\u0027)"},{"line_number":115,"context_line":"    @validation.query_schema(schema_servers.query_params_v266, \u00272.66\u0027, \u00272.72\u0027)"},{"line_number":116,"context_line":"    @validation.query_schema(schema_servers.query_params_v226, \u00272.26\u0027, \u00272.65\u0027)"},{"line_number":117,"context_line":"    @validation.query_schema(schema_servers.query_params_v21, \u00272.1\u0027, \u00272.25\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffb9cba7_2ff966c7","line":114,"range":{"start_line":114,"start_character":58,"end_line":114,"end_character":61},"updated":"2019-04-24 13:14:16.000000000","message":"73","commit_id":"bbb623a93d1cb10c2597591ddb34731d3bbbe4a8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        # further down the stack."},{"line_number":276,"context_line":"        search_opts.pop(\u0027all_tenants\u0027, None)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        if \u0027locked\u0027 in search_opts:"},{"line_number":279,"context_line":"            search_opts[\u0027locked\u0027] \u003d common.is_locked(search_opts)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        elevated \u003d None"},{"line_number":282,"context_line":"        if all_tenants:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_3109d830","line":279,"range":{"start_line":278,"start_character":8,"end_line":279,"end_character":65},"updated":"2019-05-07 14:17:35.000000000","message":"Do we need this if you update _get_server_search_options? I guess so since you need to translate the string to a bool.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        # further down the stack."},{"line_number":276,"context_line":"        search_opts.pop(\u0027all_tenants\u0027, None)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        if \u0027locked\u0027 in search_opts:"},{"line_number":279,"context_line":"            search_opts[\u0027locked\u0027] \u003d common.is_locked(search_opts)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        elevated \u003d None"},{"line_number":282,"context_line":"        if all_tenants:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_401d900d","line":279,"range":{"start_line":278,"start_character":8,"end_line":279,"end_character":65},"in_reply_to":"dfbec78f_3109d830","updated":"2019-05-07 18:37:14.000000000","message":"yea.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        limit, marker \u003d common.get_limit_and_marker(req)"},{"line_number":298,"context_line":"        sort_keys, sort_dirs \u003d common.get_sort_params(req.params)"},{"line_number":299,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.73\u0027):"},{"line_number":300,"context_line":"            sort_keys, sort_dirs \u003d remove_invalid_sort_keys("},{"line_number":301,"context_line":"                context, sort_keys, sort_dirs,"},{"line_number":302,"context_line":"                schema_servers.SERVER_LIST_IGNORE_SORT_KEY_V273,"},{"line_number":303,"context_line":"                (\u0027host\u0027, \u0027node\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_b450560c","line":300,"range":{"start_line":300,"start_character":35,"end_line":300,"end_character":59},"updated":"2019-05-07 14:17:35.000000000","message":"Can we DRY this up? The only difference in these blocks is the blacklist parameter, so can\u0027t we figure that out based on microversion and then just have one call to the remove_invalid_sort_keys method, e.g.:\n\nblacklist \u003d schema_servers.SERVER_LIST_IGNORE_SORT_KEY\nif api_version_request.is_supported(req, min_version\u003d\u00272.73\u0027):\n    blacklist \u003d schema_servers.SERVER_LIST_IGNORE_SORT_KEY_V273\nsort_keys, sort_dirs \u003d remove_invalid_sort_keys(\n    context, sort_keys, sort_dirs, blacklist,\n    (\u0027host\u0027, \u0027node\u0027))","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        limit, marker \u003d common.get_limit_and_marker(req)"},{"line_number":298,"context_line":"        sort_keys, sort_dirs \u003d common.get_sort_params(req.params)"},{"line_number":299,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.73\u0027):"},{"line_number":300,"context_line":"            sort_keys, sort_dirs \u003d remove_invalid_sort_keys("},{"line_number":301,"context_line":"                context, sort_keys, sort_dirs,"},{"line_number":302,"context_line":"                schema_servers.SERVER_LIST_IGNORE_SORT_KEY_V273,"},{"line_number":303,"context_line":"                (\u0027host\u0027, \u0027node\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_e0f044cc","line":300,"range":{"start_line":300,"start_character":35,"end_line":300,"end_character":59},"in_reply_to":"dfbec78f_b450560c","updated":"2019-05-07 18:37:14.000000000","message":"makes sense, too much of code duplication otherwise.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":1222,"context_line":"            password \u003d utils.generate_password()"},{"line_number":1223,"context_line":"        return password"},{"line_number":1224,"context_line":""},{"line_number":1225,"context_line":"    def _get_server_search_options(self, req):"},{"line_number":1226,"context_line":"        \"\"\"Return server search options allowed by non-admin.\"\"\""},{"line_number":1227,"context_line":"        opt_list \u003d (\u0027reservation_id\u0027, \u0027name\u0027, \u0027status\u0027, \u0027image\u0027, \u0027flavor\u0027,"},{"line_number":1228,"context_line":"                    \u0027ip\u0027, \u0027changes-since\u0027, \u0027all_tenants\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_71175053","line":1225,"range":{"start_line":1225,"start_character":8,"end_line":1225,"end_character":34},"updated":"2019-05-07 14:17:35.000000000","message":"I would expect \u0027locked\u0027 to be in here based on microversion.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":1222,"context_line":"            password \u003d utils.generate_password()"},{"line_number":1223,"context_line":"        return password"},{"line_number":1224,"context_line":""},{"line_number":1225,"context_line":"    def _get_server_search_options(self, req):"},{"line_number":1226,"context_line":"        \"\"\"Return server search options allowed by non-admin.\"\"\""},{"line_number":1227,"context_line":"        opt_list \u003d (\u0027reservation_id\u0027, \u0027name\u0027, \u0027status\u0027, \u0027image\u0027, \u0027flavor\u0027,"},{"line_number":1228,"context_line":"                    \u0027ip\u0027, \u0027changes-since\u0027, \u0027all_tenants\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_4079102d","line":1225,"range":{"start_line":1225,"start_character":8,"end_line":1225,"end_character":34},"in_reply_to":"dfbec78f_71175053","updated":"2019-05-07 18:37:14.000000000","message":"yikes can\u0027t believe I didn\u0027t allow this for the normal users.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            if api_version_request.is_supported(req, \u00272.63\u0027):"},{"line_number":312,"context_line":"                expected_attrs.append(\"trusted_certs\")"},{"line_number":313,"context_line":"            if api_version_request.is_supported(req, \u00272.73\u0027):"},{"line_number":314,"context_line":"                expected_attrs.append(\"system_metadata\")"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"            # merge our expected attrs with what the view builder needs for"},{"line_number":317,"context_line":"            # showing details"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_5996b34e","line":314,"range":{"start_line":314,"start_character":39,"end_line":314,"end_character":54},"updated":"2019-05-10 14:50:15.000000000","message":"eh?\n\n[Later] Oh, this is where locked_reason is going.","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":311,"context_line":"            if api_version_request.is_supported(req, \u00272.63\u0027):"},{"line_number":312,"context_line":"                expected_attrs.append(\"trusted_certs\")"},{"line_number":313,"context_line":"            if api_version_request.is_supported(req, \u00272.73\u0027):"},{"line_number":314,"context_line":"                expected_attrs.append(\"system_metadata\")"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"            # merge our expected attrs with what the view builder needs for"},{"line_number":317,"context_line":"            # showing details"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_5f6bf3b5","line":314,"range":{"start_line":314,"start_character":39,"end_line":314,"end_character":54},"in_reply_to":"dfbec78f_5996b34e","updated":"2019-05-10 16:50:35.000000000","message":"yep","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"}],"nova/api/openstack/compute/views/servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    # details about an instance. Add to this list as new things need to be"},{"line_number":61,"context_line":"    # shown."},{"line_number":62,"context_line":"    _show_expected_attrs \u003d [\u0027flavor\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":63,"context_line":"                            \u0027system_metadata\u0027]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self):"},{"line_number":66,"context_line":"        \"\"\"Initialize view builder.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_94843260","line":63,"updated":"2019-05-07 14:17:35.000000000","message":"We shouldn\u0027t need to always join on this, you can control it per microversion, like for GET /servers/detail:\n\nhttps://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/api/openstack/compute/servers.py#L299\n\nAnd system_metadata will always be loaded when doing anything on a single instance so that handles show/update/rebuild:\n\nhttps://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/compute/api.py#L2632","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    # details about an instance. Add to this list as new things need to be"},{"line_number":61,"context_line":"    # shown."},{"line_number":62,"context_line":"    _show_expected_attrs \u003d [\u0027flavor\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":63,"context_line":"                            \u0027system_metadata\u0027]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self):"},{"line_number":66,"context_line":"        \"\"\"Initialize view builder.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_46d8487e","line":63,"in_reply_to":"dfbec78f_94843260","updated":"2019-05-07 18:37:14.000000000","message":"\u003e We shouldn\u0027t need to always join on this, you can control it per\n \u003e microversion, like for GET /servers/detail:\n \u003e \n \u003e https://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/api/openstack/compute/servers.py#L299\n \u003e \n\noh didn\u0027t know this part. thanks!\n\n \u003e And system_metadata will always be loaded when doing anything on a\n \u003e single instance so that handles show/update/rebuild:\n \u003e \n \u003e https://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/compute/api.py#L2632\n\nyea this is true.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        if api_version_request.is_supported(request, min_version\u003d\"2.73\"):"},{"line_number":334,"context_line":"            server[\"server\"][\"locked_reason\"] \u003d (instance.system_metadata.get("},{"line_number":335,"context_line":"                                                 \"locked_reason\", \"\"))"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        if api_version_request.is_supported(request, min_version\u003d\"2.19\"):"},{"line_number":338,"context_line":"            server[\"server\"][\"description\"] \u003d instance.get("}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_b4ecd629","line":335,"range":{"start_line":335,"start_character":64,"end_line":335,"end_character":68},"updated":"2019-05-07 14:17:35.000000000","message":"nix this - the response value should be None (null) if there is no locked_reason. Since you can\u0027t specify an empty string for the locked_reason when locking the server, it\u0027s confusing to show an empty string in the response ever.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        if api_version_request.is_supported(request, min_version\u003d\"2.73\"):"},{"line_number":334,"context_line":"            server[\"server\"][\"locked_reason\"] \u003d (instance.system_metadata.get("},{"line_number":335,"context_line":"                                                 \"locked_reason\", \"\"))"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"        if api_version_request.is_supported(request, min_version\u003d\"2.19\"):"},{"line_number":338,"context_line":"            server[\"server\"][\"description\"] \u003d instance.get("}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_3a23ed07","line":335,"range":{"start_line":335,"start_character":64,"end_line":335,"end_character":68},"in_reply_to":"dfbec78f_b4ecd629","updated":"2019-05-07 18:37:14.000000000","message":"true, my bad.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":4056,"context_line":"            LOG.debug(\u0027Unlocking\u0027, instance\u003dinstance)"},{"line_number":4057,"context_line":"            instance.locked \u003d False"},{"line_number":4058,"context_line":"            instance.locked_by \u003d None"},{"line_number":4059,"context_line":"            if \u0027locked_reason\u0027 in instance.system_metadata:"},{"line_number":4060,"context_line":"                del instance.system_metadata[\u0027locked_reason\u0027]"},{"line_number":4061,"context_line":"            instance.save()"},{"line_number":4062,"context_line":""},{"line_number":4063,"context_line":"        unlock(self, context, instance)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_14dda26f","line":4060,"range":{"start_line":4059,"start_character":12,"end_line":4060,"end_character":61},"updated":"2019-05-07 14:17:35.000000000","message":"nit: this could just be:\n\ninstance.system_metadata.pop(\u0027locked_reason\u0027, None)","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":4056,"context_line":"            LOG.debug(\u0027Unlocking\u0027, instance\u003dinstance)"},{"line_number":4057,"context_line":"            instance.locked \u003d False"},{"line_number":4058,"context_line":"            instance.locked_by \u003d None"},{"line_number":4059,"context_line":"            if \u0027locked_reason\u0027 in instance.system_metadata:"},{"line_number":4060,"context_line":"                del instance.system_metadata[\u0027locked_reason\u0027]"},{"line_number":4061,"context_line":"            instance.save()"},{"line_number":4062,"context_line":""},{"line_number":4063,"context_line":"        unlock(self, context, instance)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_20d17cfc","line":4060,"range":{"start_line":4059,"start_character":12,"end_line":4060,"end_character":61},"in_reply_to":"dfbec78f_14dda26f","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":2024,"context_line":"    Deleted instances will be returned by default, unless there\u0027s a filter that"},{"line_number":2025,"context_line":"    says otherwise."},{"line_number":2026,"context_line":""},{"line_number":2027,"context_line":"    Depending on the name of a filter, matching for that filter is"},{"line_number":2028,"context_line":"    performed using either exact matching or as regular expression"},{"line_number":2029,"context_line":"    matching. Exact matching is applied for the following filters::"},{"line_number":2030,"context_line":""},{"line_number":2031,"context_line":"    |   [\u0027project_id\u0027, \u0027user_id\u0027, \u0027image_ref\u0027,"},{"line_number":2032,"context_line":"    |    \u0027vm_state\u0027, \u0027instance_type_id\u0027, \u0027uuid\u0027,"},{"line_number":2033,"context_line":"    |    \u0027metadata\u0027, \u0027host\u0027, \u0027system_metadata\u0027]"},{"line_number":2034,"context_line":""},{"line_number":2035,"context_line":""},{"line_number":2036,"context_line":"    A third type of filter (also using exact matching), filters"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_94d2f25b","line":2033,"range":{"start_line":2027,"start_character":4,"end_line":2033,"end_character":47},"updated":"2019-05-07 14:17:35.000000000","message":"This should be updated for locked, right?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":2024,"context_line":"    Deleted instances will be returned by default, unless there\u0027s a filter that"},{"line_number":2025,"context_line":"    says otherwise."},{"line_number":2026,"context_line":""},{"line_number":2027,"context_line":"    Depending on the name of a filter, matching for that filter is"},{"line_number":2028,"context_line":"    performed using either exact matching or as regular expression"},{"line_number":2029,"context_line":"    matching. Exact matching is applied for the following filters::"},{"line_number":2030,"context_line":""},{"line_number":2031,"context_line":"    |   [\u0027project_id\u0027, \u0027user_id\u0027, \u0027image_ref\u0027,"},{"line_number":2032,"context_line":"    |    \u0027vm_state\u0027, \u0027instance_type_id\u0027, \u0027uuid\u0027,"},{"line_number":2033,"context_line":"    |    \u0027metadata\u0027, \u0027host\u0027, \u0027system_metadata\u0027]"},{"line_number":2034,"context_line":""},{"line_number":2035,"context_line":""},{"line_number":2036,"context_line":"    A third type of filter (also using exact matching), filters"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_a01a4c7a","line":2033,"range":{"start_line":2027,"start_character":4,"end_line":2033,"end_character":47},"in_reply_to":"dfbec78f_94d2f25b","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":2146,"context_line":"        cleaned \u003d 1 if filters.pop(\u0027cleaned\u0027) else 0"},{"line_number":2147,"context_line":"        query_prefix \u003d query_prefix.filter(models.Instance.cleaned \u003d\u003d cleaned)"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":"    if \u0027locked\u0027 in filters:"},{"line_number":2150,"context_line":"        locked \u003d 1 if filters.pop(\u0027locked\u0027) else 0"},{"line_number":2151,"context_line":"        query_prefix \u003d query_prefix.filter_by(locked\u003dlocked)"},{"line_number":2152,"context_line":""},{"line_number":2153,"context_line":"    if \u0027tags\u0027 in filters:"},{"line_number":2154,"context_line":"        tags \u003d filters.pop(\u0027tags\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_74cf3eb0","line":2151,"range":{"start_line":2149,"start_character":4,"end_line":2151,"end_character":60},"updated":"2019-05-07 14:17:35.000000000","message":"It looks like you\u0027re copying \u0027cleaned\u0027 here but that doesn\u0027t seem right, and you might just be getting lucky in tests because sqlite mght be treating 1 and 0 as true/false, but cleaned is an integer column and locked is a boolean. So really you should be using whatever underlying bool the db engine uses.\n\nI think you could either just include \u0027locked\u0027 in the exact_match_filter_names list below, otherwise you\u0027d need to do something like:\n\nfilter_val \u003d true if locked else false  # from sqla imports\nquery_prefix \u003d query_prefix.filter_by(locked\u003dfilter_val())\n\nNote that filter_by might not work here, you might need to use query_prefix.filter() - see how false() and true() are used elsewhere in here.\n\n_exact_instance_filter might be able to handle an exact match with a boolean, at least for sqlite and mysql, I\u0027m not sure about other databases like postgresql though (I know DB2 stores booleans as 1 and 0 values but we don\u0027t support DB2 anymore).\n\nLooking at other boolean columns on the instances table, shutdown_terminate and auto_disk_config are booleans but not handled in this query/filtering method so I guess we can\u0027t tell what they do (they are just ignored I guess).","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":2146,"context_line":"        cleaned \u003d 1 if filters.pop(\u0027cleaned\u0027) else 0"},{"line_number":2147,"context_line":"        query_prefix \u003d query_prefix.filter(models.Instance.cleaned \u003d\u003d cleaned)"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":"    if \u0027locked\u0027 in filters:"},{"line_number":2150,"context_line":"        locked \u003d 1 if filters.pop(\u0027locked\u0027) else 0"},{"line_number":2151,"context_line":"        query_prefix \u003d query_prefix.filter_by(locked\u003dlocked)"},{"line_number":2152,"context_line":""},{"line_number":2153,"context_line":"    if \u0027tags\u0027 in filters:"},{"line_number":2154,"context_line":"        tags \u003d filters.pop(\u0027tags\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_40d6f0c5","line":2151,"range":{"start_line":2149,"start_character":4,"end_line":2151,"end_character":60},"in_reply_to":"dfbec78f_74cf3eb0","updated":"2019-05-07 18:37:14.000000000","message":"hmm I had tested this with devstack and it worked so I guess I didn\u0027t give it much thought, but maybe for non-mysql it might not work, I\u0027ll just add this to the exact_match_filter_names like you have suggested and see.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"    |   [\u0027project_id\u0027, \u0027user_id\u0027, \u0027image_ref\u0027,"},{"line_number":2038,"context_line":"    |    \u0027vm_state\u0027, \u0027instance_type_id\u0027, \u0027uuid\u0027,"},{"line_number":2039,"context_line":"    |    \u0027metadata\u0027, \u0027host\u0027, \u0027system_metadata\u0027, locked]"},{"line_number":2040,"context_line":""},{"line_number":2041,"context_line":""},{"line_number":2042,"context_line":"    A third type of filter (also using exact matching), filters"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_3972df4a","line":2039,"range":{"start_line":2039,"start_character":48,"end_line":2039,"end_character":54},"updated":"2019-05-10 14:50:15.000000000","message":"\u0027locked\u0027","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"    |   [\u0027project_id\u0027, \u0027user_id\u0027, \u0027image_ref\u0027,"},{"line_number":2038,"context_line":"    |    \u0027vm_state\u0027, \u0027instance_type_id\u0027, \u0027uuid\u0027,"},{"line_number":2039,"context_line":"    |    \u0027metadata\u0027, \u0027host\u0027, \u0027system_metadata\u0027, locked]"},{"line_number":2040,"context_line":""},{"line_number":2041,"context_line":""},{"line_number":2042,"context_line":"    A third type of filter (also using exact matching), filters"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_df9cc3c1","line":2039,"range":{"start_line":2039,"start_character":48,"end_line":2039,"end_character":54},"in_reply_to":"dfbec78f_3972df4a","updated":"2019-05-10 16:50:35.000000000","message":"Done","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08a21f1e15db9c5189266f687efabc959e9cc1ee","unresolved":false,"context_lines":[{"line_number":2450,"context_line":"            query \u003d query.filter(column_attr.in_(value))"},{"line_number":2451,"context_line":"        else:"},{"line_number":2452,"context_line":"            # OK, simple exact match; save for later"},{"line_number":2453,"context_line":"            filter_dict[key] \u003d value"},{"line_number":2454,"context_line":""},{"line_number":2455,"context_line":"    # Apply simple exact matches"},{"line_number":2456,"context_line":"    if filter_dict:"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfbec78f_0791a547","line":2453,"updated":"2019-05-11 21:47:19.000000000","message":"I think I mentioned this before, but the locked boolean filter might be working here, but some RDBMS store booleans as 0 and 1, so technically we maybe should be checking isinstance(value, bool) and then filter using sqlalchemy.true()/false().\n\nHaving said that, mysql [1] and postgresql [2] should be fine with this, although mysql is a bit funky - but based on our usage it should be consistent.\n\nHaving said that, have you tested filtering servers by the locked param in a devstack (mysql) environment? Because the in-tree tests will be using sqlite and for sqlite it\u0027s a 0/1 value [3].\n\n[1] http://www.mysqltutorial.org/mysql-boolean/\n[2] https://www.postgresql.org/docs/9.1/datatype-boolean.html\n[3] https://www.sqlite.org/draft/datatype3.html\n\n(later)\n\nOK I see you said you tested this in devstack [4] so alright let\u0027s go with it. PostgreSQL should be OK as well but if not and there is a PG user out there that hits it and cares about this we can fix it. For other DBs like DB2 that might not work with this, oh well - they aren\u0027t supported upstream anyway.\n\n[4] https://review.opendev.org/#/c/648662/8/nova/db/sqlalchemy/api.py@2151","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"}],"nova/notifications/objects/instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                                                 context.user_id) else None"},{"line_number":135,"context_line":"        self.action_initiator_user \u003d context.user_id"},{"line_number":136,"context_line":"        self.action_initiator_project \u003d context.project_id"},{"line_number":137,"context_line":"        self.locked_reason \u003d instance.system_metadata.get(\"locked_reason\", \"\")"},{"line_number":138,"context_line":"        self.populate_schema(instance\u003dinstance)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_34cb0673","line":137,"range":{"start_line":137,"start_character":75,"end_line":137,"end_character":77},"updated":"2019-05-07 14:17:35.000000000","message":"nix this","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                                                 context.user_id) else None"},{"line_number":135,"context_line":"        self.action_initiator_user \u003d context.user_id"},{"line_number":136,"context_line":"        self.action_initiator_project \u003d context.project_id"},{"line_number":137,"context_line":"        self.locked_reason \u003d instance.system_metadata.get(\"locked_reason\", \"\")"},{"line_number":138,"context_line":"        self.populate_schema(instance\u003dinstance)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_e54856cd","line":137,"range":{"start_line":137,"start_character":75,"end_line":137,"end_character":77},"in_reply_to":"dfbec78f_34cb0673","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"nova/tests/functional/api_sample_tests/test_lock_server.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_post_unlock_server(self):"},{"line_number":70,"context_line":"        # Get api samples to unlock server request."},{"line_number":71,"context_line":"        self.test_post_lock_server_with_reason()"},{"line_number":72,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":73,"context_line":"                                 \u0027unlock-server\u0027, {})"},{"line_number":74,"context_line":"        self.assertEqual(202, response.status_code)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_39622d40","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":48},"updated":"2019-05-06 16:23:45.000000000","message":"Do we call the previous test to make the server locked so that this test can unlock it?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"78cb05cd3a4b7accb16311331c878dfdeddab22e","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_post_unlock_server(self):"},{"line_number":70,"context_line":"        # Get api samples to unlock server request."},{"line_number":71,"context_line":"        self.test_post_lock_server_with_reason()"},{"line_number":72,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":73,"context_line":"                                 \u0027unlock-server\u0027, {})"},{"line_number":74,"context_line":"        self.assertEqual(202, response.status_code)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_11db74ed","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":48},"in_reply_to":"dfbec78f_39622d40","updated":"2019-05-07 13:24:12.000000000","message":"yea you are right, this call is to just test the unlock part of the locked server with a reason so that the api_sample is generated and made sure its the same without a body. I will add a comment here to make it more clear.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    def setUp(self):"},{"line_number":50,"context_line":"        \"\"\"setUp Method for LockServer api samples extension"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        This method creates the server that will be used in each tests"},{"line_number":53,"context_line":"        \"\"\""},{"line_number":54,"context_line":"        super(LockServerSamplesJsonTestV273, self).setUp()"},{"line_number":55,"context_line":"        self.uuid \u003d self._post_server()"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_b9024f6e","line":52,"range":{"start_line":52,"start_character":65,"end_line":52,"end_character":70},"updated":"2019-05-10 14:50:15.000000000","message":"test","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    def setUp(self):"},{"line_number":50,"context_line":"        \"\"\"setUp Method for LockServer api samples extension"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        This method creates the server that will be used in each tests"},{"line_number":53,"context_line":"        \"\"\""},{"line_number":54,"context_line":"        super(LockServerSamplesJsonTestV273, self).setUp()"},{"line_number":55,"context_line":"        self.uuid \u003d self._post_server()"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_5fb0d343","line":52,"range":{"start_line":52,"start_character":65,"end_line":52,"end_character":70},"in_reply_to":"dfbec78f_b9024f6e","updated":"2019-05-10 16:50:35.000000000","message":"Done","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def test_post_lock_server(self):"},{"line_number":58,"context_line":"        # backwards compatibility."},{"line_number":59,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":60,"context_line":"                                 \u0027lock-server\u0027, {})"},{"line_number":61,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_post_lock_server_with_reason(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_d915c39d","line":60,"updated":"2019-05-10 14:50:15.000000000","message":"name kwargs (throughout)","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    def test_post_lock_server(self):"},{"line_number":58,"context_line":"        # backwards compatibility."},{"line_number":59,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":60,"context_line":"                                 \u0027lock-server\u0027, {})"},{"line_number":61,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_post_lock_server_with_reason(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfbec78f_dfd3635f","line":60,"in_reply_to":"dfbec78f_d915c39d","updated":"2019-05-10 16:50:35.000000000","message":"aye, sir!","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08a21f1e15db9c5189266f687efabc959e9cc1ee","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # backwards compatibility."},{"line_number":59,"context_line":"        response \u003d self._do_post(\u0027servers/%s/action\u0027 % self.uuid,"},{"line_number":60,"context_line":"                                 name\u003d\u0027lock-server\u0027, subs\u003d{})"},{"line_number":61,"context_line":"        self.assertEqual(202, response.status_code)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_post_lock_server_with_reason(self):"},{"line_number":64,"context_line":"        # Get api samples to lock server request."}],"source_content_type":"text/x-python","patch_set":12,"id":"dfbec78f_07df650d","line":61,"range":{"start_line":61,"start_character":25,"end_line":61,"end_character":28},"updated":"2019-05-11 21:47:19.000000000","message":"It\u0027s funny this is a 202 (it should be a 204) but oh well, not your problem.","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"}],"nova/tests/functional/api_sample_tests/test_servers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":542,"context_line":"        subs \u003d {\u0027id\u0027: uuid}"},{"line_number":543,"context_line":"        self._verify_response(\u0027server-get-resp\u0027, subs, response, 200)"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_server_rebuild_with_locked_reason(self):"},{"line_number":546,"context_line":"        uuid \u003d uuid \u003d self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":547,"context_line":"        image \u003d fake.get_valid_image_id()"},{"line_number":548,"context_line":"        params \u003d {"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_948af218","line":545,"range":{"start_line":545,"start_character":28,"end_line":545,"end_character":46},"updated":"2019-05-07 14:17:35.000000000","message":"Where does this test actually create a server and then lock it with a reason? Did you mean to use _post_server_and_lock here?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":542,"context_line":"        subs \u003d {\u0027id\u0027: uuid}"},{"line_number":543,"context_line":"        self._verify_response(\u0027server-get-resp\u0027, subs, response, 200)"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_server_rebuild_with_locked_reason(self):"},{"line_number":546,"context_line":"        uuid \u003d uuid \u003d self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":547,"context_line":"        image \u003d fake.get_valid_image_id()"},{"line_number":548,"context_line":"        params \u003d {"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_cb3a0197","line":545,"range":{"start_line":545,"start_character":28,"end_line":545,"end_character":46},"in_reply_to":"dfbec78f_948af218","updated":"2019-05-07 18:37:14.000000000","message":"oh heh yea, I did mean to use _post_server_and_lock_here, but on the other hand it was good to have this test with no reason to see a default reason was been posted as null. So I can keep these two as empty reason locks (I will change the name of the test). Besides on second thoughts since normal user can\u0027t rebuild a locked server, I might have to become admin to do this.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        self._verify_response(\u0027server-get-resp\u0027, subs, response, 200)"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_server_rebuild_with_locked_reason(self):"},{"line_number":546,"context_line":"        uuid \u003d uuid \u003d self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":547,"context_line":"        image \u003d fake.get_valid_image_id()"},{"line_number":548,"context_line":"        params \u003d {"},{"line_number":549,"context_line":"            \u0027uuid\u0027: image,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_79e425ad","line":546,"range":{"start_line":546,"start_character":7,"end_line":546,"end_character":22},"updated":"2019-05-06 16:23:45.000000000","message":"drop one of these :)","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"78cb05cd3a4b7accb16311331c878dfdeddab22e","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        self._verify_response(\u0027server-get-resp\u0027, subs, response, 200)"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_server_rebuild_with_locked_reason(self):"},{"line_number":546,"context_line":"        uuid \u003d uuid \u003d self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":547,"context_line":"        image \u003d fake.get_valid_image_id()"},{"line_number":548,"context_line":"        params \u003d {"},{"line_number":549,"context_line":"            \u0027uuid\u0027: image,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_d1e4fcae","line":546,"range":{"start_line":546,"start_character":7,"end_line":546,"end_character":22},"in_reply_to":"dfbec78f_79e425ad","updated":"2019-05-07 13:24:12.000000000","message":"oops copy paste mishap, nice catch! :)","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        del subs[\u0027uuid\u0027]"},{"line_number":561,"context_line":"        self._verify_response(\u0027server-action-rebuild-resp\u0027, subs, resp, 202)"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    def test_update_server_with_locked_reason(self):"},{"line_number":564,"context_line":"        uuid \u003d self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":565,"context_line":"        subs \u003d {}"},{"line_number":566,"context_line":"        subs[\u0027hostid\u0027] \u003d \u0027[a-f0-9]+\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_f4724e49","line":563,"range":{"start_line":563,"start_character":27,"end_line":563,"end_character":45},"updated":"2019-05-07 14:17:35.000000000","message":"same","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        del subs[\u0027uuid\u0027]"},{"line_number":561,"context_line":"        self._verify_response(\u0027server-action-rebuild-resp\u0027, subs, resp, 202)"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    def test_update_server_with_locked_reason(self):"},{"line_number":564,"context_line":"        uuid \u003d self._post_server(use_common_server_api_samples\u003dFalse)"},{"line_number":565,"context_line":"        subs \u003d {}"},{"line_number":566,"context_line":"        subs[\u0027hostid\u0027] \u003d \u0027[a-f0-9]+\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_eb77c539","line":563,"range":{"start_line":563,"start_character":27,"end_line":563,"end_character":45},"in_reply_to":"dfbec78f_f4724e49","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"nova/tests/functional/notification_sample_tests/test_instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        actions \u003d ["},{"line_number":384,"context_line":"            self._test_power_off_on_server,"},{"line_number":385,"context_line":"            self._test_restore_server,"},{"line_number":386,"context_line":"            self._test_suspend_resume_server,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_f4a7aea6","line":383,"range":{"start_line":383,"start_character":8,"end_line":383,"end_character":15},"updated":"2019-05-07 14:17:35.000000000","message":"You need to add your new test method to this list, right?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d8d2e4fcefb6d8f1b6dc026978605cf89bc0f5df","unresolved":false,"context_lines":[{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        actions \u003d ["},{"line_number":384,"context_line":"            self._test_power_off_on_server,"},{"line_number":385,"context_line":"            self._test_restore_server,"},{"line_number":386,"context_line":"            self._test_suspend_resume_server,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_dd8ff420","line":383,"range":{"start_line":383,"start_character":8,"end_line":383,"end_character":15},"in_reply_to":"dfbec78f_f4a7aea6","updated":"2019-05-10 10:13:32.000000000","message":"\u003e You need to add your new test method to this list, right?\n\nNice catch!","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        self._attach_volume_to_server(server, self.cinder.SWAP_OLD_VOL)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"        actions \u003d ["},{"line_number":384,"context_line":"            self._test_power_off_on_server,"},{"line_number":385,"context_line":"            self._test_restore_server,"},{"line_number":386,"context_line":"            self._test_suspend_resume_server,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_65d1c6cd","line":383,"range":{"start_line":383,"start_character":8,"end_line":383,"end_character":15},"in_reply_to":"dfbec78f_f4a7aea6","updated":"2019-05-07 18:37:14.000000000","message":"oh I should? wasn\u0027t aware, sorry","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"nova/tests/unit/api/openstack/compute/test_lock_server.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      lambda *a, **kw: self.controller)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_lock_unlock(self):"},{"line_number":45,"context_line":"        args_map \u003d {\u0027_lock\u0027: ((), {\"reason\": None})}"},{"line_number":46,"context_line":"        body_map \u003d {\u0027_lock\u0027: {\"lock\": None}}"},{"line_number":47,"context_line":"        self._test_actions([\u0027_lock\u0027, \u0027_unlock\u0027], args_map\u003dargs_map,"},{"line_number":48,"context_line":"            body_map\u003dbody_map)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_34cc6660","line":46,"range":{"start_line":45,"start_character":8,"end_line":46,"end_character":44},"updated":"2019-05-07 14:17:35.000000000","message":"I\u0027m totally confused as to what this is doing. I thought before 2.73 if you specify a reason it shouldn\u0027t work? I guess since we never had schema validation for that API prior to 2.73 it would just be ignored - also note that the field is locked_reason, not \u0027reason\u0027, which proves my point that it\u0027s just ignored.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      lambda *a, **kw: self.controller)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_lock_unlock(self):"},{"line_number":45,"context_line":"        args_map \u003d {\u0027_lock\u0027: ((), {\"reason\": None})}"},{"line_number":46,"context_line":"        body_map \u003d {\u0027_lock\u0027: {\"lock\": None}}"},{"line_number":47,"context_line":"        self._test_actions([\u0027_lock\u0027, \u0027_unlock\u0027], args_map\u003dargs_map,"},{"line_number":48,"context_line":"            body_map\u003dbody_map)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_abff8dff","line":46,"range":{"start_line":45,"start_character":8,"end_line":46,"end_character":44},"in_reply_to":"dfbec78f_34cc6660","updated":"2019-05-07 18:37:14.000000000","message":"yea I was confused with this when I was changing this part. Then realized its because we don\u0027t have schema validation for prior micro-versions. Also because I add https://review.opendev.org/#/c/648662/8/nova/api/openstack/compute/lock_server.py@41 a default None and pass reason down, I also need to add a None here because of the way we do \"test_action\" in https://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/tests/unit/api/openstack/compute/admin_only_action_common.py#L67","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"f0acc8215820b98b5888b368d4fabb0b6ada5021","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      lambda *a, **kw: self.controller)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_lock_unlock(self):"},{"line_number":45,"context_line":"        args_map \u003d {\u0027_lock\u0027: ((), {\"reason\": None})}"},{"line_number":46,"context_line":"        body_map \u003d {\u0027_lock\u0027: {\"lock\": None}}"},{"line_number":47,"context_line":"        self._test_actions([\u0027_lock\u0027, \u0027_unlock\u0027], args_map\u003dargs_map,"},{"line_number":48,"context_line":"            body_map\u003dbody_map)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_e597e88f","line":46,"range":{"start_line":45,"start_character":8,"end_line":46,"end_character":44},"in_reply_to":"dfbec78f_abff8dff","updated":"2019-05-08 11:21:42.000000000","message":"oh btw, the arguments we pass in the body are what we compare for the assert call into the compute_api layer (https://github.com/openstack/nova/blob/ec51f9311cf5de740bd624065684a0bda93c6f2c/nova/tests/unit/api/openstack/compute/admin_only_action_common.py#L94) so this should indeed be reason and not locked_reason.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"7632f51db3b18266f97550543c8e81724809aa76","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      lambda *a, **kw: self.controller)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_lock_unlock(self):"},{"line_number":45,"context_line":"        args_map \u003d {\u0027_lock\u0027: ((), {\"reason\": None})}"},{"line_number":46,"context_line":"        body_map \u003d {\u0027_lock\u0027: {\"lock\": None}}"},{"line_number":47,"context_line":"        self._test_actions([\u0027_lock\u0027, \u0027_unlock\u0027], args_map\u003dargs_map,"},{"line_number":48,"context_line":"            body_map\u003dbody_map)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_a5e6d043","line":46,"range":{"start_line":45,"start_character":8,"end_line":46,"end_character":44},"in_reply_to":"dfbec78f_e597e88f","updated":"2019-05-08 11:26:50.000000000","message":"This is why the CI failed: http://logs.openstack.org/62/648662/9/check/openstack-tox-py27/dd876f5/testr_results.html.gz","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            \u00272.73\u0027)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @mock.patch.object(common, \u0027get_instance\u0027)"},{"line_number":102,"context_line":"    def test_lock_with_reason_V273(self, get_instance_mock):"},{"line_number":103,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":104,"context_line":"            self.req.environ[\u0027nova.context\u0027])"},{"line_number":105,"context_line":"        get_instance_mock.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_34f54684","line":102,"updated":"2019-05-07 14:17:35.000000000","message":"We don\u0027t need a unit test for this - the functional API samples cover it. The unit tests are really only necessary for things we don\u0027t have in the functional test coverage, like negative scenarios, filtering and sorting.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            \u00272.73\u0027)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @mock.patch.object(common, \u0027get_instance\u0027)"},{"line_number":102,"context_line":"    def test_lock_with_reason_V273(self, get_instance_mock):"},{"line_number":103,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":104,"context_line":"            self.req.environ[\u0027nova.context\u0027])"},{"line_number":105,"context_line":"        get_instance_mock.return_value \u003d instance"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_ebe6e544","line":102,"in_reply_to":"dfbec78f_34f54684","updated":"2019-05-07 18:37:14.000000000","message":"I added this test with the intention to test if the functions were called as expected. Basically I added tests in all the modules/call_stack I changed. Since I made some default changes to the way reason is passed to the compute_api layer from here I add a test here.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        exp \u003d self.assertRaises(exception.ValidationError,"},{"line_number":131,"context_line":"            self.controller._lock, self.req, instance.uuid, body\u003dbody)"},{"line_number":132,"context_line":"        self.assertIn(\"256 is not of type \u0027string\u0027\", six.text_type(exp))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class LockServerPolicyEnforcementV21(test.NoDBTestCase):"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_7992e5f8","line":133,"updated":"2019-05-06 16:23:45.000000000","message":"I think lock without providing the locked_reason still works in 2.73 as the parameter is optional. So we should add a test for that case too.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"78cb05cd3a4b7accb16311331c878dfdeddab22e","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        exp \u003d self.assertRaises(exception.ValidationError,"},{"line_number":131,"context_line":"            self.controller._lock, self.req, instance.uuid, body\u003dbody)"},{"line_number":132,"context_line":"        self.assertIn(\"256 is not of type \u0027string\u0027\", six.text_type(exp))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class LockServerPolicyEnforcementV21(test.NoDBTestCase):"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_b1f38873","line":133,"in_reply_to":"dfbec78f_7992e5f8","updated":"2019-05-07 13:24:12.000000000","message":"oh yea you are right, I thought since this test is derived from LockServerTestsV21 it will run those automatically from the above test but with the 2.73 setup?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"82967e27d0620737a34f6889735e63bff3b5d864","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # This will pass since there is no schema validation."},{"line_number":99,"context_line":"        body \u003d {\u0027unlock\u0027: {\u0027blah\u0027: \u0027blah\u0027}}"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        with mock.patch.object(self.compute_api, \u0027unlock\u0027) as mock_lock:"},{"line_number":102,"context_line":"            self.controller._unlock(self.req, instance.uuid, body\u003dbody)"},{"line_number":103,"context_line":"            mock_lock.assert_called_once_with("},{"line_number":104,"context_line":"                self.req.environ[\u0027nova.context\u0027], instance)"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfbec78f_136a54ed","line":101,"range":{"start_line":101,"start_character":62,"end_line":101,"end_character":71},"updated":"2019-05-10 19:39:01.000000000","message":"confusing to call this mock_lock rather than mock_unlock","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"82967e27d0620737a34f6889735e63bff3b5d864","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        with mock.patch.object(self.compute_api, \u0027lock\u0027) as mock_lock:"},{"line_number":115,"context_line":"            self.controller._lock(self.req, instance.uuid, body\u003dbody)"},{"line_number":116,"context_line":"            mock_lock.assert_called_once_with("},{"line_number":117,"context_line":"                self.req.environ[\u0027nova.context\u0027], instance, reason\u003dNone)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class LockServerTestsV273(LockServerTestsV21):"}],"source_content_type":"text/x-python","patch_set":12,"id":"dfbec78f_737870c3","line":117,"range":{"start_line":117,"start_character":60,"end_line":117,"end_character":71},"updated":"2019-05-10 19:39:01.000000000","message":"✔","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"}],"nova/tests/unit/api/openstack/compute/test_serversV21.py":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"c7276e53a8ef01053b7ae77c8b1bf10c0b44cf04","unresolved":false,"context_lines":[{"line_number":2605,"context_line":"            search_opts\u003dsearch,"},{"line_number":2606,"context_line":"            sort_dirs\u003d[\u0027desc\u0027], sort_keys\u003d[\u0027created_at\u0027],"},{"line_number":2607,"context_line":"            cell_down_support\u003dFalse, all_tenants\u003dFalse)"},{"line_number":2608,"context_line":""},{"line_number":2609,"context_line":"    def test_get_servers_with_locked_sort_key(self):"},{"line_number":2610,"context_line":"        def fake_get_all(context, search_opts\u003dNone,"},{"line_number":2611,"context_line":"                         limit\u003dNone, marker\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffb9cba7_691af37d","line":2608,"updated":"2019-04-24 19:11:14.000000000","message":"maybe add test cases for \"no value specified\" and \"invalid value specified\" as well.","commit_id":"0f20e3c4114a6c0cbd7458630c34c1eec495b5ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":511,"context_line":"        self.mock_get.assert_called_once_with("},{"line_number":512,"context_line":"            req.environ[\u0027nova.context\u0027], FAKE_UUID,"},{"line_number":513,"context_line":"            expected_attrs\u003d[\u0027flavor\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":514,"context_line":"                            \u0027numa_topology\u0027, \u0027system_metadata\u0027],"},{"line_number":515,"context_line":"            cell_down_support\u003dFalse)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test_get_server_with_id_image_ref_by_id(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_f4432eae","line":514,"range":{"start_line":514,"start_character":45,"end_line":514,"end_character":62},"updated":"2019-05-07 14:17:35.000000000","message":"Shouldn\u0027t need these changes if you didn\u0027t modify the view builder as suggested.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":511,"context_line":"        self.mock_get.assert_called_once_with("},{"line_number":512,"context_line":"            req.environ[\u0027nova.context\u0027], FAKE_UUID,"},{"line_number":513,"context_line":"            expected_attrs\u003d[\u0027flavor\u0027, \u0027info_cache\u0027, \u0027metadata\u0027,"},{"line_number":514,"context_line":"                            \u0027numa_topology\u0027, \u0027system_metadata\u0027],"},{"line_number":515,"context_line":"            cell_down_support\u003dFalse)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test_get_server_with_id_image_ref_by_id(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_865de0ea","line":514,"range":{"start_line":514,"start_character":45,"end_line":514,"end_character":62},"in_reply_to":"dfbec78f_f4432eae","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3bfc769a3845498ffd0cd699424851ab3324eaaf","unresolved":false,"context_lines":[{"line_number":933,"context_line":"            cell_down_support\u003dFalse, all_tenants\u003dFalse)"},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"    def test_get_servers_ignore_locked_sort_key(self):"},{"line_number":936,"context_line":"        req \u003d self.req(\u0027/fake/servers?sort_key\u003dlocked\u0026sort_dir\u003dasc\u0027)"},{"line_number":937,"context_line":"        self.controller.detail(req)"},{"line_number":938,"context_line":"        self.mock_get_all.assert_called_once_with("},{"line_number":939,"context_line":"            mock.ANY, search_opts\u003dmock.ANY, limit\u003dmock.ANY, marker\u003dmock.ANY,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_596841f4","line":936,"updated":"2019-05-06 16:23:45.000000000","message":"So the param is ignored as this requests run with \u003c 2.73","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"78cb05cd3a4b7accb16311331c878dfdeddab22e","unresolved":false,"context_lines":[{"line_number":933,"context_line":"            cell_down_support\u003dFalse, all_tenants\u003dFalse)"},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"    def test_get_servers_ignore_locked_sort_key(self):"},{"line_number":936,"context_line":"        req \u003d self.req(\u0027/fake/servers?sort_key\u003dlocked\u0026sort_dir\u003dasc\u0027)"},{"line_number":937,"context_line":"        self.controller.detail(req)"},{"line_number":938,"context_line":"        self.mock_get_all.assert_called_once_with("},{"line_number":939,"context_line":"            mock.ANY, search_opts\u003dmock.ANY, limit\u003dmock.ANY, marker\u003dmock.ANY,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_91be8463","line":936,"in_reply_to":"dfbec78f_596841f4","updated":"2019-05-07 13:24:12.000000000","message":"correct.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":933,"context_line":"            cell_down_support\u003dFalse, all_tenants\u003dFalse)"},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"    def test_get_servers_ignore_locked_sort_key(self):"},{"line_number":936,"context_line":"        req \u003d self.req(\u0027/fake/servers?sort_key\u003dlocked\u0026sort_dir\u003dasc\u0027)"},{"line_number":937,"context_line":"        self.controller.detail(req)"},{"line_number":938,"context_line":"        self.mock_get_all.assert_called_once_with("},{"line_number":939,"context_line":"            mock.ANY, search_opts\u003dmock.ANY, limit\u003dmock.ANY, marker\u003dmock.ANY,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_b417f6a3","line":936,"in_reply_to":"dfbec78f_91be8463","updated":"2019-05-07 14:17:35.000000000","message":"Add a comment to the test so people don\u0027t have to guess.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":933,"context_line":"            cell_down_support\u003dFalse, all_tenants\u003dFalse)"},{"line_number":934,"context_line":""},{"line_number":935,"context_line":"    def test_get_servers_ignore_locked_sort_key(self):"},{"line_number":936,"context_line":"        req \u003d self.req(\u0027/fake/servers?sort_key\u003dlocked\u0026sort_dir\u003dasc\u0027)"},{"line_number":937,"context_line":"        self.controller.detail(req)"},{"line_number":938,"context_line":"        self.mock_get_all.assert_called_once_with("},{"line_number":939,"context_line":"            mock.ANY, search_opts\u003dmock.ANY, limit\u003dmock.ANY, marker\u003dmock.ANY,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_8b38893d","line":936,"in_reply_to":"dfbec78f_b417f6a3","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":1002,"context_line":"            sort_dirs\u003d[\u0027desc\u0027], sort_keys\u003d[\u0027created_at\u0027],"},{"line_number":1003,"context_line":"            cell_down_support\u003dFalse, all_tenants\u003dFalse)"},{"line_number":1004,"context_line":""},{"line_number":1005,"context_line":"    def test_get_servers_with_locked_filter(self):"},{"line_number":1006,"context_line":"        def fake_get_all(context, search_opts\u003dNone,"},{"line_number":1007,"context_line":"                         limit\u003dNone, marker\u003dNone,"},{"line_number":1008,"context_line":"                         expected_attrs\u003dNone, sort_keys\u003dNone, sort_dirs\u003dNone,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_3468e61f","line":1005,"range":{"start_line":1005,"start_character":8,"end_line":1005,"end_character":43},"updated":"2019-05-07 14:17:35.000000000","message":"Add a comment to this test - it\u0027s testing that before 2.73, locked as a query param is just ignored, right?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":1002,"context_line":"            sort_dirs\u003d[\u0027desc\u0027], sort_keys\u003d[\u0027created_at\u0027],"},{"line_number":1003,"context_line":"            cell_down_support\u003dFalse, all_tenants\u003dFalse)"},{"line_number":1004,"context_line":""},{"line_number":1005,"context_line":"    def test_get_servers_with_locked_filter(self):"},{"line_number":1006,"context_line":"        def fake_get_all(context, search_opts\u003dNone,"},{"line_number":1007,"context_line":"                         limit\u003dNone, marker\u003dNone,"},{"line_number":1008,"context_line":"                         expected_attrs\u003dNone, sort_keys\u003dNone, sort_dirs\u003dNone,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_2b3f1d26","line":1005,"range":{"start_line":1005,"start_character":8,"end_line":1005,"end_character":43},"in_reply_to":"dfbec78f_3468e61f","updated":"2019-05-07 18:37:14.000000000","message":"yes. done.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":2576,"context_line":"                                       use_admin_context\u003duse_admin_context,"},{"line_number":2577,"context_line":"                                       version\u003dself.wsgi_api_version)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"    def test_show_server_with_locked_reason_key(self):"},{"line_number":2580,"context_line":"        req \u003d self.req(\u0027/fake/servers/%s\u0027 % FAKE_UUID)"},{"line_number":2581,"context_line":"        servers \u003d self.controller.show(req, FAKE_UUID)"},{"line_number":2582,"context_line":"        self.assertEqual(\"\", servers[\u0027server\u0027][\u0027locked_reason\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_1456025e","line":2579,"updated":"2019-05-07 14:17:35.000000000","message":"The functional tests already cover this. We should just have negative/sorting/filtering tests for this unit test class IMO.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":2576,"context_line":"                                       use_admin_context\u003duse_admin_context,"},{"line_number":2577,"context_line":"                                       version\u003dself.wsgi_api_version)"},{"line_number":2578,"context_line":""},{"line_number":2579,"context_line":"    def test_show_server_with_locked_reason_key(self):"},{"line_number":2580,"context_line":"        req \u003d self.req(\u0027/fake/servers/%s\u0027 % FAKE_UUID)"},{"line_number":2581,"context_line":"        servers \u003d self.controller.show(req, FAKE_UUID)"},{"line_number":2582,"context_line":"        self.assertEqual(\"\", servers[\u0027server\u0027][\u0027locked_reason\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_ebc5853d","line":2579,"in_reply_to":"dfbec78f_1456025e","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":2619,"context_line":"        self.mock_get_all.side_effect \u003d fake_get_all"},{"line_number":2620,"context_line":""},{"line_number":2621,"context_line":"        req \u003d self.req(\u0027/fake/servers?locked\u003dprice\u0027)"},{"line_number":2622,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"},{"line_number":2623,"context_line":"                          self.controller.index, req)"},{"line_number":2624,"context_line":""},{"line_number":2625,"context_line":"    def test_get_servers_with_locked_filter_empty_value(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_14db62ed","line":2622,"updated":"2019-05-07 14:17:35.000000000","message":"Assert the failure is what you expect, i.e.:\n\nex \u003d self.assertRaises(webob.exc.HTTPBadRequest, ...)\nself.assertIn(\u0027something\u0027, six.text_type(ex))","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":2619,"context_line":"        self.mock_get_all.side_effect \u003d fake_get_all"},{"line_number":2620,"context_line":""},{"line_number":2621,"context_line":"        req \u003d self.req(\u0027/fake/servers?locked\u003dprice\u0027)"},{"line_number":2622,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"},{"line_number":2623,"context_line":"                          self.controller.index, req)"},{"line_number":2624,"context_line":""},{"line_number":2625,"context_line":"    def test_get_servers_with_locked_filter_empty_value(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_e6637cdb","line":2622,"in_reply_to":"dfbec78f_14db62ed","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":2635,"context_line":"        self.mock_get_all.side_effect \u003d fake_get_all"},{"line_number":2636,"context_line":""},{"line_number":2637,"context_line":"        req \u003d self.req(\u0027/fake/servers?locked\u003d\u0027)"},{"line_number":2638,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"},{"line_number":2639,"context_line":"                          self.controller.index, req)"},{"line_number":2640,"context_line":""},{"line_number":2641,"context_line":"    def test_get_servers_with_locked_sort_key(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_d4e4eaae","line":2638,"updated":"2019-05-07 14:17:35.000000000","message":"same","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":2635,"context_line":"        self.mock_get_all.side_effect \u003d fake_get_all"},{"line_number":2636,"context_line":""},{"line_number":2637,"context_line":"        req \u003d self.req(\u0027/fake/servers?locked\u003d\u0027)"},{"line_number":2638,"context_line":"        self.assertRaises(webob.exc.HTTPBadRequest,"},{"line_number":2639,"context_line":"                          self.controller.index, req)"},{"line_number":2640,"context_line":""},{"line_number":2641,"context_line":"    def test_get_servers_with_locked_sort_key(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_4665a8e0","line":2638,"in_reply_to":"dfbec78f_d4e4eaae","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08a21f1e15db9c5189266f687efabc959e9cc1ee","unresolved":false,"context_lines":[{"line_number":2551,"context_line":"    \"\"\"Server Controller test for microversion 2.73"},{"line_number":2552,"context_line":""},{"line_number":2553,"context_line":"    The intent here is simply to verify that when showing server details"},{"line_number":2554,"context_line":"    after microversion 2.73 the response will also have the locked_reason"},{"line_number":2555,"context_line":"    key for the servers."},{"line_number":2556,"context_line":"    \"\"\""},{"line_number":2557,"context_line":"    wsgi_api_version \u003d \u00272.73\u0027"},{"line_number":2558,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"dfbec78f_47d8fd1c","line":2555,"range":{"start_line":2554,"start_character":28,"end_line":2555,"end_character":24},"updated":"2019-05-11 21:47:19.000000000","message":"nit: this isn\u0027t really the intent of these unit tests, the functional API samples tests are already verifying this; these unit tests are testing the sorting/filtering behavior with the locked key.","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"                                                {\u0027host\u0027: \u0027host1\u0027})"},{"line_number":2219,"context_line":"        self._assertEqualListsOfInstances([instance], result)"},{"line_number":2220,"context_line":""},{"line_number":2221,"context_line":"    def test_instance_get_all_by_filters_locked_key(self):"},{"line_number":2222,"context_line":"        instance \u003d self.create_instance_with_args(locked\u003dTrue)"},{"line_number":2223,"context_line":"        self.create_instance_with_args(locked\u003dFalse)"},{"line_number":2224,"context_line":"        result \u003d db.instance_get_all_by_filters(self.ctxt,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_74edfe89","line":2221,"updated":"2019-05-07 14:17:35.000000000","message":"Would be good to have a negative wrinkle on this, i.e. filter by locked\u003dFalse and assert you get nothing back.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"                                                {\u0027host\u0027: \u0027host1\u0027})"},{"line_number":2219,"context_line":"        self._assertEqualListsOfInstances([instance], result)"},{"line_number":2220,"context_line":""},{"line_number":2221,"context_line":"    def test_instance_get_all_by_filters_locked_key(self):"},{"line_number":2222,"context_line":"        instance \u003d self.create_instance_with_args(locked\u003dTrue)"},{"line_number":2223,"context_line":"        self.create_instance_with_args(locked\u003dFalse)"},{"line_number":2224,"context_line":"        result \u003d db.instance_get_all_by_filters(self.ctxt,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_807068de","line":2221,"in_reply_to":"dfbec78f_74edfe89","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"nova/tests/unit/objects/test_instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":1787,"context_line":"            columns_to_join\u003d[\u0027metadata\u0027])"},{"line_number":1788,"context_line":""},{"line_number":1789,"context_line":"    @mock.patch.object(db, \u0027instance_get_all_by_filters\u0027)"},{"line_number":1790,"context_line":"    def test_get_all_by_filters_works_for_locked(self, mock_get_all):"},{"line_number":1791,"context_line":"        fakes \u003d [self.fake_instance(1),"},{"line_number":1792,"context_line":"                 self.fake_instance(2, updates\u003d{\u0027locked\u0027: True})]"},{"line_number":1793,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_94be7263","line":1790,"updated":"2019-05-07 14:17:35.000000000","message":"I\u0027m not sure why we need this test. The filters are passed through to the DB API and nothing changes in the InstanceList object in this regard. Are you just making sure InstanceList.get_by_filters doesn\u0027t filter the filters? Seems unnecessary to me.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":1787,"context_line":"            columns_to_join\u003d[\u0027metadata\u0027])"},{"line_number":1788,"context_line":""},{"line_number":1789,"context_line":"    @mock.patch.object(db, \u0027instance_get_all_by_filters\u0027)"},{"line_number":1790,"context_line":"    def test_get_all_by_filters_works_for_locked(self, mock_get_all):"},{"line_number":1791,"context_line":"        fakes \u003d [self.fake_instance(1),"},{"line_number":1792,"context_line":"                 self.fake_instance(2, updates\u003d{\u0027locked\u0027: True})]"},{"line_number":1793,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfbec78f_eb6345db","line":1790,"in_reply_to":"dfbec78f_94be7263","updated":"2019-05-07 18:37:14.000000000","message":"Yea was just making sure it gets passed down if we pass the locked filter. But since you have asked me to remove unit tests which are unnecessary I will just remove this since I don\u0027t directly touch this code path anyways.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"}],"releasenotes/notes/bp-add-locked-reason-fb757750f7f077ef.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":4,"context_line":"    ``POST /servers/{server_id}/action`` request. It enables the user to"},{"line_number":5,"context_line":"    specify a reason when locking a server. This information will be"},{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_b4c136e7","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":48},"updated":"2019-05-07 14:17:35.000000000","message":"Which one? There are lots of APIs like that - you should mention it\u0027s for the lock action.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":4,"context_line":"    ``POST /servers/{server_id}/action`` request. It enables the user to"},{"line_number":5,"context_line":"    specify a reason when locking a server. This information will be"},{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_ebab451a","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":48},"in_reply_to":"dfbec78f_b4c136e7","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":4,"context_line":"    ``POST /servers/{server_id}/action`` request. It enables the user to"},{"line_number":5,"context_line":"    specify a reason when locking a server. This information will be"},{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_34ad4631","line":6,"range":{"start_line":6,"start_character":12,"end_line":6,"end_character":19},"updated":"2019-05-07 14:17:35.000000000","message":"through the response of the following APIs (and then make these APIs a bulleted list rather than a wall of text).","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":4,"context_line":"    ``POST /servers/{server_id}/action`` request. It enables the user to"},{"line_number":5,"context_line":"    specify a reason when locking a server. This information will be"},{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_6b6d1503","line":6,"range":{"start_line":6,"start_character":12,"end_line":6,"end_character":19},"in_reply_to":"dfbec78f_34ad4631","updated":"2019-05-07 18:37:14.000000000","message":"yes sir! sorry about this mess.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    specify a reason when locking a server. This information will be"},{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_9463d21a","line":8,"range":{"start_line":8,"start_character":37,"end_line":8,"end_character":46},"updated":"2019-05-07 14:17:35.000000000","message":"In addition,","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    specify a reason when locking a server. This information will be"},{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_0b7c99b3","line":8,"range":{"start_line":8,"start_character":37,"end_line":8,"end_character":46},"in_reply_to":"dfbec78f_9463d21a","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_b4661629","line":9,"range":{"start_line":9,"start_character":41,"end_line":9,"end_character":64},"updated":"2019-05-07 14:17:35.000000000","message":"And GET /servers right?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    exposed through ``GET servers/{server_id}``, ``GET /servers/detail``,"},{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_cb4f6190","line":9,"range":{"start_line":9,"start_character":41,"end_line":9,"end_character":64},"in_reply_to":"dfbec78f_b4661629","updated":"2019-05-07 18:37:14.000000000","message":"yes.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_1477e2d6","line":10,"range":{"start_line":10,"start_character":8,"end_line":10,"end_character":35},"updated":"2019-05-07 14:17:35.000000000","message":"filters servers based on their locked value.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_a62ee440","line":10,"range":{"start_line":10,"start_character":8,"end_line":10,"end_character":35},"in_reply_to":"dfbec78f_1477e2d6","updated":"2019-05-07 18:37:14.000000000","message":"Done","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_f4548e23","line":11,"range":{"start_line":11,"start_character":4,"end_line":11,"end_character":17},"updated":"2019-05-07 14:17:35.000000000","message":"Would be better to say the specific notifications, ``instance.lock`` and ``instance.unlock``.\n\nTechnically the locked_reason is going to be in the InstanceActionPayload for anything that uses that, but it\u0027s probably fine to just say it\u0027s in the lock/unlock action notifications if you don\u0027t want to enumerate all of the notification payloads that were updated.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2ed85c13a32305d9ca954940ead1fd45474ed970","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_d4806a8e","line":11,"range":{"start_line":11,"start_character":26,"end_line":11,"end_character":30},"updated":"2019-05-07 14:17:35.000000000","message":"lock and unlock right?","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"23a9bed3604ae67ba9bb1033d74be9bd259d3250","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    and ``PUT servers/{server_id}``. Note that \"locked\" will be supported"},{"line_number":9,"context_line":"    as a valid filter/sort parameter for ``GET /servers/detail`` so that users"},{"line_number":10,"context_line":"    can filter out locked instances. Also the instance action versioned"},{"line_number":11,"context_line":"    notifications for the lock action now contain the ``locked_reason`` field."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfbec78f_ab31cd0d","line":11,"range":{"start_line":11,"start_character":4,"end_line":11,"end_character":17},"in_reply_to":"dfbec78f_f4548e23","updated":"2019-05-07 18:37:14.000000000","message":"yea too many of them on the high level, I went with only lock because that has the reason, unlock basically deletes it and has no specific direct change in payload since the object data is not included: https://github.com/openstack/nova/blob/master/doc/notification_samples/instance-unlock.json. However yea it also uses the InstanceActionPayload.","commit_id":"11044ef114893f1687e1366749f61f93e2818e7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2c2ce7b39220123d2fe0ab349d5c36e577e6c200","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":4,"context_line":"    ``POST /servers/{server_id}/action`` request where the action is lock."},{"line_number":5,"context_line":"    It enables the user to specify a reason when locking a server. This"},{"line_number":6,"context_line":"    information will be exposed through the response of the following APIs:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dfbec78f_4e2e1144","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":4},"updated":"2019-05-08 14:42:08.000000000","message":"I think the release notes build might be failing because this needs to be - | with a new line, so:\n\nfeatures:\n  - |\n    Added a ....\n\nhttps://docs.openstack.org/reno/latest/user/usage.html","commit_id":"9dfb3e16db0244b98e10bb8e680c5a097b36a289"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"34ba8d1d7d9c9ee5bd4b56dfee6d445ff49d56a7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":4,"context_line":"    ``POST /servers/{server_id}/action`` request where the action is lock."},{"line_number":5,"context_line":"    It enables the user to specify a reason when locking a server. This"},{"line_number":6,"context_line":"    information will be exposed through the response of the following APIs:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dfbec78f_991c556b","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":4},"in_reply_to":"dfbec78f_4e2e1144","updated":"2019-05-08 15:14:33.000000000","message":"oh huh, strange it didn\u0027t break in my previous run..","commit_id":"9dfb3e16db0244b98e10bb8e680c5a097b36a289"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"603206cd2d9ef0120f778ad454ec1de64194f92f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":4,"context_line":"    ``POST /servers/{server_id}/action`` request where the action is lock."},{"line_number":5,"context_line":"    It enables the user to specify a reason when locking a server. This"},{"line_number":6,"context_line":"    information will be exposed through the response of the following APIs:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dfbec78f_a831c0a4","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":4},"in_reply_to":"dfbec78f_991c556b","updated":"2019-05-08 17:06:11.000000000","message":"oh just checked the docs, its because I added the list thingy - so new line stuff.","commit_id":"9dfb3e16db0244b98e10bb8e680c5a097b36a289"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    - ``GET servers/{server_id}``"},{"line_number":10,"context_line":"    - ``GET /servers/detail``"},{"line_number":11,"context_line":"    - ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":12,"context_line":"    - ``PUT servers/{server_id}``"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    In addition, \"locked\" will be supported as a valid filter/sort parameter"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"dfbec78f_79cff755","line":11,"range":{"start_line":11,"start_character":43,"end_line":11,"end_character":44},"updated":"2019-05-10 14:50:15.000000000","message":"nit: extra space","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    - ``GET servers/{server_id}``"},{"line_number":10,"context_line":"    - ``GET /servers/detail``"},{"line_number":11,"context_line":"    - ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":12,"context_line":"    - ``PUT servers/{server_id}``"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    In addition, \"locked\" will be supported as a valid filter/sort parameter"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"dfbec78f_ff950734","line":11,"range":{"start_line":11,"start_character":43,"end_line":11,"end_character":44},"in_reply_to":"dfbec78f_79cff755","updated":"2019-05-10 16:50:35.000000000","message":"good eye","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9ab44e15cc8d4d5f2db59b508f03a27e378398cd","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    - ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":12,"context_line":"    - ``PUT servers/{server_id}``"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    In addition, \"locked\" will be supported as a valid filter/sort parameter"},{"line_number":15,"context_line":"    for ``GET /servers/detail`` and ``GET /servers`` so that users can filter"},{"line_number":16,"context_line":"    servers based on their locked value. Also the instance action versioned"},{"line_number":17,"context_line":"    notifications for the lock/unlock actions now contain the ``locked_reason``"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"dfbec78f_19d83b1c","line":14,"range":{"start_line":14,"start_character":17,"end_line":14,"end_character":25},"updated":"2019-05-10 14:50:15.000000000","message":"nit, ``literal``","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"50ff7eb735686434fab97d13e8b0e08c3ba2261a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    - ``POST /servers/{server_id}/action``  where the action is rebuild"},{"line_number":12,"context_line":"    - ``PUT servers/{server_id}``"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    In addition, \"locked\" will be supported as a valid filter/sort parameter"},{"line_number":15,"context_line":"    for ``GET /servers/detail`` and ``GET /servers`` so that users can filter"},{"line_number":16,"context_line":"    servers based on their locked value. Also the instance action versioned"},{"line_number":17,"context_line":"    notifications for the lock/unlock actions now contain the ``locked_reason``"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"dfbec78f_9f964b3e","line":14,"range":{"start_line":14,"start_character":17,"end_line":14,"end_character":25},"in_reply_to":"dfbec78f_19d83b1c","updated":"2019-05-10 16:50:35.000000000","message":"Done","commit_id":"1830c73c05ffbe0f7980d4ef5f515ad225a4b22e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08a21f1e15db9c5189266f687efabc959e9cc1ee","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a new ``locked_reason`` option in microversion 2.73 to the"},{"line_number":5,"context_line":"    ``POST /servers/{server_id}/action`` request where the action is lock."},{"line_number":6,"context_line":"    It enables the user to specify a reason when locking a server. This"},{"line_number":7,"context_line":"    information will be exposed through the response of the following APIs:"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"dfbec78f_c7fdcd6e","line":4,"range":{"start_line":4,"start_character":34,"end_line":4,"end_character":40},"updated":"2019-05-11 21:47:19.000000000","message":"nit: parameter","commit_id":"286eddb593e372bf57b4f58c9b3cbd04cbb35adf"}]}
