You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2020/11/17 20:18:12 UTC
[airavata-django-portal-sdk] branch master updated: AIRAVATA-3389
Skip broken symlinks in user storage
This is an automated email from the ASF dual-hosted git repository.
machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal-sdk.git
The following commit(s) were added to refs/heads/master by this push:
new 226d740 AIRAVATA-3389 Skip broken symlinks in user storage
226d740 is described below
commit 226d740e3d70369aba49f052b85bf5cb1110e2c9
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Tue Nov 17 15:17:42 2020 -0500
AIRAVATA-3389 Skip broken symlinks in user storage
---
airavata_django_portal_sdk/user_storage.py | 9 ++++++
tests/test_user_storage.py | 51 ++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+)
diff --git a/airavata_django_portal_sdk/user_storage.py b/airavata_django_portal_sdk/user_storage.py
index d98c508..42f6b6b 100644
--- a/airavata_django_portal_sdk/user_storage.py
+++ b/airavata_django_portal_sdk/user_storage.py
@@ -366,6 +366,10 @@ def listdir(request, path):
files_data = []
for f in files:
user_rel_path = os.path.join(path, f)
+ if not datastore.exists(request.user.username, user_rel_path):
+ logger.warning(f"listdir skipping {request.user.username}:{user_rel_path}, "
+ "does not exist (broken symlink?)")
+ continue
created_time = datastore.get_created_time(
request.user.username, user_rel_path
)
@@ -430,6 +434,11 @@ def list_experiment_dir(request, experiment_id, path=None):
files_data = []
for f in files:
user_rel_path = os.path.join(path, f)
+ if not datastore.exists(exp_owner, user_rel_path):
+ logger.warning(
+ f"list_experiment_dir skipping {exp_owner}:{user_rel_path}, "
+ "does not exist (broken symlink?)")
+ continue
created_time = datastore.get_created_time(
exp_owner, user_rel_path
)
diff --git a/tests/test_user_storage.py b/tests/test_user_storage.py
index 9f637d4..30aacf3 100644
--- a/tests/test_user_storage.py
+++ b/tests/test_user_storage.py
@@ -180,3 +180,54 @@ class CopyInputFileUploadTests(BaseTestCase):
os.path.dirname(replica_copy_filepath),
os.path.join(tmpdirname, self.user.username, "tmp"),
msg="Verify input file copied to user's tmp dir")
+
+
+class ListDirTests(BaseTestCase):
+ def test_listdir(self):
+ "Verify basic listdir functionality"
+ with tempfile.TemporaryDirectory() as tmpdirname, \
+ self.settings(GATEWAY_DATA_STORE_DIR=tmpdirname,
+ GATEWAY_DATA_STORE_HOSTNAME="gateway.com"):
+ # create test file
+ test_file_path = os.path.join(
+ tmpdirname, self.user.username, "foo.ext")
+ os.makedirs(os.path.dirname(test_file_path))
+ with open(test_file_path, 'wb') as f:
+ f.write(b"123")
+ # create test directory
+ os.makedirs(os.path.join(tmpdirname, self.user.username, "testdir"))
+
+ dirs, files = user_storage.listdir(self.request, "")
+ self.assertEqual(len(dirs), 1)
+ self.assertEqual("testdir", dirs[0]["name"])
+ self.assertEqual(len(files), 1)
+ self.assertEqual("foo.ext", files[0]["name"])
+
+ def test_listdir_broken_symlink(self):
+ "Test that broken symlinks are ignored"
+ with tempfile.TemporaryDirectory() as tmpdirname, \
+ self.settings(GATEWAY_DATA_STORE_DIR=tmpdirname,
+ GATEWAY_DATA_STORE_HOSTNAME="gateway.com"):
+ # create test file
+ test_file_path = os.path.join(
+ tmpdirname, self.user.username, "foo.ext")
+ os.makedirs(os.path.dirname(test_file_path))
+ with open(test_file_path, 'wb') as f:
+ f.write(b"123")
+ # create test directory
+ os.makedirs(os.path.join(tmpdirname, self.user.username, "testdir"))
+ # create broken symlink
+ not_existent = os.path.join("path", "does", "not", "exist")
+ self.assertFalse(os.path.exists(not_existent))
+ os.symlink(not_existent, os.path.join(tmpdirname, self.user.username, "broken-symlink"))
+ self.assertIn("broken-symlink", os.listdir(os.path.join(tmpdirname, self.user.username)))
+ # os.path.exists returns False for broken symbolic link
+ self.assertFalse(os.path.exists(os.path.join(tmpdirname, self.user.username, "broken-symlink")))
+
+ dirs, files = user_storage.listdir(self.request, "")
+ # verify test file and directory are returned, but not broken-symlink
+ self.assertEqual(len(dirs), 1)
+ self.assertEqual("testdir", dirs[0]["name"])
+ self.assertEqual(len(files), 1)
+ self.assertEqual("foo.ext", files[0]["name"])
+ pass