)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"87311f45e1dee2af50b8653686a027b3f5a756bb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c2e9c715_d0ad8422","updated":"2023-05-11 19:40:10.000000000","message":"Thanks for adding these test. I think they are not just API negative which are mostly API interface testing and for interop for some reason but a good scenario tests(negative test). I think we should move these to scenario test what you say?\n\nAlso, can you add releasenote for the new interfaces you added in lib/*\n\nTest are passing in this job:\n\nhttps://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_cb9/882876/2/check/tempest-extra-tests/cb94295/testr_results.html","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"38a750fa07e79a5c04e2b27b8b32e9bdac76beb6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"473233f4_6715d622","updated":"2023-05-11 08:26:04.000000000","message":"recheck","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c4207a81440282069791b0ffed40223811bef4fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"51a1451a_65349f37","in_reply_to":"c2e9c715_d0ad8422","updated":"2023-05-11 20:10:13.000000000","message":"\u003e Thanks for adding these test. I think they are not just API negative which are mostly API interface testing and for interop for some reason but a good scenario tests(negative test). I think we should move these to scenario test what you say?\n\nAck, I\u0027ll convert this.\n\n\u003e Also, can you add releasenote for the new interfaces you added in lib/*\n\nYep.","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"59709e767743345f52555004cf1967769297359c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8118b7dd_359a1005","updated":"2023-05-15 20:57:40.000000000","message":"thanks, lgtm (1 nit about base method defined twice)\n\nTest passing in tempest slow job https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_31d/882876/3/check/tempest-slow-py3/31d6766/testr_results.html","commit_id":"0d8e21b2d1dc1f170f778018f3cb99fa7b9775a4"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"b77bc2fc_5583b260","updated":"2023-05-17 15:38:07.000000000","message":"Thanks Dan for making the improvements and changes.  I have some concerns that with some of the changes in the exceptions now tempest will only work with 1 way of deploying OpenStack.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3e2abd5be20a8939ae6ac5d8d04ff5a6b45889ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"26f922c0_4b7c9afa","updated":"2023-05-17 16:10:16.000000000","message":"Thanks Gorka. I\u0027m happy to make whatever changes we all agree on here.\n\nIt might be overkill, but we could also have a volume feature flag that says \"validate the spirit of bug 2004555 not just the patched behavior\" as a way for people to test their policy-protected clouds in the meantime. Again, I\u0027ll defer to the tempest cores for guidance on what is conventional.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6319a7c7a85b059dc02167d14bbe69f407137d4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"612d505a_f504aa5a","updated":"2023-05-16 17:57:52.000000000","message":"lgtm, thanks. As Dan mentioned in IRC, waiting for Gorka to have a look before +W","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"49aed6b65aab34f34e97a10a069f3faefff37015","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"40519415_5ac0b4d8","updated":"2023-05-16 10:02:36.000000000","message":"looks good and the new scenario tests are successfully executed in the full slow job","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"19a40712_57084fdd","updated":"2023-05-23 16:36:36.000000000","message":"Thanks for the changes.","commit_id":"cbaf22e85dc4b4ee819bc69ad9a294d3f85b372e"},{"author":{"_account_id":22873,"name":"Martin Kopec","email":"mkopec@redhat.com","username":"mkopec"},"change_message_id":"1686e926ea86e7183acd37c3d133337444db0c6f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d287ed23_8c6bd996","updated":"2023-05-18 09:22:22.000000000","message":"lgtm, Gorka made a few very valuable comments, I\u0027ll wait with +1 for his response.","commit_id":"cbaf22e85dc4b4ee819bc69ad9a294d3f85b372e"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6bb34c88f14fb2009e34a01035937bdf4cf6d8e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"31fc5643_9963a6d7","updated":"2023-05-18 00:58:19.000000000","message":"lgtm, thanks","commit_id":"cbaf22e85dc4b4ee819bc69ad9a294d3f85b372e"}],"tempest/api/volume/test_volumes_negative.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"87311f45e1dee2af50b8653686a027b3f5a756bb","unresolved":true,"context_lines":[{"line_number":505,"context_line":"    @utils.services(\u0027compute\u0027)"},{"line_number":506,"context_line":"    @decorators.idempotent_id(\u0027a0371eaa-0fae-4d1f-bbc9-8ce6463ced10\u0027)"},{"line_number":507,"context_line":"    def test_terminate_connection_rejected(self):"},{"line_number":508,"context_line":"        \"\"\"Test user call to detach volume is rejected (bug #2004555)\"\"\""},{"line_number":509,"context_line":"        vm_id, vol_id, att_id \u003d self._create_instance_and_attach_volume()"},{"line_number":510,"context_line":"        self.assertRaises("},{"line_number":511,"context_line":"            (lib_exc.Forbidden, lib_exc.Conflict),"}],"source_content_type":"text/x-python","patch_set":2,"id":"46cd6f6c_753871a4","line":508,"range":{"start_line":508,"start_character":28,"end_line":508,"end_character":42},"updated":"2023-05-11 19:40:10.000000000","message":"terminate attachment","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"87311f45e1dee2af50b8653686a027b3f5a756bb","unresolved":true,"context_lines":[{"line_number":516,"context_line":"    @utils.services(\u0027compute\u0027)"},{"line_number":517,"context_line":"    @decorators.idempotent_id(\u00276ac8bf9c-f0e8-4516-9255-6facfec7e6e2\u0027)"},{"line_number":518,"context_line":"    def test_terminate_connection_rejected_incorrect_service_token(self):"},{"line_number":519,"context_line":"        \"\"\"Test faking of service token on call to force detach volume"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        Rejection of the user request call to force detach cannot be"},{"line_number":522,"context_line":"        circumvented by providing a fake service token or a service token that"}],"source_content_type":"text/x-python","patch_set":2,"id":"43e03145_720c0415","line":519,"range":{"start_line":519,"start_character":51,"end_line":519,"end_character":70},"updated":"2023-05-11 19:40:10.000000000","message":"terminate attachment","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"87311f45e1dee2af50b8653686a027b3f5a756bb","unresolved":true,"context_lines":[{"line_number":518,"context_line":"    def test_terminate_connection_rejected_incorrect_service_token(self):"},{"line_number":519,"context_line":"        \"\"\"Test faking of service token on call to force detach volume"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        Rejection of the user request call to force detach cannot be"},{"line_number":522,"context_line":"        circumvented by providing a fake service token or a service token that"},{"line_number":523,"context_line":"        doesn\u0027t have the service role (bug #2004555)"},{"line_number":524,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"4076d1dc_94b2696d","line":521,"range":{"start_line":521,"start_character":46,"end_line":521,"end_character":58},"updated":"2023-05-11 19:40:10.000000000","message":"ditto","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"87311f45e1dee2af50b8653686a027b3f5a756bb","unresolved":true,"context_lines":[{"line_number":550,"context_line":"            (lib_exc.Forbidden, lib_exc.BadRequest),"},{"line_number":551,"context_line":"            self.volumes_client.detach_volume,"},{"line_number":552,"context_line":"            vol_id, attachment_id\u003datt_id2)"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"class AttachmentsSecureNegativeTest(CommonVolumeConnectionSecure):"},{"line_number":556,"context_line":"    \"\"\"Tests to verify that volume attachments are secure (bug #2004555).\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"625b9da7_d132a155","line":553,"range":{"start_line":553,"start_character":0,"end_line":553,"end_character":0},"updated":"2023-05-11 19:40:10.000000000","message":"another test I was thinking can be worth to test is try to delete the different attachment id from what nova has\n\nI mean\n- create server1 with attchment1\n- create volume2 and attach it to server1 but via cinder (here nova does not know about attachment2)\n- try to delete the attchment2 with passing server1 in cinder call and it should pass as attachment delete request is different from what nova actually has","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c4207a81440282069791b0ffed40223811bef4fd","unresolved":true,"context_lines":[{"line_number":550,"context_line":"            (lib_exc.Forbidden, lib_exc.BadRequest),"},{"line_number":551,"context_line":"            self.volumes_client.detach_volume,"},{"line_number":552,"context_line":"            vol_id, attachment_id\u003datt_id2)"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"class AttachmentsSecureNegativeTest(CommonVolumeConnectionSecure):"},{"line_number":556,"context_line":"    \"\"\"Tests to verify that volume attachments are secure (bug #2004555).\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ce8288f7_24054bc8","line":553,"range":{"start_line":553,"start_character":0,"end_line":553,"end_character":0},"in_reply_to":"625b9da7_d132a155","updated":"2023-05-11 20:10:13.000000000","message":"Ack, I\u0027ll do this in subsequent patch.","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"}],"tempest/lib/services/volume/v3/volumes_client.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"87311f45e1dee2af50b8653686a027b3f5a756bb","unresolved":true,"context_lines":[{"line_number":205,"context_line":"        self.validate_response(schema.set_bootable_volume, resp, body)"},{"line_number":206,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def detach_volume(self, volume_id, **kwargs):"},{"line_number":209,"context_line":"        \"\"\"Detaches a volume from an instance.\"\"\""},{"line_number":210,"context_line":"        post_body \u003d json.dumps({\u0027os-detach\u0027: kwargs})"},{"line_number":211,"context_line":"        url \u003d \u0027volumes/%s/action\u0027 % (volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"164ed8ea_6e2f0b83","line":208,"range":{"start_line":208,"start_character":39,"end_line":208,"end_character":46},"updated":"2023-05-11 19:40:10.000000000","message":"this is ok from stable interface point of view and consumer of it (tempest or plugin tests) are not using old tempest interface to add new test passing extra arg in this method.","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a012dd266e61dc3b9421736826f24778fcd1c3d0","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        self.validate_response(schema.set_bootable_volume, resp, body)"},{"line_number":206,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def detach_volume(self, volume_id, **kwargs):"},{"line_number":209,"context_line":"        \"\"\"Detaches a volume from an instance.\"\"\""},{"line_number":210,"context_line":"        post_body \u003d json.dumps({\u0027os-detach\u0027: kwargs})"},{"line_number":211,"context_line":"        url \u003d \u0027volumes/%s/action\u0027 % (volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dd714def_4307963d","line":208,"range":{"start_line":208,"start_character":39,"end_line":208,"end_character":46},"in_reply_to":"164ed8ea_6e2f0b83","updated":"2023-05-17 17:03:47.000000000","message":"Done","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"87311f45e1dee2af50b8653686a027b3f5a756bb","unresolved":true,"context_lines":[{"line_number":214,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def terminate_connection(self, volume_id, connector):"},{"line_number":217,"context_line":"        \"\"\"Detaches a volume from an instance.\"\"\""},{"line_number":218,"context_line":"        post_body \u003d json.dumps("},{"line_number":219,"context_line":"            {\u0027os-terminate_connection\u0027: {\u0027connector\u0027: connector}})"},{"line_number":220,"context_line":"        url \u003d \u0027volumes/%s/action\u0027 % (volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"53753238_b5f77aff","line":217,"range":{"start_line":217,"start_character":11,"end_line":217,"end_character":45},"updated":"2023-05-11 19:40:10.000000000","message":"Terminate the volume attachment","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"57f352cf8538d7cd80816d3d4b7bfd189f8610a7","unresolved":true,"context_lines":[{"line_number":214,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def terminate_connection(self, volume_id, connector):"},{"line_number":217,"context_line":"        \"\"\"Detaches a volume from an instance.\"\"\""},{"line_number":218,"context_line":"        post_body \u003d json.dumps("},{"line_number":219,"context_line":"            {\u0027os-terminate_connection\u0027: {\u0027connector\u0027: connector}})"},{"line_number":220,"context_line":"        url \u003d \u0027volumes/%s/action\u0027 % (volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9b0ba8a9_556edbf7","line":217,"range":{"start_line":217,"start_character":11,"end_line":217,"end_character":45},"in_reply_to":"53753238_b5f77aff","updated":"2023-05-15 17:02:48.000000000","message":"I\u0027m not sure this docstring is wrong. I think we\u0027ve always used the \"detach\" phrasing even though the API call was \"terminate\" and that\u0027s why the newer interface calls it detach.\n\nPerhaps \"Detach a volume from an instance using terminate_connection\" ?","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a012dd266e61dc3b9421736826f24778fcd1c3d0","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def terminate_connection(self, volume_id, connector):"},{"line_number":217,"context_line":"        \"\"\"Detaches a volume from an instance.\"\"\""},{"line_number":218,"context_line":"        post_body \u003d json.dumps("},{"line_number":219,"context_line":"            {\u0027os-terminate_connection\u0027: {\u0027connector\u0027: connector}})"},{"line_number":220,"context_line":"        url \u003d \u0027volumes/%s/action\u0027 % (volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d33a260e_d4e1c259","line":217,"range":{"start_line":217,"start_character":11,"end_line":217,"end_character":45},"in_reply_to":"9b0ba8a9_556edbf7","updated":"2023-05-17 17:03:47.000000000","message":"Done","commit_id":"ca87f04a6b150016b7f97eae132ebcd453a0b3e5"}],"tempest/scenario/test_server_volume_attachment.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"59709e767743345f52555004cf1967769297359c","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    and are only allowed through the compute service (bug #2004555)."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _call_with_fake_service_token(self, valid_token,"},{"line_number":68,"context_line":"                                      client, method_name, *args, **kwargs):"},{"line_number":69,"context_line":"        \"\"\"Call client method with non-service service token"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Add a service token header that can be a valid normal user token (which"},{"line_number":72,"context_line":"        won\u0027t have the service role) or an invalid token altogether."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        original_raw_request \u003d client.raw_request"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        def raw_request(url, method, headers\u003dNone, body\u003dNone, chunked\u003dFalse,"},{"line_number":77,"context_line":"                        log_req_body\u003dNone):"},{"line_number":78,"context_line":"            token \u003d headers[\u0027X-Auth-Token\u0027]"},{"line_number":79,"context_line":"            if not valid_token:"},{"line_number":80,"context_line":"                token \u003d token[:-1] + (\u0027a\u0027 if token[-1] !\u003d \u0027a\u0027 else \u0027b\u0027)"},{"line_number":81,"context_line":"            headers[\u0027X-Service-Token\u0027] \u003d token"},{"line_number":82,"context_line":"            return original_raw_request(url, method, headers\u003dheaders,"},{"line_number":83,"context_line":"                                        body\u003dbody, chunked\u003dchunked,"},{"line_number":84,"context_line":"                                        log_req_body\u003dlog_req_body)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        client_method \u003d getattr(client, method_name)"},{"line_number":87,"context_line":"        with mock.patch.object(client, \u0027raw_request\u0027, raw_request):"},{"line_number":88,"context_line":"            return client_method(*args, **kwargs)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":91,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf2b023a_eafc17df","line":88,"range":{"start_line":67,"start_character":0,"end_line":88,"end_character":49},"updated":"2023-05-15 20:57:40.000000000","message":"this is there in base class, I think you forget to remove this?","commit_id":"0d8e21b2d1dc1f170f778018f3cb99fa7b9775a4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"277624db53777f20472f058d0014fbadaffa1746","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    and are only allowed through the compute service (bug #2004555)."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _call_with_fake_service_token(self, valid_token,"},{"line_number":68,"context_line":"                                      client, method_name, *args, **kwargs):"},{"line_number":69,"context_line":"        \"\"\"Call client method with non-service service token"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Add a service token header that can be a valid normal user token (which"},{"line_number":72,"context_line":"        won\u0027t have the service role) or an invalid token altogether."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        original_raw_request \u003d client.raw_request"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        def raw_request(url, method, headers\u003dNone, body\u003dNone, chunked\u003dFalse,"},{"line_number":77,"context_line":"                        log_req_body\u003dNone):"},{"line_number":78,"context_line":"            token \u003d headers[\u0027X-Auth-Token\u0027]"},{"line_number":79,"context_line":"            if not valid_token:"},{"line_number":80,"context_line":"                token \u003d token[:-1] + (\u0027a\u0027 if token[-1] !\u003d \u0027a\u0027 else \u0027b\u0027)"},{"line_number":81,"context_line":"            headers[\u0027X-Service-Token\u0027] \u003d token"},{"line_number":82,"context_line":"            return original_raw_request(url, method, headers\u003dheaders,"},{"line_number":83,"context_line":"                                        body\u003dbody, chunked\u003dchunked,"},{"line_number":84,"context_line":"                                        log_req_body\u003dlog_req_body)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        client_method \u003d getattr(client, method_name)"},{"line_number":87,"context_line":"        with mock.patch.object(client, \u0027raw_request\u0027, raw_request):"},{"line_number":88,"context_line":"            return client_method(*args, **kwargs)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":91,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"d60000ba_e1cc9d87","line":88,"range":{"start_line":67,"start_character":0,"end_line":88,"end_character":49},"in_reply_to":"bf2b023a_eafc17df","updated":"2023-05-15 21:27:47.000000000","message":"Yep, I did, thanks.","commit_id":"0d8e21b2d1dc1f170f778018f3cb99fa7b9775a4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e31f76117336a9a42368017d05fb5146e6dfe7f3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    and are only allowed through the compute service (bug #2004555)."},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _call_with_fake_service_token(self, valid_token,"},{"line_number":68,"context_line":"                                      client, method_name, *args, **kwargs):"},{"line_number":69,"context_line":"        \"\"\"Call client method with non-service service token"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        Add a service token header that can be a valid normal user token (which"},{"line_number":72,"context_line":"        won\u0027t have the service role) or an invalid token altogether."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        original_raw_request \u003d client.raw_request"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        def raw_request(url, method, headers\u003dNone, body\u003dNone, chunked\u003dFalse,"},{"line_number":77,"context_line":"                        log_req_body\u003dNone):"},{"line_number":78,"context_line":"            token \u003d headers[\u0027X-Auth-Token\u0027]"},{"line_number":79,"context_line":"            if not valid_token:"},{"line_number":80,"context_line":"                token \u003d token[:-1] + (\u0027a\u0027 if token[-1] !\u003d \u0027a\u0027 else \u0027b\u0027)"},{"line_number":81,"context_line":"            headers[\u0027X-Service-Token\u0027] \u003d token"},{"line_number":82,"context_line":"            return original_raw_request(url, method, headers\u003dheaders,"},{"line_number":83,"context_line":"                                        body\u003dbody, chunked\u003dchunked,"},{"line_number":84,"context_line":"                                        log_req_body\u003dlog_req_body)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        client_method \u003d getattr(client, method_name)"},{"line_number":87,"context_line":"        with mock.patch.object(client, \u0027raw_request\u0027, raw_request):"},{"line_number":88,"context_line":"            return client_method(*args, **kwargs)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":91,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7dd89001_7a48119b","line":88,"range":{"start_line":67,"start_character":0,"end_line":88,"end_character":49},"in_reply_to":"d60000ba_e1cc9d87","updated":"2023-05-17 15:09:41.000000000","message":"Done","commit_id":"0d8e21b2d1dc1f170f778018f3cb99fa7b9775a4"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":68,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"},{"line_number":69,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":70,"context_line":"    def test_server_detach_rules(self):"},{"line_number":71,"context_line":"        \"\"\"Test that various methods of detaching a volume honors the rules\"\"\""},{"line_number":72,"context_line":"        server \u003d self.create_server(wait_until\u003d\u0027SSHABLE\u0027)"},{"line_number":73,"context_line":"        servers \u003d self.servers_client.list_servers()[\u0027servers\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"146328b4_f25946f8","line":70,"updated":"2023-05-17 15:38:07.000000000","message":"nit: Now that we have included all the tests in the same method, shouldn\u0027t we log something that would help us easily identify what part of this was being executed?","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3e2abd5be20a8939ae6ac5d8d04ff5a6b45889ef","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":68,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"},{"line_number":69,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":70,"context_line":"    def test_server_detach_rules(self):"},{"line_number":71,"context_line":"        \"\"\"Test that various methods of detaching a volume honors the rules\"\"\""},{"line_number":72,"context_line":"        server \u003d self.create_server(wait_until\u003d\u0027SSHABLE\u0027)"},{"line_number":73,"context_line":"        servers \u003d self.servers_client.list_servers()[\u0027servers\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"ddfe18bd_567cb45a","line":70,"in_reply_to":"146328b4_f25946f8","updated":"2023-05-17 16:10:16.000000000","message":"I\u0027m not sure I see that a lot in tempest tests really, but I can if the tempest cores think that\u0027s a good idea. Typically the stack trace from the test provides enough info for me to figure out which step was a failing one.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a012dd266e61dc3b9421736826f24778fcd1c3d0","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":68,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"},{"line_number":69,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":70,"context_line":"    def test_server_detach_rules(self):"},{"line_number":71,"context_line":"        \"\"\"Test that various methods of detaching a volume honors the rules\"\"\""},{"line_number":72,"context_line":"        server \u003d self.create_server(wait_until\u003d\u0027SSHABLE\u0027)"},{"line_number":73,"context_line":"        servers \u003d self.servers_client.list_servers()[\u0027servers\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"b30a4dcd_4f60e4ed","line":70,"in_reply_to":"95bc8509_f0efbf2c","updated":"2023-05-17 17:03:47.000000000","message":"tempest dump all the request and response in logs and failure with traceback so it is not very difficult to find where exactly test failed.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":68,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"},{"line_number":69,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":70,"context_line":"    def test_server_detach_rules(self):"},{"line_number":71,"context_line":"        \"\"\"Test that various methods of detaching a volume honors the rules\"\"\""},{"line_number":72,"context_line":"        server \u003d self.create_server(wait_until\u003d\u0027SSHABLE\u0027)"},{"line_number":73,"context_line":"        servers \u003d self.servers_client.list_servers()[\u0027servers\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"d2926bac_ef0b1c03","line":70,"in_reply_to":"b30a4dcd_4f60e4ed","updated":"2023-05-23 16:36:36.000000000","message":"Ack","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"e2083c14694adab764e3dbdeb7e55107159103e6","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    @decorators.attr(type\u003d\u0027slow\u0027)"},{"line_number":68,"context_line":"    @decorators.idempotent_id(\u0027be615530-f105-437a-8afe-ce998c9535d9\u0027)"},{"line_number":69,"context_line":"    @utils.services(\u0027compute\u0027, \u0027volume\u0027, \u0027image\u0027, \u0027network\u0027)"},{"line_number":70,"context_line":"    def test_server_detach_rules(self):"},{"line_number":71,"context_line":"        \"\"\"Test that various methods of detaching a volume honors the rules\"\"\""},{"line_number":72,"context_line":"        server \u003d self.create_server(wait_until\u003d\u0027SSHABLE\u0027)"},{"line_number":73,"context_line":"        servers \u003d self.servers_client.list_servers()[\u0027servers\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"95bc8509_f0efbf2c","line":70,"in_reply_to":"ddfe18bd_567cb45a","updated":"2023-05-17 16:23:58.000000000","message":"Yes, we don\u0027t do it in tempest, and in my experience looking at the failure in tempest is a real pain, because there are so many entries with all those loops.  It was just a nit, not really something that needs to be added.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        self.assertIn(server[\u0027id\u0027], [x[\u0027id\u0027] for x in servers])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        volume \u003d self.create_volume()"},{"line_number":77,"context_line":"        volumes \u003d self.volumes_client.list_volumes()[\u0027volumes\u0027]"},{"line_number":78,"context_line":"        self.assertIn(volume[\u0027id\u0027], [x[\u0027id\u0027] for x in volumes])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        volume \u003d self.nova_volume_attach(server, volume)"},{"line_number":81,"context_line":"        self.addCleanup(self.nova_volume_detach, server, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ac31ccdb_9bf8369d","line":78,"range":{"start_line":77,"start_character":0,"end_line":78,"end_character":63},"updated":"2023-05-17 15:38:07.000000000","message":"-1: We shouldn\u0027t need this check, volumes are simpler than instances, the volume creation already waits until the volume is available, and at that point it is fully usable.  And if we have to do it for some reason I\u0027m unaware, we should do a get, which is faster.\n\nFor example we don\u0027t do it in L148 and it\u0027s not flaky.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.assertIn(server[\u0027id\u0027], [x[\u0027id\u0027] for x in servers])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        volume \u003d self.create_volume()"},{"line_number":77,"context_line":"        volumes \u003d self.volumes_client.list_volumes()[\u0027volumes\u0027]"},{"line_number":78,"context_line":"        self.assertIn(volume[\u0027id\u0027], [x[\u0027id\u0027] for x in volumes])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        volume \u003d self.nova_volume_attach(server, volume)"},{"line_number":81,"context_line":"        self.addCleanup(self.nova_volume_detach, server, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"6121de6e_ada9d513","line":78,"range":{"start_line":77,"start_character":0,"end_line":78,"end_character":63},"in_reply_to":"7103201d_89ceb2fb","updated":"2023-05-23 16:36:36.000000000","message":"Done","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3e2abd5be20a8939ae6ac5d8d04ff5a6b45889ef","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        self.assertIn(server[\u0027id\u0027], [x[\u0027id\u0027] for x in servers])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        volume \u003d self.create_volume()"},{"line_number":77,"context_line":"        volumes \u003d self.volumes_client.list_volumes()[\u0027volumes\u0027]"},{"line_number":78,"context_line":"        self.assertIn(volume[\u0027id\u0027], [x[\u0027id\u0027] for x in volumes])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        volume \u003d self.nova_volume_attach(server, volume)"},{"line_number":81,"context_line":"        self.addCleanup(self.nova_volume_detach, server, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"d23b5076_be6d0c5a","line":78,"range":{"start_line":77,"start_character":0,"end_line":78,"end_character":63},"in_reply_to":"ac31ccdb_9bf8369d","updated":"2023-05-17 16:10:16.000000000","message":"Ack, this is shameless copy/pasta from here:\n\nhttps://github.com/openstack/tempest/blob/master/tempest/scenario/test_minimum_basic.py#L118\n\nwhich I just used while bootstrapping this as a scenario. I don\u0027t know why it\u0027s there, but I didn\u0027t even think about it :)","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a012dd266e61dc3b9421736826f24778fcd1c3d0","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        self.assertIn(server[\u0027id\u0027], [x[\u0027id\u0027] for x in servers])"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        volume \u003d self.create_volume()"},{"line_number":77,"context_line":"        volumes \u003d self.volumes_client.list_volumes()[\u0027volumes\u0027]"},{"line_number":78,"context_line":"        self.assertIn(volume[\u0027id\u0027], [x[\u0027id\u0027] for x in volumes])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        volume \u003d self.nova_volume_attach(server, volume)"},{"line_number":81,"context_line":"        self.addCleanup(self.nova_volume_detach, server, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7103201d_89ceb2fb","line":78,"range":{"start_line":77,"start_character":0,"end_line":78,"end_character":63},"in_reply_to":"d23b5076_be6d0c5a","updated":"2023-05-17 17:03:47.000000000","message":"yeah, this is just extra check here and can be removed.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        # Test faking of service token on call to detach, force detach,"},{"line_number":94,"context_line":"        # terminate_connection"},{"line_number":95,"context_line":"        for valid_token in (True, False):"},{"line_number":96,"context_line":"            valid_exceptions \u003d [exceptions.Conflict]"},{"line_number":97,"context_line":"            if not valid_token:"},{"line_number":98,"context_line":"                valid_exceptions.append(exceptions.Unauthorized)"},{"line_number":99,"context_line":"            self.assertRaises("},{"line_number":100,"context_line":"                tuple(valid_exceptions),"},{"line_number":101,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5c9ea1a6_4d4bdfcc","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":64},"updated":"2023-05-17 15:38:07.000000000","message":"-1: The original patch accepted multiple exceptions so the test would work independent of how things were configured as long as the deployment was protected.  It supported:\n\n- Cinder protected by policy\n- Cinder without `service_token_roles_required` configured in the `keystone_authtoken` section (defaults to False)\n- Cinder configured with the `service_token_roles_required \u003d True`\n\nIn all those cases nova would still work as expected, and I would expect this test to pass as well.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2a3532994b3840e9035f9dee49a752ba515cc2e6","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        # Test faking of service token on call to detach, force detach,"},{"line_number":94,"context_line":"        # terminate_connection"},{"line_number":95,"context_line":"        for valid_token in (True, False):"},{"line_number":96,"context_line":"            valid_exceptions \u003d [exceptions.Conflict]"},{"line_number":97,"context_line":"            if not valid_token:"},{"line_number":98,"context_line":"                valid_exceptions.append(exceptions.Unauthorized)"},{"line_number":99,"context_line":"            self.assertRaises("},{"line_number":100,"context_line":"                tuple(valid_exceptions),"},{"line_number":101,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"8d9829f3_b26f2c41","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":64},"in_reply_to":"2752845f_96afdc53","updated":"2023-05-17 17:25:08.000000000","message":"Ack, I\u0027ll put this back then.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"e2083c14694adab764e3dbdeb7e55107159103e6","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        # Test faking of service token on call to detach, force detach,"},{"line_number":94,"context_line":"        # terminate_connection"},{"line_number":95,"context_line":"        for valid_token in (True, False):"},{"line_number":96,"context_line":"            valid_exceptions \u003d [exceptions.Conflict]"},{"line_number":97,"context_line":"            if not valid_token:"},{"line_number":98,"context_line":"                valid_exceptions.append(exceptions.Unauthorized)"},{"line_number":99,"context_line":"            self.assertRaises("},{"line_number":100,"context_line":"                tuple(valid_exceptions),"},{"line_number":101,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"828ae511_d65171aa","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":64},"in_reply_to":"2d097e68_2f7ce6aa","updated":"2023-05-17 16:23:58.000000000","message":"This is were different people have different views of what tempest is.\nI used to think that tempest was a mechanism to validate a deployment, and therefore could be run on a production environment to validate that everything was currently working as expected.\nSo it wouldn\u0027t be crazy to me that someone on their deployment would want to run tempest after setting the new policies to protect their cloud.\nThat\u0027s why I made ti support the various responses that we could expect.\nAnyway, that\u0027s my \"view\" of tempest, and since I\u0027m no expert is probably all kinds of wrong. ;-)","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3e2abd5be20a8939ae6ac5d8d04ff5a6b45889ef","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        # Test faking of service token on call to detach, force detach,"},{"line_number":94,"context_line":"        # terminate_connection"},{"line_number":95,"context_line":"        for valid_token in (True, False):"},{"line_number":96,"context_line":"            valid_exceptions \u003d [exceptions.Conflict]"},{"line_number":97,"context_line":"            if not valid_token:"},{"line_number":98,"context_line":"                valid_exceptions.append(exceptions.Unauthorized)"},{"line_number":99,"context_line":"            self.assertRaises("},{"line_number":100,"context_line":"                tuple(valid_exceptions),"},{"line_number":101,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"2d097e68_2f7ce6aa","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":64},"in_reply_to":"5c9ea1a6_4d4bdfcc","updated":"2023-05-17 16:10:16.000000000","message":"Ack. To me, we\u0027re trying to validate that the actual cinder code is correct here and thus we should be looking for the specific error and not one of two. The problem is that looking for Forbidden could be fooled by a bug in the test using the wrong credentials or similar and thus looking for the Conflict seems more important to me, as that\u0027s what the new cinder behavior is. Technically almost all of the nova (and I\u0027d guess other) APIs in a real deployment could be \"disabled\" in policy and thus could allow Forbidden as a valid result, yet we don\u0027t provide allowances for that.\n\nIMHO, the policy-based mitigation for this issue is something people may opt into in the short term for a variety of reasons, but the new cinder behavior is what we want to assert going forward. If we wanted to validate the policy-based approach for older deployments, it would be better to do that in a tempest backport for the versions of tempest we\u0027d expect people to run against those older clouds, and have master/2023.2 tempest validate the behavior we expect master/2023.2 cinder to have.\n\nYes I know tempest is branchless and thus the backport itself is not an option. Given that we\u0027ve backported the cinder stuff to even before our oldest supported branches, I guess I expect the right thing to do here is to validate the behavior we expect patched deployments to be running.\n\nAnyway, probably best to get some feedback from the tempest cores here and I\u0027ll be glad to update this to match whatever the consensus is.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a012dd266e61dc3b9421736826f24778fcd1c3d0","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        # Test faking of service token on call to detach, force detach,"},{"line_number":94,"context_line":"        # terminate_connection"},{"line_number":95,"context_line":"        for valid_token in (True, False):"},{"line_number":96,"context_line":"            valid_exceptions \u003d [exceptions.Conflict]"},{"line_number":97,"context_line":"            if not valid_token:"},{"line_number":98,"context_line":"                valid_exceptions.append(exceptions.Unauthorized)"},{"line_number":99,"context_line":"            self.assertRaises("},{"line_number":100,"context_line":"                tuple(valid_exceptions),"},{"line_number":101,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"2752845f_96afdc53","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":64},"in_reply_to":"828ae511_d65171aa","updated":"2023-05-17 17:03:47.000000000","message":"Well, along with upstream testing, tempest is a production test tool too. But it run on the default policy permission. If any deployment has overridden the policy with some crazy roles then tempest would not work at all.\n\nChecking exact exception here, I think we can be flexible here as these are scenario tests and exact exception can be tested in cinder side unit/functional test itlself. I am ok to not check exact exception or check a set of exceptions.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # Test faking of service token on call to detach, force detach,"},{"line_number":94,"context_line":"        # terminate_connection"},{"line_number":95,"context_line":"        for valid_token in (True, False):"},{"line_number":96,"context_line":"            valid_exceptions \u003d [exceptions.Conflict]"},{"line_number":97,"context_line":"            if not valid_token:"},{"line_number":98,"context_line":"                valid_exceptions.append(exceptions.Unauthorized)"},{"line_number":99,"context_line":"            self.assertRaises("},{"line_number":100,"context_line":"                tuple(valid_exceptions),"},{"line_number":101,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"c1994980_968f6262","line":98,"range":{"start_line":96,"start_character":0,"end_line":98,"end_character":64},"in_reply_to":"8d9829f3_b26f2c41","updated":"2023-05-23 16:36:36.000000000","message":"Thanks","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # Test user call to force detach volume is rejected"},{"line_number":128,"context_line":"        self.assertRaises("},{"line_number":129,"context_line":"            exceptions.Conflict,"},{"line_number":130,"context_line":"            self.admin_volume_client.force_detach_volume,"},{"line_number":131,"context_line":"            volume[\u0027id\u0027], connector\u003dNone,"},{"line_number":132,"context_line":"            attachment_id\u003datt_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"41b30cb4_b74451c2","line":129,"updated":"2023-05-17 15:38:07.000000000","message":"Same with the exceptions","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # Test user call to force detach volume is rejected"},{"line_number":128,"context_line":"        self.assertRaises("},{"line_number":129,"context_line":"            exceptions.Conflict,"},{"line_number":130,"context_line":"            self.admin_volume_client.force_detach_volume,"},{"line_number":131,"context_line":"            volume[\u0027id\u0027], connector\u003dNone,"},{"line_number":132,"context_line":"            attachment_id\u003datt_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ee55c996_587b09e6","line":129,"in_reply_to":"41b30cb4_b74451c2","updated":"2023-05-23 16:36:36.000000000","message":"Done","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # Test trying to override detach with force and service token"},{"line_number":135,"context_line":"        for valid_token in (True, False):"},{"line_number":136,"context_line":"            valid_exception \u003d exceptions.Conflict"},{"line_number":137,"context_line":"            if not valid_token:"},{"line_number":138,"context_line":"                valid_exception \u003d exceptions.Unauthorized"},{"line_number":139,"context_line":"            self.assertRaises("},{"line_number":140,"context_line":"                valid_exception,"},{"line_number":141,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"b993525f_8ffcffba","line":138,"range":{"start_line":136,"start_character":0,"end_line":138,"end_character":57},"updated":"2023-05-17 15:38:07.000000000","message":"Same with the exceptions","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        # Test trying to override detach with force and service token"},{"line_number":135,"context_line":"        for valid_token in (True, False):"},{"line_number":136,"context_line":"            valid_exception \u003d exceptions.Conflict"},{"line_number":137,"context_line":"            if not valid_token:"},{"line_number":138,"context_line":"                valid_exception \u003d exceptions.Unauthorized"},{"line_number":139,"context_line":"            self.assertRaises("},{"line_number":140,"context_line":"                valid_exception,"},{"line_number":141,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"72f5ddb0_85da0804","line":138,"range":{"start_line":136,"start_character":0,"end_line":138,"end_character":57},"in_reply_to":"b993525f_8ffcffba","updated":"2023-05-23 16:36:36.000000000","message":"Done","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":167,"context_line":"        self.assertIn(server[\u0027id\u0027], [x[\u0027id\u0027] for x in servers])"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        volume \u003d self.create_volume()"},{"line_number":170,"context_line":"        volumes \u003d self.volumes_client.list_volumes()[\u0027volumes\u0027]"},{"line_number":171,"context_line":"        self.assertIn(volume[\u0027id\u0027], [x[\u0027id\u0027] for x in volumes])"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        volume \u003d self.nova_volume_attach(server, volume)"},{"line_number":174,"context_line":"        self.addCleanup(self.nova_volume_detach, server, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"58964e9e_983e29c2","line":171,"range":{"start_line":170,"start_character":0,"end_line":171,"end_character":63},"updated":"2023-05-17 15:38:07.000000000","message":"-1: We shouldn\u0027t need this check, volumes are simpler than instances, the volume creation already waits until the volume is available, and at that point it is fully usable.  And if we have to do it for some reason I\u0027m unaware, we should do a get, which is faster.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.assertIn(server[\u0027id\u0027], [x[\u0027id\u0027] for x in servers])"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        volume \u003d self.create_volume()"},{"line_number":170,"context_line":"        volumes \u003d self.volumes_client.list_volumes()[\u0027volumes\u0027]"},{"line_number":171,"context_line":"        self.assertIn(volume[\u0027id\u0027], [x[\u0027id\u0027] for x in volumes])"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        volume \u003d self.nova_volume_attach(server, volume)"},{"line_number":174,"context_line":"        self.addCleanup(self.nova_volume_detach, server, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"522bd7aa_de40a09b","line":171,"range":{"start_line":170,"start_character":0,"end_line":171,"end_character":63},"in_reply_to":"58964e9e_983e29c2","updated":"2023-05-23 16:36:36.000000000","message":"Done","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        att_id \u003d volume[\u0027attachments\u0027][0][\u0027attachment_id\u0027]"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        for valid_token in (True, False):"},{"line_number":178,"context_line":"            valid_exception \u003d exceptions.Conflict"},{"line_number":179,"context_line":"            if not valid_token:"},{"line_number":180,"context_line":"                valid_exception \u003d exceptions.Unauthorized"},{"line_number":181,"context_line":"            self.assertRaises("},{"line_number":182,"context_line":"                valid_exception,"},{"line_number":183,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dcbe26ec_d4bc137c","line":180,"range":{"start_line":178,"start_character":0,"end_line":180,"end_character":57},"updated":"2023-05-17 15:38:07.000000000","message":"-1: The original patch accepted multiple exceptions so the test would work independent of how things were configured as long as the deployment was protected.  It supported:\n\n- Cinder protected by policy\n- Cinder without `service_token_roles_required` configured in the `keystone_authtoken` section (defaults to False)\n- Cinder configured with the `service_token_roles_required \u003d True`\n\nIn all those cases nova would still work as expected, and I would expect this test to pass as well.","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        att_id \u003d volume[\u0027attachments\u0027][0][\u0027attachment_id\u0027]"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        for valid_token in (True, False):"},{"line_number":178,"context_line":"            valid_exception \u003d exceptions.Conflict"},{"line_number":179,"context_line":"            if not valid_token:"},{"line_number":180,"context_line":"                valid_exception \u003d exceptions.Unauthorized"},{"line_number":181,"context_line":"            self.assertRaises("},{"line_number":182,"context_line":"                valid_exception,"},{"line_number":183,"context_line":"                self._call_with_fake_service_token,"}],"source_content_type":"text/x-python","patch_set":4,"id":"4e8c3886_8165e1b8","line":180,"range":{"start_line":178,"start_character":0,"end_line":180,"end_character":57},"in_reply_to":"dcbe26ec_d4bc137c","updated":"2023-05-23 16:36:36.000000000","message":"Done","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0177b27a619dac654cf932763ea89ecb86d8f637","unresolved":true,"context_lines":[{"line_number":187,"context_line":"                att_id)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        self.assertRaises("},{"line_number":190,"context_line":"            exceptions.Conflict,"},{"line_number":191,"context_line":"            self.attachments_client.delete_attachment,"},{"line_number":192,"context_line":"            att_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"6ab5a93f_769f4b09","line":190,"updated":"2023-05-17 15:38:07.000000000","message":"-1: Same as previous comment","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"4442b97e103e5fbdf289791bcbe0aea42eaf1bdb","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                att_id)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        self.assertRaises("},{"line_number":190,"context_line":"            exceptions.Conflict,"},{"line_number":191,"context_line":"            self.attachments_client.delete_attachment,"},{"line_number":192,"context_line":"            att_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"114b4074_011f51e6","line":190,"in_reply_to":"6ab5a93f_769f4b09","updated":"2023-05-23 16:36:36.000000000","message":"Done","commit_id":"d652841395a09dc658966adcf627ed19db9e68e1"}]}
