This is an automated email from the ASF dual-hosted git repository. machristie pushed a commit to branch airavata-3016 in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git
commit a63fd110934186914b22d3dc2778832e0bdff371 Author: Marcus Christie <[email protected]> AuthorDate: Mon May 27 17:24:38 2019 -0400 AIRAVATA-3032 Copy cloned input files to tmp input file dir --- django_airavata/apps/api/data_products_helper.py | 10 +++++ django_airavata/apps/api/datastore.py | 8 ++-- django_airavata/apps/api/views.py | 56 +++++++++++------------- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/django_airavata/apps/api/data_products_helper.py b/django_airavata/apps/api/data_products_helper.py index b085e87..08ce7e0 100644 --- a/django_airavata/apps/api/data_products_helper.py +++ b/django_airavata/apps/api/data_products_helper.py @@ -36,6 +36,16 @@ def save_input_file_upload(request, file): return data_product +def copy_input_file_upload(request, data_product): + path = _get_replica_filepath(data_product) + name = data_product.productName + full_path = datastore.copy(request.user.username, + path, + TMP_INPUT_FILE_UPLOAD_DIR, + name=name) + return _save_data_product(request, full_path, name=name) + + def is_input_file_upload(request, data_product): path = _get_replica_filepath(data_product) rel_path = datastore.rel_path(request.user.username, path) diff --git a/django_airavata/apps/api/datastore.py b/django_airavata/apps/api/datastore.py index 2fc0965..6369d22 100644 --- a/django_airavata/apps/api/datastore.py +++ b/django_airavata/apps/api/datastore.py @@ -29,10 +29,10 @@ def open(username, path): raise ObjectDoesNotExist("File path does not exist: {}".format(path)) -def save(username, path, file): +def save(username, path, file, name=None): """Save file to username/path in data store.""" # file.name may be full path, so get just the name of the file - file_name = os.path.basename(file.name) + file_name = name if name is not None else os.path.basename(file.name) user_data_storage = _user_data_storage(username) file_path = os.path.join( path, user_data_storage.get_valid_name(file_name)) @@ -57,10 +57,10 @@ def create_user_dir(username, path): "Directory {} already exists".format(path)) -def copy(username, source_path, target_path): +def copy(username, source_path, target_path, name=None): """Copy a user file into target_path dir.""" f = open(username, source_path) - return save(username, target_path, f) + return save(username, target_path, f, name=name) def delete(username, path): diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py index 4ec398e..c3e652c 100644 --- a/django_airavata/apps/api/views.py +++ b/django_airavata/apps/api/views.py @@ -287,7 +287,9 @@ class ExperimentViewSet(APIBackedViewSet): # Create a copy of the experiment input files self._copy_cloned_experiment_input_uris(cloned_experiment) - self._set_storage_id_and_data_dir(cloned_experiment) + # Null out experimentDataDir so a new one will get created at launch + # time + cloned_experiment.userConfigurationData.experimentDataDir = None request.airavata_client.updateExperiment( self.authz_token, cloned_experiment.experimentId, cloned_experiment ) @@ -322,54 +324,46 @@ class ExperimentViewSet(APIBackedViewSet): self.authz_token, entity_id, ResourcePermissionType.WRITE) def _copy_cloned_experiment_input_uris(self, cloned_experiment): - # update the experimentInputs of type URI, copying files in data store - request = self.request - # TODO: create experiment data directory and copy inputs into it - target_project = request.airavata_client.getProject( - self.authz_token, cloned_experiment.projectId) + # update the experimentInputs of type URI, copying input files into the + # tmp input files directory of the data store for experiment_input in cloned_experiment.experimentInputs: + # skip inputs without values + if not experiment_input.value: + continue if experiment_input.type == DataType.URI: - data_product_uri = self._copy_experiment_input_uri( - experiment_input.value, target_project, cloned_experiment) - if data_product_uri is None: + cloned_data_product = self._copy_experiment_input_uri( + experiment_input.value) + if cloned_data_product is None: log.warning("Setting cloned input {} to null".format( experiment_input.name)) - experiment_input.value = data_product_uri + experiment_input.value = None + else: + experiment_input.value = cloned_data_product.productUri elif experiment_input.type == DataType.URI_COLLECTION: data_product_uris = experiment_input.value.split( ",") if experiment_input.value else [] cloned_data_product_uris = [] for data_product_uri in data_product_uris: - cloned_data_product_uri = self._copy_experiment_input_uri( - data_product_uri, target_project, cloned_experiment) - if cloned_data_product_uri is None: + cloned_data_product = self._copy_experiment_input_uri( + data_product_uri) + if cloned_data_product.productUri is None: log.warning( "Omitting a cloned input value for {}".format( experiment_input.name)) else: cloned_data_product_uris.append( - cloned_data_product_uri) + cloned_data_product.productUri) experiment_input.value = ",".join(cloned_data_product_uris) def _copy_experiment_input_uri( self, - source_data_product_uri, - project, - experiment): - request = self.request - source_data_product = request.airavata_client.getDataProduct( - self.authz_token, source_data_product_uri) - try: - copied_data_product = datastore.copy( - self.username, - project.name, - experiment.experimentName, - source_data_product) - data_product_uri = \ - request.airavata_client.registerDataProduct( - self.authz_token, copied_data_product) - return data_product_uri - except ObjectDoesNotExist as odne: + data_product_uri): + source_data_product = self.request.airavata_client.getDataProduct( + self.authz_token, data_product_uri) + if data_products_helper.exists(self.request, source_data_product): + return data_products_helper.copy_input_file_upload( + self.request, source_data_product) + else: log.warning("Could not find file for source data " "product {}".format(source_data_product)) return None
