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):