Acceptance tests using different clients concurrently. Environment deployed from packages.
Build: #3232 was successful
Job: Spaces basic was successful
user fails to add metadata to the trash directory[1oz 1op 1oc]: Test case result
The below summarizes the result of the test " user fails to add metadata to the trash directory[1oz 1op 1oc]" in build 3,232 of Onedata Products - mixed acceptance pkg - Spaces basic.
- Description
- user fails to add metadata to the trash directory[1oz 1op 1oc]
- Test class
- mixed.scenarios.test_spaces_basic
- Method
- test_user_fails_to_add_metadata_to_the_trash_directory[1oz_1op_1oc]
- Jira Issue
-
- Duration
- 14 secs
- Status
- Failed (Existing Failure)
Error Log
AssertionError user = 'user1' users = {'admin': <tests.utils.user_utils.AdminUser object at 0x7f513335b280>, 'admin2': <tests.utils.user_utils.User object a...s.user_utils.AdminUser object at 0x7f513335b2b0>, 'user1': <tests.utils.user_utils.User object at 0x7f513335b8e0>, ...} hosts = {'oneclient-1': {'container-id': '02f949607dca5ff28fa192c62abccf33dfb6f6ff00ac37bd72c729c0cb830451', 'ip': '10.244.174...7bf1f006d0815', 'hostname': 'dev-onezone.default.svc.cluster.local', 'ip': '10.244.174.1', 'name': 'dev-onezone', ...}} host = 'oneprovider-1' dir_id = '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237' expression = '{"id": 1}' err_msg = 'Json metadata added to trash dir, but adding should have failed' def try_to_add_json_metadata_to_special_dir_by_id( user, users, hosts, host, dir_id, expression, err_msg=''): try: > add_json_metadata_to_file_rest(user, users, hosts, host, expression, dir_id) tests/mixed/steps/rest/onezone/special_dirs.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ user = 'user1' users = {'admin': <tests.utils.user_utils.AdminUser object at 0x7f513335b280>, 'admin2': <tests.utils.user_utils.User object a...s.user_utils.AdminUser object at 0x7f513335b2b0>, 'user1': <tests.utils.user_utils.User object at 0x7f513335b8e0>, ...} hosts = {'oneclient-1': {'container-id': '02f949607dca5ff28fa192c62abccf33dfb6f6ff00ac37bd72c729c0cb830451', 'ip': '10.244.174...7bf1f006d0815', 'hostname': 'dev-onezone.default.svc.cluster.local', 'ip': '10.244.174.1', 'name': 'dev-onezone', ...}} host = 'oneprovider-1', expression = '{"id": 1}' file_id = '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237' def add_json_metadata_to_file_rest(user, users, hosts, host, expression, file_id): user_client_op = login_to_provider(user, users, hosts[host]['hostname']) cfm_api = CustomFileMetadataApi(user_client_op) > cfm_api.set_json_metadata(file_id, expression) tests/mixed/steps/rest/oneprovider/metadata.py:56: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api.custom_file_metadata_api.CustomFileMetadataApi object at 0x7f513335a310> id = '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237' metadata = '{"id": 1}', kwargs = {'_return_http_data_only': True} def set_json_metadata(self, id, metadata, **kwargs): # noqa: E501 """Set file json metadata # noqa: E501 This method allows to set json metadata for a file specified by [$FILE_ID](#operation/lookup_file_id). This operation will replace the previous json metadata if any. ***Example cURL requests*** **Set JSON metadata for file** ```bash curl -H \"X-Auth-Token: $TOKEN\" \\ -X PUT https://$PROVIDER_HOST/api/v3/oneprovider/data/$FILE_ID/metadata/json \\ -H \"Content-Type: application/json\" -d '{ \"key1\": { \"key2\": [\"val1\", \"val2\", \"val3\", \"val4\"] } }' ``` # noqa: E501 This method makes a synchronous HTTP request by default. To make an asynchronous HTTP request, please pass async_req=True >>> thread = api.set_json_metadata(id, metadata, async_req=True) >>> result = thread.get() :param async_req bool :param str id: Id of the file. (required) :param str metadata: The json metadata. (required) :param str filter_type: The type of filter to apply to the metadata document. :param str filter: The filter allowing to set specific metadata document key. Required if `filter_type` is specified. :param bool resolve_symlink: Indicates whether the operation should be performed on the symbolic link itself (`false`) or on the target file that it points to (`true`). :return: None If the method is called asynchronously, returns the request thread. """ kwargs['_return_http_data_only'] = True if kwargs.get('async_req'): return self.set_json_metadata_with_http_info(id, metadata, **kwargs) # noqa: E501 else: > (data) = self.set_json_metadata_with_http_info(id, metadata, **kwargs) # noqa: E501 tests/mixed/oneprovider_client/api/custom_file_metadata_api.py:673: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api.custom_file_metadata_api.CustomFileMetadataApi object at 0x7f513335a310> id = '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237' metadata = '{"id": 1}', kwargs = {'_return_http_data_only': True} all_params = ['id', 'metadata', 'filter_type', 'filter', 'resolve_symlink', 'async_req', ...] params = {'_return_http_data_only': True, 'all_params': ['id', 'metadata', 'filter_type', 'filter', 'resolve_symlink', 'async_req', ...], 'auth_settings': ['api_key1', 'api_key2'], 'body_params': '{"id": 1}', ...} key = '_return_http_data_only', val = True, collection_formats = {} path_params = {'id': '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237'} query_params = [] def set_json_metadata_with_http_info(self, id, metadata, **kwargs): # noqa: E501 """Set file json metadata # noqa: E501 This method allows to set json metadata for a file specified by [$FILE_ID](#operation/lookup_file_id). This operation will replace the previous json metadata if any. ***Example cURL requests*** **Set JSON metadata for file** ```bash curl -H \"X-Auth-Token: $TOKEN\" \\ -X PUT https://$PROVIDER_HOST/api/v3/oneprovider/data/$FILE_ID/metadata/json \\ -H \"Content-Type: application/json\" -d '{ \"key1\": { \"key2\": [\"val1\", \"val2\", \"val3\", \"val4\"] } }' ``` # noqa: E501 This method makes a synchronous HTTP request by default. To make an asynchronous HTTP request, please pass async_req=True >>> thread = api.set_json_metadata_with_http_info(id, metadata, async_req=True) >>> result = thread.get() :param async_req bool :param str id: Id of the file. (required) :param str metadata: The json metadata. (required) :param str filter_type: The type of filter to apply to the metadata document. :param str filter: The filter allowing to set specific metadata document key. Required if `filter_type` is specified. :param bool resolve_symlink: Indicates whether the operation should be performed on the symbolic link itself (`false`) or on the target file that it points to (`true`). :return: None If the method is called asynchronously, returns the request thread. """ all_params = ['id', 'metadata', 'filter_type', 'filter', 'resolve_symlink'] # noqa: E501 all_params.append('async_req') all_params.append('_return_http_data_only') all_params.append('_preload_content') all_params.append('_request_timeout') params = locals() for key, val in six.iteritems(params['kwargs']): if key not in all_params: raise TypeError( "Got an unexpected keyword argument '%s'" " to method set_json_metadata" % key ) params[key] = val del params['kwargs'] # verify the required parameter 'id' is set if self.api_client.client_side_validation and ('id' not in params or params['id'] is None): # noqa: E501 raise ValueError("Missing the required parameter `id` when calling `set_json_metadata`") # noqa: E501 # verify the required parameter 'metadata' is set if self.api_client.client_side_validation and ('metadata' not in params or params['metadata'] is None): # noqa: E501 raise ValueError("Missing the required parameter `metadata` when calling `set_json_metadata`") # noqa: E501 collection_formats = {} path_params = {} if 'id' in params: path_params['id'] = params['id'] # noqa: E501 query_params = [] if 'filter_type' in params: query_params.append(('filter_type', params['filter_type'])) # noqa: E501 if 'filter' in params: query_params.append(('filter', params['filter'])) # noqa: E501 if 'resolve_symlink' in params: query_params.append(('resolve_symlink', params['resolve_symlink'])) # noqa: E501 header_params = {} form_params = [] local_var_files = {} body_params = None if 'metadata' in params: body_params = params['metadata'] # HTTP header `Content-Type` header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 ['application/json']) # noqa: E501 # Authentication setting auth_settings = ['api_key1', 'api_key2'] # noqa: E501 > return self.api_client.call_api( '/data/{id}/metadata/json', 'PUT', path_params, query_params, header_params, body=body_params, post_params=form_params, files=local_var_files, response_type=None, # noqa: E501 auth_settings=auth_settings, async_req=params.get('async_req'), _return_http_data_only=params.get('_return_http_data_only'), _preload_content=params.get('_preload_content', True), _request_timeout=params.get('_request_timeout'), collection_formats=collection_formats) tests/mixed/oneprovider_client/api/custom_file_metadata_api.py:749: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api_client.ApiClient object at 0x7f513335a190> resource_path = '/data/{id}/metadata/json', method = 'PUT' path_params = {'id': '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237'} query_params = [] header_params = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.6/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...DVlMjlmN2NoMzE4YwowMDFhY2lkIHRpbWUgPCAxNzU3NDU1MDY00CjAwMmZzaWduYXR1cmUgQ191eCea02L277uT5UMyZPDYZaXjMtnwGqySKCANJ6ogK'} body = '{"id": 1}', post_params = [], files = {}, response_type = None auth_settings = ['api_key1', 'api_key2'], async_req = None _return_http_data_only = True, collection_formats = {}, _preload_content = True _request_timeout = None def call_api(self, resource_path, method, path_params=None, query_params=None, header_params=None, body=None, post_params=None, files=None, response_type=None, auth_settings=None, async_req=None, _return_http_data_only=None, collection_formats=None, _preload_content=True, _request_timeout=None): """Makes the HTTP request (synchronous) and returns deserialized data. To make an async request, set the async_req parameter. :param resource_path: Path to method endpoint. :param method: Method to call. :param path_params: Path parameters in the url. :param query_params: Query parameters in the url. :param header_params: Header parameters to be placed in the request header. :param body: Request body. :param post_params dict: Request post form parameters, for `application/x-www-form-urlencoded`, `multipart/form-data`. :param auth_settings list: Auth Settings names for the request. :param response: Response data type. :param files dict: key -> filename, value -> filepath, for `multipart/form-data`. :param async_req bool: execute request asynchronously :param _return_http_data_only: response data without head status code and headers :param collection_formats: dict of collection formats for path, query, header, and post parameters. :param _preload_content: if False, the urllib3.HTTPResponse object will be returned without reading/decoding response data. Default is True. :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. :return: If async_req parameter is True, the request will be called asynchronously. The method will return the request thread. If parameter async_req is False or missing, then the method will return the response directly. """ if not async_req: > return self.__call_api(resource_path, method, path_params, query_params, header_params, body, post_params, files, response_type, auth_settings, _return_http_data_only, collection_formats, _preload_content, _request_timeout) tests/mixed/oneprovider_client/api_client.py:326: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api_client.ApiClient object at 0x7f513335a190> resource_path = '/data/00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237/metadata/json' method = 'PUT' path_params = [('id', '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237')] query_params = [] header_params = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.6/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...DVlMjlmN2NoMzE4YwowMDFhY2lkIHRpbWUgPCAxNzU3NDU1MDY00CjAwMmZzaWduYXR1cmUgQ191eCea02L277uT5UMyZPDYZaXjMtnwGqySKCANJ6ogK'} body = '{"id": 1}', post_params = [], files = {}, response_type = None auth_settings = ['api_key1', 'api_key2'], _return_http_data_only = True collection_formats = {}, _preload_content = True, _request_timeout = None def __call_api( self, resource_path, method, path_params=None, query_params=None, header_params=None, body=None, post_params=None, files=None, response_type=None, auth_settings=None, _return_http_data_only=None, collection_formats=None, _preload_content=True, _request_timeout=None): config = self.configuration # header parameters header_params = header_params or {} header_params.update(self.default_headers) if self.cookie: header_params['Cookie'] = self.cookie if header_params: header_params = self.sanitize_for_serialization(header_params) header_params = dict(self.parameters_to_tuples(header_params, collection_formats)) # path parameters if path_params: path_params = self.sanitize_for_serialization(path_params) path_params = self.parameters_to_tuples(path_params, collection_formats) for k, v in path_params: # specified safe chars, encode everything resource_path = resource_path.replace( '{%s}' % k, quote(str(v), safe=config.safe_chars_for_path_param) ) # query parameters if query_params: query_params = self.sanitize_for_serialization(query_params) query_params = self.parameters_to_tuples(query_params, collection_formats) # post parameters if post_params or files: post_params = self.prepare_post_parameters(post_params, files) post_params = self.sanitize_for_serialization(post_params) post_params = self.parameters_to_tuples(post_params, collection_formats) # auth setting self.update_params_for_auth(header_params, query_params, auth_settings) # body if body: body = self.sanitize_for_serialization(body) # request url url = self.configuration.host + resource_path # perform request and return response > response_data = self.request( method, url, query_params=query_params, headers=header_params, post_params=post_params, body=body, _preload_content=_preload_content, _request_timeout=_request_timeout) tests/mixed/oneprovider_client/api_client.py:158: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api_client.ApiClient object at 0x7f513335a190> method = 'PUT' url = 'https://dev-oneprovider-krakow.default.svc.cluster.local:443/api/v3/oneprovider/data/00000000005854E86775696423747261...35323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237/metadata/json' query_params = [] headers = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.6/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...DVlMjlmN2NoMzE4YwowMDFhY2lkIHRpbWUgPCAxNzU3NDU1MDY00CjAwMmZzaWduYXR1cmUgQ191eCea02L277uT5UMyZPDYZaXjMtnwGqySKCANJ6ogK'} post_params = [], body = '{"id": 1}', _preload_content = True _request_timeout = None def request(self, method, url, query_params=None, headers=None, post_params=None, body=None, _preload_content=True, _request_timeout=None): """Makes the HTTP request using RESTClient.""" if method == "GET": return self.rest_client.GET(url, query_params=query_params, _preload_content=_preload_content, _request_timeout=_request_timeout, headers=headers) elif method == "HEAD": return self.rest_client.HEAD(url, query_params=query_params, _preload_content=_preload_content, _request_timeout=_request_timeout, headers=headers) elif method == "OPTIONS": return self.rest_client.OPTIONS(url, query_params=query_params, headers=headers, post_params=post_params, _preload_content=_preload_content, _request_timeout=_request_timeout, body=body) elif method == "POST": return self.rest_client.POST(url, query_params=query_params, headers=headers, post_params=post_params, _preload_content=_preload_content, _request_timeout=_request_timeout, body=body) elif method == "PUT": > return self.rest_client.PUT(url, query_params=query_params, headers=headers, post_params=post_params, _preload_content=_preload_content, _request_timeout=_request_timeout, tests/mixed/oneprovider_client/api_client.py:376: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.rest.RESTClientObject object at 0x7f513335a1c0> url = 'https://dev-oneprovider-krakow.default.svc.cluster.local:443/api/v3/oneprovider/data/00000000005854E86775696423747261...35323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237/metadata/json' headers = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.6/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...DVlMjlmN2NoMzE4YwowMDFhY2lkIHRpbWUgPCAxNzU3NDU1MDY00CjAwMmZzaWduYXR1cmUgQ191eCea02L277uT5UMyZPDYZaXjMtnwGqySKCANJ6ogK'} query_params = [], post_params = [], body = '{"id": 1}', _preload_content = True _request_timeout = None def PUT(self, url, headers=None, query_params=None, post_params=None, body=None, _preload_content=True, _request_timeout=None): > return self.request("PUT", url, headers=headers, query_params=query_params, post_params=post_params, _preload_content=_preload_content, _request_timeout=_request_timeout, body=body) tests/mixed/oneprovider_client/rest.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.rest.RESTClientObject object at 0x7f513335a1c0> method = 'PUT' url = 'https://dev-oneprovider-krakow.default.svc.cluster.local:443/api/v3/oneprovider/data/00000000005854E86775696423747261...35323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237/metadata/json' query_params = [] headers = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.6/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...DVlMjlmN2NoMzE4YwowMDFhY2lkIHRpbWUgPCAxNzU3NDU1MDY00CjAwMmZzaWduYXR1cmUgQ191eCea02L277uT5UMyZPDYZaXjMtnwGqySKCANJ6ogK'} body = '{"id": 1}', post_params = {}, _preload_content = True _request_timeout = None def request(self, method, url, query_params=None, headers=None, body=None, post_params=None, _preload_content=True, _request_timeout=None): """Perform requests. :param method: http request method :param url: http request url :param query_params: query parameters in the url :param headers: http request headers :param body: request json body, for `application/json` :param post_params: request post parameters, `application/x-www-form-urlencoded` and `multipart/form-data` :param _preload_content: if False, the urllib3.HTTPResponse object will be returned without reading/decoding response data. Default is True. :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. """ method = method.upper() assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', 'PATCH', 'OPTIONS'] if post_params and body: raise ValueError( "body parameter cannot be used with post_params parameter." ) post_params = post_params or {} headers = headers or {} timeout = None if _request_timeout: if isinstance(_request_timeout, (int, ) if six.PY3 else (int, long)): # noqa: E501,F821 timeout = urllib3.Timeout(total=_request_timeout) elif (isinstance(_request_timeout, tuple) and len(_request_timeout) == 2): timeout = urllib3.Timeout( connect=_request_timeout[0], read=_request_timeout[1]) if 'Content-Type' not in headers: headers['Content-Type'] = 'application/json' try: # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: if query_params: url += '?' + urlencode(query_params) if re.search('json', headers['Content-Type'], re.IGNORECASE): request_body = '{}' if body is not None: request_body = json.dumps(body) r = self.pool_manager.request( method, url, body=request_body, preload_content=_preload_content, timeout=timeout, headers=headers) elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 r = self.pool_manager.request( method, url, fields=post_params, encode_multipart=False, preload_content=_preload_content, timeout=timeout, headers=headers) elif headers['Content-Type'] == 'multipart/form-data': # must del headers['Content-Type'], or the correct # Content-Type which generated by urllib3 will be # overwritten. del headers['Content-Type'] r = self.pool_manager.request( method, url, fields=post_params, encode_multipart=True, preload_content=_preload_content, timeout=timeout, headers=headers) # Pass a `string` parameter directly in the body to support # other content types than Json when `body` argument is # provided in serialized form elif isinstance(body, str): request_body = body r = self.pool_manager.request( method, url, body=request_body, preload_content=_preload_content, timeout=timeout, headers=headers) else: # Cannot generate the request from given parameters msg = """Cannot prepare a request message for provided arguments. Please check that your arguments match declared content type.""" raise ApiException(status=0, reason=msg) # For `GET`, `HEAD` else: r = self.pool_manager.request(method, url, fields=query_params, preload_content=_preload_content, timeout=timeout, headers=headers) except urllib3.exceptions.SSLError as e: msg = "{0}\n{1}".format(type(e).__name__, str(e)) raise ApiException(status=0, reason=msg) if _preload_content: r = RESTResponse(r) # In the python 3, the response.data is bytes. # we need to decode it to string. if six.PY3: r.data = r.data.decode('utf8') # log response body logger.debug("response body: %s", r.data) if not 200 <= r.status <= 299: > raise ApiException(http_resp=r) E oneprovider_client.rest.ApiException: (400) E Reason: Bad Request E HTTP response headers: HTTPHeaderDict({'access-control-allow-origin': '*', 'content-length': '110', 'content-type': 'application/json', 'date': 'Mon, 09 Sep 2024 21:57:51 GMT', 'server': 'Cowboy'}) E HTTP response body: {"error":{"id":"posix","details":{"errno":"eperm"},"description":"Operation failed with POSIX error: eperm."}} tests/mixed/oneprovider_client/rest.py:228: ApiException During handling of the above exception, another exception occurred: request = <FixtureRequest for <Function 'test_user_fails_to_add_metadata_to_the_trash_directory[1oz_1op_1oc]'>> @pytest.mark.usefixtures(*function_args) def scenario_wrapper(request): > _execute_scenario(feature, scenario, request, encoding) /usr/local/lib/python3.8/dist-packages/pytest_bdd/scenario.py:227: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/local/lib/python3.8/dist-packages/pytest_bdd/scenario.py:189: in _execute_scenario _execute_step_function(request, scenario, step, step_func) /usr/local/lib/python3.8/dist-packages/pytest_bdd/scenario.py:130: in _execute_step_function step_func(**kwargs) tests/utils/bdd_utils.py:78: in wrapper return fun(*ba.args, **ba.kwargs) tests/mixed/steps/rest/onezone/special_dirs.py:232: in try_to_add_json_metadata_to_special_dir try_to_add_json_metadata_to_special_dir_by_id( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ user = 'user1' users = {'admin': <tests.utils.user_utils.AdminUser object at 0x7f513335b280>, 'admin2': <tests.utils.user_utils.User object a...s.user_utils.AdminUser object at 0x7f513335b2b0>, 'user1': <tests.utils.user_utils.User object at 0x7f513335b8e0>, ...} hosts = {'oneclient-1': {'container-id': '02f949607dca5ff28fa192c62abccf33dfb6f6ff00ac37bd72c729c0cb830451', 'ip': '10.244.174...7bf1f006d0815', 'hostname': 'dev-onezone.default.svc.cluster.local', 'ip': '10.244.174.1', 'name': 'dev-onezone', ...}} host = 'oneprovider-1' dir_id = '00000000005854E8677569642374726173685F6264366233393562303639343138373763303661643866316635323865393131636861633237236264366233393562303639343138373763303661643866316635323865393131636861633237' expression = '{"id": 1}' err_msg = 'Json metadata added to trash dir, but adding should have failed' def try_to_add_json_metadata_to_special_dir_by_id( user, users, hosts, host, dir_id, expression, err_msg=''): try: add_json_metadata_to_file_rest(user, users, hosts, host, expression, dir_id) raise Exception(err_msg) except ApiException as e: ex_err_msg = 'You are not authorized to perform this operation.' > assert ex_err_msg in str(e) E AssertionError tests/mixed/steps/rest/onezone/special_dirs.py:246: AssertionError