Acceptance tests using different clients concurrently. Environment deployed from packages.
Build: #3212 failed
Job: Spaces basic failed
user fails to remove the share root directory[1oz 1op 1oc-RESt]: Test case result
The below summarizes the result of the test " user fails to remove the share root directory[1oz 1op 1oc-RESt]" in build 3,212 of Onedata Products - mixed acceptance pkg - Spaces basic.
- Description
- user fails to remove the share root directory[1oz 1op 1oc-RESt]
- Test class
- mixed.scenarios.test_spaces_basic
- Method
- test_user_fails_to_remove_the_share_root_directory[1oz_1op_1oc-REST]
- Jira Issue
-
- Duration
- 13 secs
- Status
- Failed (New Failure)
Error Log
AssertionError: Unexpected error occurred (400) Reason: Bad Request HTTP response headers: HTTPHeaderDict({'access-control-allow-origin': '*', 'content-length': '80', 'content-type': 'application/json', 'date': 'Wed, 21 Aug 2024 20:06:44 GMT', 'server': 'Cowboy'}) HTTP response body: {"error":{"id":"notSupported","description":"This operation is not supported."}} client = 'rest' users = {'admin': <tests.utils.user_utils.AdminUser object at 0x7f8561e564c0>, 'admin2': <tests.utils.user_utils.User object a...s.user_utils.AdminUser object at 0x7f8561e564f0>, 'user1': <tests.utils.user_utils.User object at 0x7f8561e56e20>, ...} user = 'user1' hosts = {'oneclient-1': {'container-id': '1e40d8b755b8e84f79ae52598ab9c6287ce44bed538830b26861d92107377aad', 'ip': '10.244.175...e5bee25ef46', 'hostname': 'dev-onezone.default.svc.cluster.local', 'ip': '10.244.175.186', 'name': 'dev-onezone', ...}} host = 'oneprovider-1' dir_id = '00000000008449AC7368617265477569642373706163655F336333373635396635343930346632386230353037336264373335396531313763683...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' err_msg = 'share root dir was deleted!' def try_to_remove_special_dir_by_id(client, users, user, hosts, host, dir_id, err_msg=''): if client.lower() == 'rest': try: > remove_file_by_id_rest(users, user, hosts, host, dir_id) tests/mixed/steps/rest/onezone/special_dirs.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ users = {'admin': <tests.utils.user_utils.AdminUser object at 0x7f8561e564c0>, 'admin2': <tests.utils.user_utils.User object a...s.user_utils.AdminUser object at 0x7f8561e564f0>, 'user1': <tests.utils.user_utils.User object at 0x7f8561e56e20>, ...} user = 'user1' hosts = {'oneclient-1': {'container-id': '1e40d8b755b8e84f79ae52598ab9c6287ce44bed538830b26861d92107377aad', 'ip': '10.244.175...e5bee25ef46', 'hostname': 'dev-onezone.default.svc.cluster.local', 'ip': '10.244.175.186', 'name': 'dev-onezone', ...}} host = 'oneprovider-1' file_id = '00000000008449AC7368617265477569642373706163655F336333373635396635343930346632386230353037336264373335396531313763683...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' def remove_file_by_id_rest(users, user, hosts, host, file_id): user_client_op = login_to_provider(user, users, hosts[host]['hostname']) file_api = BasicFileOperationsApi(user_client_op) > file_api.remove_file(file_id) tests/mixed/steps/rest/oneprovider/data.py:377: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api.basic_file_operations_api.BasicFileOperationsApi object at 0x7f8561e512b0> id = '00000000008449AC7368617265477569642373706163655F336333373635396635343930346632386230353037336264373335396531313763683...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' kwargs = {'_return_http_data_only': True} def remove_file(self, id, **kwargs): # noqa: E501 """Remove file # noqa: E501 Removes file specified by [$FILE_ID](#operation/lookup_file_id). In case of a directory, all its children are recursively removed - note that the operation will fail part-way if the client does not have permissions to remove some of the nested files/directories. ***Example cURL requests*** **Remove specific file** ```bash curl -H \"X-Auth-Token: $TOKEN\" -X DELETE \"https://$PROVIDER_HOST/api/v3/oneprovider/data/$FILE_ID\" ``` See also [Remove file at path](#operation/remove_file_at_path). # noqa: E501 This method makes a synchronous HTTP request by default. To make an asynchronous HTTP request, please pass async_req=True >>> thread = api.remove_file(id, async_req=True) >>> result = thread.get() :param async_req bool :param str id: File or directory Id (required) :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.remove_file_with_http_info(id, **kwargs) # noqa: E501 else: > (data) = self.remove_file_with_http_info(id, **kwargs) # noqa: E501 tests/mixed/oneprovider_client/api/basic_file_operations_api.py:1034: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api.basic_file_operations_api.BasicFileOperationsApi object at 0x7f8561e512b0> id = '00000000008449AC7368617265477569642373706163655F336333373635396635343930346632386230353037336264373335396531313763683...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' kwargs = {'_return_http_data_only': True} all_params = ['id', 'async_req', '_return_http_data_only', '_preload_content', '_request_timeout'] params = {'_return_http_data_only': True, 'all_params': ['id', 'async_req', '_return_http_data_only', '_preload_content', '_request_timeout'], 'auth_settings': ['api_key1', 'api_key2'], 'body_params': None, ...} key = '_return_http_data_only', val = True, collection_formats = {} path_params = {'id': '00000000008449AC7368617265477569642373706163655F33633337363539663534393034663238623035303733626437333539653131...530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338'} query_params = [] def remove_file_with_http_info(self, id, **kwargs): # noqa: E501 """Remove file # noqa: E501 Removes file specified by [$FILE_ID](#operation/lookup_file_id). In case of a directory, all its children are recursively removed - note that the operation will fail part-way if the client does not have permissions to remove some of the nested files/directories. ***Example cURL requests*** **Remove specific file** ```bash curl -H \"X-Auth-Token: $TOKEN\" -X DELETE \"https://$PROVIDER_HOST/api/v3/oneprovider/data/$FILE_ID\" ``` See also [Remove file at path](#operation/remove_file_at_path). # noqa: E501 This method makes a synchronous HTTP request by default. To make an asynchronous HTTP request, please pass async_req=True >>> thread = api.remove_file_with_http_info(id, async_req=True) >>> result = thread.get() :param async_req bool :param str id: File or directory Id (required) :return: None If the method is called asynchronously, returns the request thread. """ all_params = ['id'] # 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 remove_file" % 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 `remove_file`") # noqa: E501 collection_formats = {} path_params = {} if 'id' in params: path_params['id'] = params['id'] # noqa: E501 query_params = [] header_params = {} form_params = [] local_var_files = {} body_params = None # Authentication setting auth_settings = ['api_key1', 'api_key2'] # noqa: E501 > return self.api_client.call_api( '/data/{id}', 'DELETE', 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/basic_file_operations_api.py:1090: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.api_client.ApiClient object at 0x7f8561e51130> resource_path = '/data/{id}', method = 'DELETE' path_params = {'id': '00000000008449AC7368617265477569642373706163655F33633337363539663534393034663238623035303733626437333539653131...530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338'} query_params = [], header_params = {}, body = None, 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 0x7f8561e51130> resource_path = '/data/00000000008449AC7368617265477569642373706163655F336333373635396635343930346632386230353037336264373335396531313...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' method = 'DELETE' path_params = [('id', '00000000008449AC7368617265477569642373706163655F3363333736353966353439303466323862303530373362643733353965313...30373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338')] query_params = [] header_params = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.5/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...Y1OTU00NmNoZDY5ZgowMDFhY2lkIHRpbWUgPCAxNzU1ODA2Nzk5CjAwMmZzaWduYXR1cmUgYx4fcn8KH7ycT7hmdtr02VefiC2UzYPmpzluT028MmyyUK'} body = None, 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 0x7f8561e51130> method = 'DELETE' url = 'https://dev-oneprovider-krakow.default.svc.cluster.local:443/api/v3/oneprovider/data/00000000008449AC7368617265477569...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' query_params = [] headers = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.5/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...Y1OTU00NmNoZDY5ZgowMDFhY2lkIHRpbWUgPCAxNzU1ODA2Nzk5CjAwMmZzaWduYXR1cmUgYx4fcn8KH7ycT7hmdtr02VefiC2UzYPmpzluT028MmyyUK'} post_params = [], body = None, _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, body=body) elif method == "PATCH": return self.rest_client.PATCH(url, query_params=query_params, headers=headers, post_params=post_params, _preload_content=_preload_content, _request_timeout=_request_timeout, body=body) elif method == "DELETE": > return self.rest_client.DELETE(url, query_params=query_params, headers=headers, _preload_content=_preload_content, _request_timeout=_request_timeout, body=body) tests/mixed/oneprovider_client/api_client.py:392: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.rest.RESTClientObject object at 0x7f8561e51160> url = 'https://dev-oneprovider-krakow.default.svc.cluster.local:443/api/v3/oneprovider/data/00000000008449AC7368617265477569...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' headers = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.5/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...Y1OTU00NmNoZDY5ZgowMDFhY2lkIHRpbWUgPCAxNzU1ODA2Nzk5CjAwMmZzaWduYXR1cmUgYx4fcn8KH7ycT7hmdtr02VefiC2UzYPmpzluT028MmyyUK'} query_params = [], body = None, _preload_content = True, _request_timeout = None def DELETE(self, url, headers=None, query_params=None, body=None, _preload_content=True, _request_timeout=None): > return self.request("DELETE", url, headers=headers, query_params=query_params, _preload_content=_preload_content, _request_timeout=_request_timeout, body=body) tests/mixed/oneprovider_client/rest.py:260: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <oneprovider_client.rest.RESTClientObject object at 0x7f8561e51160> method = 'DELETE' url = 'https://dev-oneprovider-krakow.default.svc.cluster.local:443/api/v3/oneprovider/data/00000000008449AC7368617265477569...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' query_params = [] headers = {'Content-Type': 'application/json', 'User-Agent': 'Swagger-Codegen/21.02.5/python', 'X-Auth-Token': 'MDAzM2xvY2F00aW9...Y1OTU00NmNoZDY5ZgowMDFhY2lkIHRpbWUgPCAxNzU1ODA2Nzk5CjAwMmZzaWduYXR1cmUgYx4fcn8KH7ycT7hmdtr02VefiC2UzYPmpzluT028MmyyUK'} body = None, 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': '80', 'content-type': 'application/json', 'date': 'Wed, 21 Aug 2024 20:06:44 GMT', 'server': 'Cowboy'}) E HTTP response body: {"error":{"id":"notSupported","description":"This operation is not supported."}} 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_remove_the_share_root_directory[1oz_1op_1oc-REST]'>> @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:79: in try_to_remove_special_dir try_to_remove_special_dir_by_id( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ client = 'rest' users = {'admin': <tests.utils.user_utils.AdminUser object at 0x7f8561e564c0>, 'admin2': <tests.utils.user_utils.User object a...s.user_utils.AdminUser object at 0x7f8561e564f0>, 'user1': <tests.utils.user_utils.User object at 0x7f8561e56e20>, ...} user = 'user1' hosts = {'oneclient-1': {'container-id': '1e40d8b755b8e84f79ae52598ab9c6287ce44bed538830b26861d92107377aad', 'ip': '10.244.175...e5bee25ef46', 'hostname': 'dev-onezone.default.svc.cluster.local', 'ip': '10.244.175.186', 'name': 'dev-onezone', ...}} host = 'oneprovider-1' dir_id = '00000000008449AC7368617265477569642373706163655F336333373635396635343930346632386230353037336264373335396531313763683...3530373362643733353965313137636830316139233665323534343266666235313766353239623238646330663666353966303432636830656338' err_msg = 'share root dir was deleted!' def try_to_remove_special_dir_by_id(client, users, user, hosts, host, dir_id, err_msg=''): if client.lower() == 'rest': try: remove_file_by_id_rest(users, user, hosts, host, dir_id) raise Exception(err_msg) except ApiException as e: ex_err_msg = 'Operation failed with POSIX error: eperm.' > assert ex_err_msg in str(e), f'Unexpected error occurred {e}' E AssertionError: Unexpected error occurred (400) E Reason: Bad Request E HTTP response headers: HTTPHeaderDict({'access-control-allow-origin': '*', 'content-length': '80', 'content-type': 'application/json', 'date': 'Wed, 21 Aug 2024 20:06:44 GMT', 'server': 'Cowboy'}) E HTTP response body: {"error":{"id":"notSupported","description":"This operation is not supported."}} tests/mixed/steps/rest/onezone/special_dirs.py:92: AssertionError