Skip to content

Commit 32e76a0

Browse files
committed
SDK-348
Add tests for handling strict permission errors during file operations and simplify permission error handling logic
1 parent c9bd7a0 commit 32e76a0

3 files changed

Lines changed: 48 additions & 32 deletions

File tree

cterasdk/cio/core/commands.py

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,54 +40,56 @@ def _extract_rc_msg(result):
4040
return getattr(result, 'rc', None), getattr(result, 'msg', None)
4141

4242

43-
_STRICT_PERMISSION_ERROR_SET = {
44-
(None, None),
45-
(None, ''),
46-
(0, None),
47-
('0', None),
48-
(None, 'permission denied'),
49-
(None, 'access denied'),
50-
(None, 'read only'),
51-
(None, 'action is not allowed'),
52-
('permissiondenied', None),
53-
(None, 'permissiondenied'),
54-
('permissiondenied', 'permissiondenied'),
43+
_STRICT_PERMISSION_DENIED_MESSAGES = {
44+
'permission denied',
45+
'access denied',
46+
'read only',
47+
'action is not allowed',
5548
}
5649

57-
_STRICT_PERMISSION_TASK_ERROR_SET = {
58-
(None, None, 'permissiondenied'),
59-
(None, None, 'permission denied'),
60-
(None, None, 'access denied'),
61-
(None, None, 'read only'),
62-
(None, None, 'action is not allowed'),
63-
(None, 'permission denied', None),
64-
(None, 'access denied', None),
65-
(None, 'read only', None),
66-
(None, 'action is not allowed', None),
67-
(0, None, 'permissiondenied'),
68-
('0', None, 'permissiondenied'),
69-
}
50+
# Some APIs return condensed "permissiondenied" in rc/msg/error_type.
51+
_STRICT_PERMISSION_DENIED_TOKENS = {'permissiondenied'}
52+
_STRICT_PERMISSION_AMBIGUOUS_RC = {None, 0, '0'}
53+
_STRICT_PERMISSION_EMPTY_MESSAGES = {None, ''}
7054

7155

7256
def _raise_strict_permission_denied(result, path):
73-
rc, msg = _extract_rc_msg(result)
74-
rc = _normalize_rc(rc)
75-
msg = _normalize_msg(msg)
57+
rc, msg = _extract_normalized_rc_msg(result)
7658
logger.info(
7759
'strict_permission response for %s: rc=%r msg=%r raw=%s',
7860
path, rc, msg, type(result).__name__
7961
)
80-
if (rc, msg) in _STRICT_PERMISSION_ERROR_SET:
62+
if _is_strict_permission_denied_response(rc, msg):
8163
raise exceptions.io.core.PrivilegeError(path)
8264

8365

84-
def _extract_task_error_tuple(result):
66+
def _extract_normalized_rc_msg(result):
67+
rc, msg = _extract_rc_msg(result)
68+
return _normalize_rc(rc), _normalize_msg(msg)
69+
70+
71+
def _extract_task_error_fields(result):
8572
rc = _normalize_rc(getattr(result, 'rc', None))
8673
msg = _normalize_msg(getattr(result, 'msg', None))
8774
error_type = _normalize_msg(getattr(result, 'error_type', None))
8875
return rc, msg, error_type
8976

9077

78+
def _is_strict_permission_denied_response(rc, msg):
79+
if msg in _STRICT_PERMISSION_DENIED_MESSAGES:
80+
return True
81+
if rc in _STRICT_PERMISSION_DENIED_TOKENS or msg in _STRICT_PERMISSION_DENIED_TOKENS:
82+
return True
83+
return rc in _STRICT_PERMISSION_AMBIGUOUS_RC and msg in _STRICT_PERMISSION_EMPTY_MESSAGES
84+
85+
86+
def _is_strict_permission_denied_task(rc, msg, error_type):
87+
_ = rc
88+
if error_type in _STRICT_PERMISSION_DENIED_MESSAGES or error_type in _STRICT_PERMISSION_DENIED_TOKENS:
89+
return True
90+
return msg in _STRICT_PERMISSION_DENIED_MESSAGES
91+
92+
9193
def split_file_directory(listdir, receiver, destination):
9294
"""
9395
Split a path into its parent directory and final component.
@@ -1022,8 +1024,8 @@ async def _a_execute(self):
10221024

10231025
def _handle_response(self, r):
10241026
if self._strict_permission:
1025-
rc, msg, error_type = _extract_task_error_tuple(r)
1026-
if (rc, msg, error_type) in _STRICT_PERMISSION_TASK_ERROR_SET:
1027+
rc, msg, error_type = _extract_task_error_fields(r)
1028+
if _is_strict_permission_denied_task(rc, msg, error_type):
10271029
raise exceptions.io.core.PrivilegeError('')
10281030
if not self.block:
10291031
return r

tests/ut/core/user/test_mkdir.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ def test_mkdir_strict_permission_denied(self):
3636
with self.assertRaises(exceptions.io.core.PrivilegeError):
3737
self._services.files.mkdir(self._directory, strict_permission=True)
3838

39+
def test_mkdir_strict_permission_denied_message(self):
40+
execute_response = Object(msg='access denied')
41+
self._init_services(execute_response=execute_response)
42+
with self.assertRaises(exceptions.io.core.PrivilegeError):
43+
self._services.files.mkdir(self._directory, strict_permission=True)
44+
3945
def test_makedirs_strict_permission_root_path(self):
4046
rooted_directories = 'Team Portal/Engineering/Documents'
4147
self._init_services(execute_response=None)

tests/ut/core/user/test_move.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ def test_move_strict_permission_denied(self):
3232
self._services.files.move(self._source, destination=self._dest, strict_permission=True)
3333
self._services.tasks.wait.assert_called_once_with(self._task_reference)
3434

35+
def test_move_strict_permission_denied_error_type(self):
36+
task = Object(error_type='permissiondenied')
37+
self._services.tasks.wait = mock.MagicMock(return_value=task)
38+
self._init_services(execute_response=self._task_reference)
39+
with self.assertRaises(exceptions.io.core.PrivilegeError):
40+
self._services.files.move(self._source, destination=self._dest, strict_permission=True)
41+
self._services.tasks.wait.assert_called_once_with(self._task_reference)
42+
3543
def test_move_completed_with_warnings_raises_move_error(self):
3644
task = mock.MagicMock()
3745
task.completed = False

0 commit comments

Comments
 (0)