From 3a2bc2cf251e649703b1eda843b77aa99bd2bf5f Mon Sep 17 00:00:00 2001 From: John Davis Date: Tue, 6 Aug 2024 14:36:57 -0400 Subject: [PATCH 1/4] Strip whitespace when listifying admin users --- lib/galaxy/config/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/config/__init__.py b/lib/galaxy/config/__init__.py index ca78874969eb..9b2d435ae393 100644 --- a/lib/galaxy/config/__init__.py +++ b/lib/galaxy/config/__init__.py @@ -594,7 +594,7 @@ def admin_users(self): @admin_users.setter def admin_users(self, value): self._admin_users = value - self.admin_users_list = listify(value) + self.admin_users_list = listify(value, do_strip=True) def is_admin_user(self, user: Optional["User"]) -> bool: """Determine if the provided user is listed in `admin_users`.""" From e1d6c93a21ae0f89932e82a0be0255192be39421 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Thu, 19 Sep 2024 16:53:39 +0200 Subject: [PATCH 2/4] Fix discovered outputs with directory metadata and distributed object stores The problem is that `object_store.is_private` would check in which object store the dataset is stored, and that fails if we haven't written to the object store yet (which is why extended metadata is a workaround). Fixes https://github.com/galaxyproject/galaxy/issues/17208 --- lib/galaxy/model/store/discover.py | 18 ++++++++++----- test/integration/objectstore/test_jobs.py | 26 ++++++++++++++++++---- test/integration/test_extended_metadata.py | 1 + 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/lib/galaxy/model/store/discover.py b/lib/galaxy/model/store/discover.py index 17389c7b83eb..db3ac40bf2e5 100644 --- a/lib/galaxy/model/store/discover.py +++ b/lib/galaxy/model/store/discover.py @@ -132,11 +132,6 @@ def create_dataset( ) self.persist_object(primary_data) - if init_from: - self.permission_provider.copy_dataset_permissions(init_from, primary_data) - primary_data.state = init_from.state - else: - self.permission_provider.set_default_hda_permissions(primary_data) else: ld = galaxy.model.LibraryDataset(folder=library_folder, name=name) ldda = galaxy.model.LibraryDatasetDatasetAssociation( @@ -208,6 +203,7 @@ def create_dataset( filename=filename, link_data=link_data, output_name=output_name, + init_from=init_from, ) else: storage_callbacks.append( @@ -218,11 +214,14 @@ def create_dataset( filename=filename, link_data=link_data, output_name=output_name, + init_from=init_from, ) ) return primary_data - def finalize_storage(self, primary_data, dataset_attributes, extra_files, filename, link_data, output_name): + def finalize_storage( + self, primary_data, dataset_attributes, extra_files, filename, link_data, output_name, init_from + ): if primary_data.dataset.purged: # metadata won't be set, maybe we should do that, then purge ? primary_data.dataset.file_size = 0 @@ -243,6 +242,13 @@ def finalize_storage(self, primary_data, dataset_attributes, extra_files, filena else: # We are sure there are no extra files, so optimize things that follow by settting total size also. primary_data.set_size(no_extra_files=True) + + if init_from: + self.permission_provider.copy_dataset_permissions(init_from, primary_data) + primary_data.state = init_from.state + else: + self.permission_provider.set_default_hda_permissions(primary_data) + # TODO: this might run set_meta after copying the file to the object store, which could be inefficient if job working directory is closer to the node. self.set_datasets_metadata(datasets=[primary_data], datasets_attributes=[dataset_attributes]) diff --git a/test/integration/objectstore/test_jobs.py b/test/integration/objectstore/test_jobs.py index 30383b8e5372..3d1bab41e37e 100644 --- a/test/integration/objectstore/test_jobs.py +++ b/test/integration/objectstore/test_jobs.py @@ -3,12 +3,17 @@ import os import string +from galaxy_test.driver.integration_util import ( + integration_module_instance, + integration_tool_runner, +) from ._base import ( BaseObjectStoreIntegrationTestCase, files_count, ) +from .test_selection_with_resource_parameters import DISTRIBUTED_OBJECT_STORE_CONFIG_TEMPLATE -DISTRIBUTED_OBJECT_STORE_CONFIG_TEMPLATE = string.Template( +HIERARCHICAL_OBJECT_STORE_CONFIG_TEMPLATE = string.Template( """ @@ -39,7 +44,20 @@ TEST_INPUT_FILES_CONTENT = "1 2 3" -class TestObjectStoreJobsIntegration(BaseObjectStoreIntegrationTestCase): +class TestDistributedObjectStore(BaseObjectStoreIntegrationTestCase): + @classmethod + def handle_galaxy_config_kwds(cls, config): + super().handle_galaxy_config_kwds(config) + config["metadata_strategy"] = "directory" + config["object_store_store_by"] = "uuid" + cls._configure_object_store(DISTRIBUTED_OBJECT_STORE_CONFIG_TEMPLATE, config) + + +instance = integration_module_instance(TestDistributedObjectStore) +test_tools = integration_tool_runner(["all_output_types"]) + + +class TestObjectStoreJobsIntegration(TestDistributedObjectStore): # setup by _configure_object_store files1_path: str files2_path: str @@ -48,7 +66,7 @@ class TestObjectStoreJobsIntegration(BaseObjectStoreIntegrationTestCase): @classmethod def handle_galaxy_config_kwds(cls, config): super().handle_galaxy_config_kwds(config) - cls._configure_object_store(DISTRIBUTED_OBJECT_STORE_CONFIG_TEMPLATE, config) + cls._configure_object_store(HIERARCHICAL_OBJECT_STORE_CONFIG_TEMPLATE, config) def setUp(self): super().setUp() @@ -68,7 +86,7 @@ def setUp(self): def test_files_count_and_content_in_each_objectstore_backend(self): """ According to the ObjectStore configuration given in the - `DISTRIBUTED_OBJECT_STORE_CONFIG_TEMPLATE` variable, datasets + `HIERARCHICAL_OBJECT_STORE_CONFIG_TEMPLATE` variable, datasets can be stored on three backends, named: - primary/files1; - primary/files2; diff --git a/test/integration/test_extended_metadata.py b/test/integration/test_extended_metadata.py index d267ed01c418..8ef2c8306417 100644 --- a/test/integration/test_extended_metadata.py +++ b/test/integration/test_extended_metadata.py @@ -43,6 +43,7 @@ "collection_creates_dynamic_nested_from_json_elements", "implicit_conversion", "environment_variables", + "all_output_types", ] From 99b3d29e69c905996c6c26296a89650b7ee1755b Mon Sep 17 00:00:00 2001 From: Dannon Date: Fri, 20 Sep 2024 07:13:11 +0200 Subject: [PATCH 3/4] Change mechanism for loading data into editor viz avoiding injecting it as innerHTML and executing contents. --- config/plugins/visualizations/editor/templates/editor.mako | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/plugins/visualizations/editor/templates/editor.mako b/config/plugins/visualizations/editor/templates/editor.mako index 385edbba6205..1046842c3417 100755 --- a/config/plugins/visualizations/editor/templates/editor.mako +++ b/config/plugins/visualizations/editor/templates/editor.mako @@ -62,11 +62,11 @@ const ajax_url = "${h.url_for( controller='/datasets', action='index')}/" + hda_id + "/display"; const data = httpGet(ajax_url); - document.getElementById("editor").innerHTML = data; var editor = ace.edit("editor", { mode: "ace/mode/powershell", theme: "ace/theme/textmate" }); + editor.setValue(data, -1); From 9a9c4a8eb85211d627d5dbe3573656eb9c22e2e3 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 29 Jul 2024 10:28:44 -0400 Subject: [PATCH 4/4] Do not set uuid on dataset imports. --- lib/galaxy/model/store/__init__.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/model/store/__init__.py b/lib/galaxy/model/store/__init__.py index c2a616c50419..063bbc295dd1 100644 --- a/lib/galaxy/model/store/__init__.py +++ b/lib/galaxy/model/store/__init__.py @@ -289,10 +289,11 @@ def remap_objects(p, k, obj): self._attach_raw_id_if_editing(dataset_instance, dataset_attrs) # Older style... - if 'uuid' in dataset_attrs: - dataset_instance.dataset.uuid = dataset_attrs["uuid"] - if 'dataset_uuid' in dataset_attrs: - dataset_instance.dataset.uuid = dataset_attrs["dataset_uuid"] + if self.import_options.allow_edit: + if 'uuid' in dataset_attrs: + dataset_instance.dataset.uuid = dataset_attrs["uuid"] + if 'dataset_uuid' in dataset_attrs: + dataset_instance.dataset.uuid = dataset_attrs["dataset_uuid"] self._session_add(dataset_instance) self._flush()