diff --git a/src/python/OBis/obis/dm/config.py b/src/python/OBis/obis/dm/config.py index f7863e963c52342f4699a402ec57f466c99959a8..d5bde2cd9fccb5ebd12da536d559c1c812e8d59d 100644 --- a/src/python/OBis/obis/dm/config.py +++ b/src/python/OBis/obis/dm/config.py @@ -87,6 +87,7 @@ class ConfigEnv(object): self.add_param(ConfigParam(name='user', private=True)) self.add_param(ConfigParam(name='verify_certificates', private=True, is_json=True)) self.add_param(ConfigParam(name='external_dms_id', private=True)) + self.add_param(ConfigParam(name='repository_id', private=True)) self.add_param(ConfigParam(name='object_id', private=False)) self.add_param(ConfigParam(name='data_set_id', private=False)) self.add_param(ConfigParam(name='data_set_type', private=False)) diff --git a/src/python/OBis/obis/dm/data_mgmt.py b/src/python/OBis/obis/dm/data_mgmt.py index a93e0fce36698c2e9118128c70f5ff00835e1290..cab65baa2f092e0d738c049762a2b255bff43912 100644 --- a/src/python/OBis/obis/dm/data_mgmt.py +++ b/src/python/OBis/obis/dm/data_mgmt.py @@ -18,6 +18,7 @@ from . import config as dm_config import traceback import getpass import socket +import uuid import pybis @@ -402,6 +403,9 @@ class OpenbisSync(object): def external_dms_id(self): return self.config_dict.get('external_dms_id') + def repository_id(self): + return self.config_dict.get('repository_id') + def data_set_type(self): return self.config_dict.get('data_set_type') @@ -486,7 +490,7 @@ class OpenbisSync(object): except ValueError as e: return CommandResult(returncode=-1, output=str(e)), None - def create_data_set(self, data_set_code, external_dms): + def create_data_set(self, data_set_code, external_dms, repository_id): data_set_type = self.data_set_type() parent_data_set_id = self.data_set_id() properties = self.data_set_properties() @@ -501,7 +505,7 @@ class OpenbisSync(object): object_id = self.object_id() contents = GitRepoFileInfo(self.git_wrapper).contents() try: - data_set = self.openbis.new_git_data_set(data_set_type, top_level_path, commit_id, external_dms.code, + data_set = self.openbis.new_git_data_set(data_set_type, top_level_path, commit_id, repository_id, external_dms.code, object_id, data_set_code=data_set_code, parents=parent_data_set_id, properties=properties, contents=contents) return CommandResult(returncode=0, output=""), data_set @@ -523,6 +527,14 @@ class OpenbisSync(object): return result return CommandResult(returncode=0, output="") + def prepare_repository_id(self): + repository_id = self.repository_id() + if self.repository_id() is None: + repository_id = str(uuid.uuid4()) + self.config_resolver.set_value_for_parameter('repository_id', repository_id, 'local') + return CommandResult(returncode=0, output=repository_id) + + def prepare_external_dms(self): # If there is no external data management system, create one. external_dms = self.get_external_data_management_system() @@ -541,6 +553,11 @@ class OpenbisSync(object): if result.failure(): return result + result = self.prepare_repository_id() + if result.failure(): + return result + repository_id = result.output + result = self.prepare_external_dms() if result.failure(): return result @@ -557,7 +574,7 @@ class OpenbisSync(object): self.commit_metadata_updates("data set id") # create a data set, using the existing data set as a parent, if there is one - result, data_set = self.create_data_set(data_set_code, external_dms) + result, data_set = self.create_data_set(data_set_code, external_dms, repository_id) if result.failure(): self.revert_last_metadata_update() return result diff --git a/src/python/OBis/obis/dm/data_mgmt_test.py b/src/python/OBis/obis/dm/data_mgmt_test.py index fb4c5ab4b6bf0e3cb8a8f6bedad2b65545f6090f..9fff7a9967be724fd4122260d60c12fe7aeffee2 100644 --- a/src/python/OBis/obis/dm/data_mgmt_test.py +++ b/src/python/OBis/obis/dm/data_mgmt_test.py @@ -158,9 +158,11 @@ def test_child_data_set(tmpdir): child_ds_code = dm.config_resolver.config_dict()['data_set_id'] assert parent_ds_code != child_ds_code commit_id = dm.git_wrapper.git_commit_id().output + repository_id = dm.config_resolver.config_dict()['repository_id'] + assert repository_id is not None contents = data_mgmt.GitRepoFileInfo(dm.git_wrapper).contents() - check_new_data_set_expectations(dm, tmp_dir_path, commit_id, ANY, child_ds_code, parent_ds_code, properties, + check_new_data_set_expectations(dm, tmp_dir_path, commit_id, repository_id, ANY, child_ds_code, parent_ds_code, properties, contents) @@ -195,9 +197,9 @@ def prepare_new_data_set_expectations(dm, properties={}): dm.openbis.new_git_data_set = MagicMock(return_value=data_set) -def check_new_data_set_expectations(dm, tmp_dir_path, commit_id, external_dms, data_set_id, parent_id, properties, +def check_new_data_set_expectations(dm, tmp_dir_path, commit_id, repository_id, external_dms, data_set_id, parent_id, properties, contents): - dm.openbis.new_git_data_set.assert_called_with('DS_TYPE', tmp_dir_path, commit_id, external_dms, "/SAMPLE/ID", + dm.openbis.new_git_data_set.assert_called_with('DS_TYPE', tmp_dir_path, commit_id, repository_id, external_dms, "/SAMPLE/ID", data_set_code=data_set_id, parents=parent_id, properties=properties, contents=contents) diff --git a/src/python/PyBis/pybis/data_set.py b/src/python/PyBis/pybis/data_set.py index 6b9bbcf3f4e5abeaa6a91512dafa5aee121b36cc..3dc4bfe6b5f8fe167e28da47b7ac3ac2671a013c 100644 --- a/src/python/PyBis/pybis/data_set.py +++ b/src/python/PyBis/pybis/data_set.py @@ -20,7 +20,7 @@ def transfer_to_file_creation(content, file_creation, key, file_creation_key=Non class GitDataSetCreation(object): - def __init__(self, openbis, data_set_type, path, commit_id, dms, sample=None, properties={}, + def __init__(self, openbis, data_set_type, path, commit_id, repository_id, dms, sample=None, properties={}, dss_code=None, parents=None, data_set_code=None, contents=[]): """Initialize the command object with the necessary parameters. :param openbis: The openBIS API object. @@ -28,6 +28,7 @@ class GitDataSetCreation(object): :param data_set_type: The type of the data set :param path: The path to the git repository :param commit_id: The git commit id + :param repository_id: The git repository id - same for copies :param dms: An external data managment system object or external_dms_id :param sample: A sample object or sample id. :param properties: Properties for the data set. @@ -45,6 +46,7 @@ class GitDataSetCreation(object): self.data_set_type = data_set_type self.path = path self.commit_id = commit_id + self.repository_id = repository_id self.dms = dms self.sample = sample self.properties = properties @@ -128,6 +130,7 @@ class GitDataSetCreation(object): "@type": "as.dto.dataset.create.ContentCopyCreation", "path": self.path, "gitCommitHash": self.commit_id, + "gitRepositoryId" : self.repository_id, "externalDmsId": dms_id } ] diff --git a/src/python/PyBis/pybis/pybis.py b/src/python/PyBis/pybis/pybis.py index 5682ef46479aeccc26a9675a333f1a52a4600f28..a2acc45b804dd6d54351f28b5b933128852b16eb 100644 --- a/src/python/PyBis/pybis/pybis.py +++ b/src/python/PyBis/pybis/pybis.py @@ -1795,13 +1795,14 @@ class Openbis: except: return resp - def new_git_data_set(self, data_set_type, path, commit_id, dms, sample=None, properties={}, + def new_git_data_set(self, data_set_type, path, commit_id, repository_id, dms, sample=None, properties={}, dss_code=None, parents=None, data_set_code=None, contents=[]): """ Create a link data set. :param data_set_type: The type of the data set :param data_set_type: The type of the data set :param path: The path to the git repository :param commit_id: The git commit id + :param repository_id: The git repository id - same for copies :param dms: An external data managment system object or external_dms_id :param sample: A sample object or sample id. :param dss_code: Code for the DSS -- defaults to the first dss if none is supplied. @@ -1815,7 +1816,7 @@ class Openbis: 'path': [the relative path string]} :return: A DataSet object """ - return pbds.GitDataSetCreation(self, data_set_type, path, commit_id, dms, sample, + return pbds.GitDataSetCreation(self, data_set_type, path, commit_id, repository_id, dms, sample, properties, dss_code, parents, data_set_code, contents).new_git_data_set() @staticmethod