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 2019/05/12 12:28:42 UTC

[airavata-django-portal] branch master updated: Validate and create passed in experimentDataDir

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.git


The following commit(s) were added to refs/heads/master by this push:
     new 3b9742d  Validate and create passed in experimentDataDir
3b9742d is described below

commit 3b9742d1a79f50c53accdf8e31c48a045bad4b42
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Sun May 12 08:25:06 2019 -0400

    Validate and create passed in experimentDataDir
---
 django_airavata/apps/api/datastore.py | 33 +++++++++++++++++++++++++--------
 django_airavata/apps/api/views.py     |  7 +++++++
 2 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/django_airavata/apps/api/datastore.py b/django_airavata/apps/api/datastore.py
index 3deb2fc..eb0de66 100644
--- a/django_airavata/apps/api/datastore.py
+++ b/django_airavata/apps/api/datastore.py
@@ -113,13 +113,23 @@ def delete(data_product):
         raise ObjectDoesNotExist("Replica file does not exist")
 
 
-def get_experiment_dir(username, project_name, experiment_name):
+def get_experiment_dir(
+        username,
+        project_name=None,
+        experiment_name=None,
+        path=None):
     """Return an experiment directory (full path) for the given experiment."""
-    experiment_dir_name = os.path.join(
-        _user_dir_name(username),
-        experiment_data_storage.get_valid_name(project_name),
-        experiment_data_storage.get_valid_name(experiment_name))
-    experiment_dir = experiment_data_storage.path(experiment_dir_name)
+    if path is None:
+        experiment_dir_name = os.path.join(
+            _user_dir_name(username),
+            experiment_data_storage.get_valid_name(project_name),
+            experiment_data_storage.get_valid_name(experiment_name))
+        experiment_dir = experiment_data_storage.path(experiment_dir_name)
+    else:
+        # path can be relative to the user's storage space or absolute (as long
+        # as it is still inside the user's storage space)
+        user_experiment_data_storage = _user_data_storage(username)
+        experiment_dir = user_experiment_data_storage.path(path)
     if not experiment_data_storage.exists(experiment_dir):
         os.makedirs(experiment_dir,
                     mode=experiment_data_storage.directory_permissions_mode)
@@ -132,8 +142,9 @@ def get_experiment_dir(username, project_name, experiment_name):
 def user_file_exists(username, file_path):
     """Check if file path exists in user's data storage space."""
     try:
-        return experiment_data_storage.exists(
-            os.path.join(_user_dir_name(username), file_path))
+        # file_path can be relative or absolute
+        user_experiment_data_storage = _user_data_storage(username)
+        return user_experiment_data_storage.exists(file_path)
     except SuspiciousFileOperation as e:
         logger.warning(
             "File does not exist for user {} at file path {}".format(
@@ -188,3 +199,9 @@ def _create_data_product(username, full_path):
 
 def _user_dir_name(username):
     return experiment_data_storage.get_valid_name(username)
+
+
+def _user_data_storage(username):
+    return FileSystemStorage(
+        location=os.path.join(settings.GATEWAY_DATA_STORE_DIR,
+                              _user_dir_name(username)))
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 83c0423..b6c926b 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -198,6 +198,13 @@ class ExperimentViewSet(APIBackedViewSet):
                                                    project.name,
                                                    experiment.experimentName)
             experiment.userConfigurationData.experimentDataDir = exp_dir
+        else:
+            # get_experiment_dir will also validate that absolute paths are
+            # inside the user's storage directory
+            exp_dir = datastore.get_experiment_dir(
+                self.username,
+                path=experiment.userConfigurationData.experimentDataDir)
+            experiment.userConfigurationData.experimentDataDir = exp_dir
 
     @detail_route(methods=['post'])
     def launch(self, request, experiment_id=None):