diff --git a/src/python/OBis/obis/dm/config.py b/src/python/OBis/obis/dm/config.py index 627b0c7ef56516d4c3f78185c299c9dc1d36035c..4ddb2ab2da539b227d06e6ab08f788cea9a5e37f 100644 --- a/src/python/OBis/obis/dm/config.py +++ b/src/python/OBis/obis/dm/config.py @@ -87,11 +87,8 @@ class ConfigEnv(object): self.add_param(ConfigParam(name='openbis_url', private=False)) 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, ignore_global=True)) self.add_param(ConfigParam(name='collection_id', private=False, ignore_global=True)) - self.add_param(ConfigParam(name='data_set_id', private=False)) self.add_param(ConfigParam(name='data_set_type', private=False)) self.add_param(ConfigParam(name='data_set_properties', private=False, is_json=True)) self.add_param(ConfigParam(name='hostname', private=False)) @@ -105,6 +102,21 @@ class ConfigEnv(object): location = location[path] return location + def is_usersetting(self): + return True + + +class PropertiesEnv(ConfigEnv): + """ These are properties which are not configured by the user but set by obis. """ + + def initialize_params(self): + self.add_param(ConfigParam(name='external_dms_id', private=True)) + self.add_param(ConfigParam(name='repository_id', private=True)) + self.add_param(ConfigParam(name='data_set_id', private=False)) + + def is_usersetting(self): + return False + class LocationResolver(object): def __init__(self): @@ -118,15 +130,16 @@ class LocationResolver(object): return os.path.join(root, location.basename) -class ConfigResolver(object): +class ConfigResolverImpl(object): """Construct a config dictionary.""" - def __init__(self, env=None, location_resolver=None): + def __init__(self, env=None, location_resolver=None, config_file='config.json'): self.env = env if env is not None else ConfigEnv() self.location_resolver = location_resolver if location_resolver is not None else LocationResolver() self.location_search_order = ['global', 'local'] self.location_cache = {} self.is_initialized = False + self.config_file = config_file def initialize_location_cache(self): env = self.env @@ -140,7 +153,7 @@ class ConfigResolver(object): self.initialize_location(k, v, cache[key]) else: root_path = self.location_resolver.resolve_location(loc) - config_path = os.path.join(root_path, 'config.json') + config_path = os.path.join(root_path, self.config_file) if os.path.exists(config_path): with open(config_path) as f: config = json.load(f) @@ -184,7 +197,7 @@ class ConfigResolver(object): location_dir_path = self.location_resolver.resolve_location(location) if not os.path.exists(location_dir_path): os.makedirs(location_dir_path) - config_path = os.path.join(location_dir_path, 'config.json') + config_path = os.path.join(location_dir_path, self.config_file) with open(config_path, "w") as f: json.dump(location_config_dict, f, sort_keys=True) @@ -209,7 +222,7 @@ class ConfigResolver(object): def local_public_config_folder_path(self): loc = self.env.location_at_path(['local', 'public']) - return self.location_resolver.resolve_location(loc) + return self.location_resolver.resolve_location(loc) + '/' + self.config_file def copy_global_to_local(self): config = self.config_dict(False) @@ -223,3 +236,48 @@ class ConfigResolver(object): if param.ignore_global: continue self.set_value_for_parameter(k, v, 'local') + + def is_usersetting(self): + return self.env.is_usersetting() + + +class ConfigResolver(object): + """ This class functions as a wrapper since we have multiple config resolvers. """ + + def __init__(self, location_resolver=None): + self.resolvers = [] + self.resolvers.append(ConfigResolverImpl(env=ConfigEnv())) + self.resolvers.append(ConfigResolverImpl(env=PropertiesEnv(), config_file='properties.json')) + + def config_dict(self, local_only=False): + combined_dict = {} + for resolver in self.resolvers: + combined_dict.update(resolver.config_dict(local_only=local_only)) + return combined_dict + + def set_value_for_parameter(self, name, value, loc): + for resolver in self.resolvers: + if name in resolver.env.params: + return resolver.set_value_for_parameter(name, value, loc) + + def local_public_properties_path(self): + for resolver in self.resolvers: + if not resolver.is_usersetting(): + return resolver.local_public_config_folder_path() + + def copy_global_to_local(self): + for resolver in self.resolvers: + resolver.copy_global_to_local() + + def set_resolver_location_roots(self, key, value): + for resolver in self.resolvers: + resolver.location_resolver.location_roots[key] = value + + def set_location_search_order(self, order): + for resolver in self.resolvers: + resolver.location_search_order = order + + def is_usersetting(self, name): + for resolver in self.resolvers: + if name in resolver.env.params: + return resolver.is_usersetting() diff --git a/src/python/OBis/obis/dm/data_mgmt.py b/src/python/OBis/obis/dm/data_mgmt.py index c64f9ac2cc1114a401195030e5f940275d3230a4..3eb0e4c9d45d0fb654c3dbe4c59b43770cca66ef 100644 --- a/src/python/OBis/obis/dm/data_mgmt.py +++ b/src/python/OBis/obis/dm/data_mgmt.py @@ -42,7 +42,7 @@ def DataMgmt(echo_func=None, config_resolver=None, openbis_config={}, git_config config_resolver = dm_config.ConfigResolver() result = git_wrapper.git_top_level_path() if result.success(): - config_resolver.location_resolver.location_roots['data_set'] = result.output + config_resolver.set_resolver_location_roots('data_set', result.output) complete_openbis_config(openbis_config, config_resolver) return GitDataMgmt(config_resolver, openbis_config, git_wrapper, openbis) @@ -159,7 +159,7 @@ class GitDataMgmt(AbstractDataMgmt): def setup_local_config(self, config, path): with cd(path): - self.config_resolver.location_resolver.location_roots['data_set'] = '.' + self.config_resolver.set_resolver_location_roots('data_set', '.') for key, value in config.items(): self.config_resolver.set_value_for_parameter(key, value, 'local') @@ -194,7 +194,7 @@ class GitDataMgmt(AbstractDataMgmt): return result with cd(path): # Update the resolvers location - self.config_resolver.location_resolver.location_roots['data_set'] = '.' + self.config_resolver.set_resolver_location_roots('data_set', '.') self.config_resolver.copy_global_to_local() self.commit_metadata_updates('local with global') return result @@ -266,12 +266,12 @@ class GitDataMgmt(AbstractDataMgmt): return self.git_wrapper.git_status() def commit_metadata_updates(self, msg_fragment=None): - folder = self.config_resolver.local_public_config_folder_path() - status = self.git_wrapper.git_status(folder) + properties_path = self.config_resolver.local_public_properties_path() + status = self.git_wrapper.git_status(properties_path) if len(status.output.strip()) < 1: # Nothing to commit return CommandResult(returncode=0, output="") - self.git_wrapper.git_add(folder) + self.git_wrapper.git_add(properties_path) if msg_fragment is None: msg = "OBIS: Update openBIS metadata cache." else: @@ -283,8 +283,8 @@ class GitDataMgmt(AbstractDataMgmt): def restore(self): self.git_wrapper.git_reset_to(self.previous_git_commit_hash) - folder = self.config_resolver.local_public_config_folder_path() - self.git_wrapper.git_checkout(folder) + properties_path = self.config_resolver.local_public_properties_path() + self.git_wrapper.git_checkout(properties_path) def clone(self, data_set_id, ssh_user, content_copy_index): try: diff --git a/src/python/OBis/obis/dm/data_mgmt_test.py b/src/python/OBis/obis/dm/data_mgmt_test.py index 781e2734b8c42a61d287f04d1b871ece14beeba2..908cd5b8536ebea9e26eac7f383306e47e91ed6d 100644 --- a/src/python/OBis/obis/dm/data_mgmt_test.py +++ b/src/python/OBis/obis/dm/data_mgmt_test.py @@ -153,7 +153,7 @@ 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_hash().output - repository_id = dm.config_resolver.config_dict()['repository_id'] # TODO fail + repository_id = dm.config_resolver.config_dict()['repository_id'] assert repository_id is not None contents = git.GitRepoFileInfo(dm.git_wrapper).contents() diff --git a/src/python/OBis/obis/dm/repo.py b/src/python/OBis/obis/dm/repo.py index 58d95998bd362590054a28fb3bfcd3df776f2324..9a5060e136b4e61f85471b5563336168606bd61d 100644 --- a/src/python/OBis/obis/dm/repo.py +++ b/src/python/OBis/obis/dm/repo.py @@ -20,7 +20,7 @@ class DataRepo(object): """ self.root = root self.dm_api = data_mgmt.DataMgmt(git_config={'find_git': True}) - self.dm_api.config_resolver.location_resolver.location_roots['data_set'] = self.root + self.dm_api.config_resolver.set_resolver_location_roots('data_set', self.root) def init(self, desc=None): return self.dm_api.init_data(self.root, desc) diff --git a/src/python/OBis/obis/scripts/cli.py b/src/python/OBis/obis/scripts/cli.py index 8bc538b496bfea6db7bd46f2c11b643e82e1720c..2a9b24237513bd946665c855581e7852d9a58e39 100644 --- a/src/python/OBis/obis/scripts/cli.py +++ b/src/python/OBis/obis/scripts/cli.py @@ -110,14 +110,14 @@ def config(ctx, is_global, prop, value): def config_internal(data_mgmt, is_global, prop, value): resolver = data_mgmt.config_resolver if is_global: - resolver.location_search_order = ['global'] + resolver.set_location_search_order(['global']) else: top_level_path = data_mgmt.git_wrapper.git_top_level_path() if top_level_path.success(): - resolver.location_resolver.location_roots['data_set'] = top_level_path.output - resolver.location_search_order = ['local'] + resolver.set_resolver_location_roots('data_set', top_level_path.output) + resolver.set_location_search_order(['local']) else: - resolver.location_search_order = ['global'] + resolver.set_location_search_order(['global']) config_dict = resolver.config_dict() if not prop: