From b8f98465b0d688ac57092a46311da2411c95af69 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Thu, 11 Feb 2021 15:35:58 -0500 Subject: [PATCH 01/18] Add tool environment variables to Pulsar client. --- lib/galaxy/jobs/runners/pulsar.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/jobs/runners/pulsar.py b/lib/galaxy/jobs/runners/pulsar.py index 9d607a22acd..109aae0d758 100644 --- a/lib/galaxy/jobs/runners/pulsar.py +++ b/lib/galaxy/jobs/runners/pulsar.py @@ -382,6 +382,12 @@ class PulsarJobRunner(AsynchronousJobRunner): if os.path.exists(tool_script): log.debug("Registering tool_script for Pulsar transfer [%s]" % tool_script) job_directory_files.append(tool_script) + + # Following is job destination environment variables + env = client.env + # extend it with tool defined environment variables + env.extend(job_wrapper.environment_variables) + client_job_description = ClientJobDescription( command_line=command_line, input_files=input_files, @@ -392,7 +398,7 @@ class PulsarJobRunner(AsynchronousJobRunner): tool=job_wrapper.tool, config_files=config_files, dependencies_description=dependencies_description, - env=client.env, + env=env, rewrite_paths=rewrite_paths, arbitrary_files=path_rewrites_unstructured, touch_outputs=output_names, From fd921602713c4643a02fb3f1e6bf5d6db2286a5f Mon Sep 17 00:00:00 2001 From: John Chilton Date: Thu, 11 Feb 2021 15:40:07 -0500 Subject: [PATCH 02/18] Maybe test? --- test/integration/test_pulsar_embedded.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/integration/test_pulsar_embedded.py b/test/integration/test_pulsar_embedded.py index 8352e6b1ae4..411daad976e 100644 --- a/test/integration/test_pulsar_embedded.py +++ b/test/integration/test_pulsar_embedded.py @@ -25,4 +25,5 @@ test_tools = integration_util.integration_tool_runner([ "multi_data_param", "output_filter", "vcf_bgzip_test", + "environment_variables", ]) From 714f595cb7eb0fdc94b0cd05683807587e4b06b2 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 08:13:11 +0100 Subject: [PATCH 03/18] Remove nested json tracking from FormValues.content Fixes ``` Traceback (most recent call last): File "lib/galaxy/web/framework/decorators.py", line 305, in decorator rval = func(self, trans, *args, **kwargs) File "lib/galaxy/webapps/galaxy/api/users.py", line 346, in get_information info_form_models = self.get_all_forms(trans, filter=dict(deleted=False), form_type=trans.app.model.FormDefinition.types.USER_INFO) File "lib/galaxy/webapps/base/controller.py", line 1294, in get_all_forms return [fdc.latest_form for fdc in fdc_list if fdc.latest_form.type == form_type] File "lib/galaxy/webapps/base/controller.py", line 1294, in return [fdc.latest_form for fdc in fdc_list if fdc.latest_form.type == form_type] File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 287, in __get__ return self.impl.get(instance_state(instance), dict_) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 723, in get value = self.callable_(state, passive) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/strategies.py", line 760, in _load_for_state session, state, primary_key_identity, passive File "", line 1, in File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/strategies.py", line 850, in _emit_lazyload session.query(self.mapper), primary_key_identity File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/ext/baked.py", line 615, in _load_on_pk_identity result = list(bq.for_session(self.session).params(**params)) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 100, in instances cursor.close() File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ with_traceback=exc_tb, File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 182, in raise_ raise exception File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 80, in instances rows = [proc(row) for row in fetch] File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 80, in rows = [proc(row) for row in fetch] File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 601, in _instance state.manager.dispatch.load(state, context) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/event/attr.py", line 322, in __call__ fn(*args, **kw) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/ext/mutable.py", line 462, in load val = cls.coerce(key, val) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy_json/__init__.py", line 46, in coerce return super(cls).coerce(key, value) AttributeError: 'super' object has no attribute 'coerce' ``` --- lib/galaxy/model/mapping.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/model/mapping.py b/lib/galaxy/model/mapping.py index 9fab1999df1..f273f755468 100644 --- a/lib/galaxy/model/mapping.py +++ b/lib/galaxy/model/mapping.py @@ -1235,7 +1235,7 @@ model.FormValues.table = Table( Column("create_time", DateTime, default=now), Column("update_time", DateTime, default=now, onupdate=now), Column("form_definition_id", Integer, ForeignKey("form_definition.id"), index=True), - Column("content", JSONType)) + Column("content", SimpleJSONType)) model.Page.table = Table( "page", metadata, From 1a49b1da7282bfbfdb2092eb35abae61eb6a8cae Mon Sep 17 00:00:00 2001 From: selten Date: Wed, 10 Feb 2021 13:11:23 +0100 Subject: [PATCH 04/18] Multi-character strings shouldn't be split When Galaxy determines the column values and there is a string with multiple characters using extend would split the string into 2 list entries. This shouldn't happen as a tab-separated file can have more than 10 columns. --- lib/galaxy/tools/parameters/basic.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py index 9de12bfea84..a40780ba563 100644 --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -1359,6 +1359,7 @@ class ColumnListParameter(SelectToolParameter): value = other_values.get(self.name) if value is not None and value not in legal_values and self.is_file_empty(trans, other_values): + value = value if type(value) is list else [value] legal_values.extend(value) return set(legal_values) From f03a328f45db181a37a22235baa15284da0af6ec Mon Sep 17 00:00:00 2001 From: selten Date: Wed, 10 Feb 2021 16:06:05 +0100 Subject: [PATCH 05/18] Use isinstance instead of type equals list Co-authored-by: Marius van den Beek --- lib/galaxy/tools/parameters/basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py index a40780ba563..8ebf1966e2c 100644 --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -1359,7 +1359,7 @@ class ColumnListParameter(SelectToolParameter): value = other_values.get(self.name) if value is not None and value not in legal_values and self.is_file_empty(trans, other_values): - value = value if type(value) is list else [value] + value = value if isinstance(value, list) is list else [value] legal_values.extend(value) return set(legal_values) From b2c2964c4dff7abb57cee24f2a78b306159c9d54 Mon Sep 17 00:00:00 2001 From: selten Date: Wed, 10 Feb 2021 18:33:53 +0100 Subject: [PATCH 06/18] Another update for isinstance Co-authored-by: Nicola Soranzo --- lib/galaxy/tools/parameters/basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py index 8ebf1966e2c..1bb1bf91b3a 100644 --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -1359,7 +1359,7 @@ class ColumnListParameter(SelectToolParameter): value = other_values.get(self.name) if value is not None and value not in legal_values and self.is_file_empty(trans, other_values): - value = value if isinstance(value, list) is list else [value] + value = value if isinstance(value, list) else [value] legal_values.extend(value) return set(legal_values) From 156950f9c8c3a064ac31a4d5ecdc60176a6821e4 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 09:20:00 +0100 Subject: [PATCH 07/18] Small unittest --- test/unit/data/test_galaxy_mapping.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/unit/data/test_galaxy_mapping.py b/test/unit/data/test_galaxy_mapping.py index 2b0b5ecc301..59841b71c6d 100644 --- a/test/unit/data/test_galaxy_mapping.py +++ b/test/unit/data/test_galaxy_mapping.py @@ -379,6 +379,12 @@ class MappingTests(BaseModelTestCase): assert hist1.name == "History 2b" # gvk TODO need to ad test for GalaxySessions, but not yet sure what they should look like. + def test_metadata_spec(self): + metadata = dict(chromCol=1, startCol=2, endCol=3) + d = self.model.HistoryDatasetAssociation(extension="interval", metadata=metadata, sa_session=self.model.session) + assert d.metadata.chromCol == 1 + assert d.metadata.anyAttribute is None + def test_jobs(self): model = self.model u = model.User(email="jobtest@foo.bar.baz", password="password") From 8af54811c58b3363af8f8d5749d8d32215e0008a Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 09:22:04 +0100 Subject: [PATCH 08/18] Return None on unknown metadata attribute access Fixes https://sentry.galaxyproject.org/sentry/main/issues/1325196/ ``` AttributeError: null File "galaxy/web/framework/middleware/sentry.py", line 43, in __call__ iterable = self.application(environ, start_response) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/paste/recursive.py", line 85, in __call__ return self.application(environ, start_response) File "galaxy/web/framework/middleware/statsd.py", line 33, in __call__ req = self.application(environ, start_response) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/paste/httpexceptions.py", line 640, in __call__ return self.application(environ, start_response) File "galaxy/web/framework/base.py", line 136, in __call__ return self.handle_request(environ, start_response) File "galaxy/web/framework/base.py", line 215, in handle_request body = method(trans, **kwargs) File "galaxy/webapps/galaxy/controllers/visualization.py", line 488, in display_by_username_and_slug visualization_config = self.get_visualization_config(trans, visualization) File "galaxy/webapps/base/controller.py", line 1035, in get_visualization_config tracks.append(pack_track(drawable_dict)) File "galaxy/webapps/base/controller.py", line 996, in pack_track "filters": track_dict.get('filters', {'filters' : track_data_provider.get_filters()}), File "galaxy/visualization/data_providers/genome.py", line 249, in get_filters if self.original_dataset.metadata.viz_filter_cols: File "galaxy/model/metadata.py", line 116, in __getattr__ raise AttributeError ``` --- lib/galaxy/model/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/model/metadata.py b/lib/galaxy/model/metadata.py index a3f40dd11be..bff4109560f 100644 --- a/lib/galaxy/model/metadata.py +++ b/lib/galaxy/model/metadata.py @@ -113,7 +113,7 @@ class MetadataCollection(Mapping): return self.spec[name].wrap(self.spec[name].default, object_session(self.parent)) if name in self.parent._metadata: return self.parent._metadata[name] - raise AttributeError + return None def __setattr__(self, name, value): if name == "parent": From 3e7f03cd1f229b8c9421ade02002728a33e131d8 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 09:34:16 +0100 Subject: [PATCH 09/18] Fix job_destination display if job has no destination params yet Fixes ``` TypeError: 'NoneType' object is not iterable File "galaxy/web/framework/decorators.py", line 305, in decorator rval = func(self, trans, *args, **kwargs) File "galaxy/webapps/galaxy/api/jobs.py", line 329, in destination_params return summarize_destination_params(trans, job) File "galaxy/managers/jobs.py", line 613, in summarize_destination_params destination_params.update(job.destination_params) ``` --- lib/galaxy/managers/jobs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/managers/jobs.py b/lib/galaxy/managers/jobs.py index aabc38d162d..40cab0a1481 100644 --- a/lib/galaxy/managers/jobs.py +++ b/lib/galaxy/managers/jobs.py @@ -610,7 +610,9 @@ def summarize_destination_params(trans, job): destination_params = {'Runner': job.job_runner_name, 'Runner Job ID': job.job_runner_external_id, 'Handler': job.handler} - destination_params.update(job.destination_params) + job_destination_params = job.destination_params + if job_destination_params: + destination_params.update(job_destination_params) return destination_params From 766a9ac4a1c06a701762e7115fe12cc4319b5bd4 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 10:06:27 +0100 Subject: [PATCH 10/18] Don't log handled exceptions when filling cheetah template https://github.com/galaxyproject/galaxy/commit/5176a67a71a655845323ef9b37876901aa20f138 added a log.exception statement which is too noisy when handling Python 2 exception (and confused me at first in https://sentry.galaxyproject.org/sentry/main/issues/1325262/). This for instance appears in the logs: ``` galaxy.tools INFO 2021-02-12 09:48:49,968 Validated and populated state for tool request (20.957 ms) galaxy.util ERROR 2021-02-12 09:48:50,004 Value '' could not be coerced to Unicode: NotFound('cannot find 'reorder' while searching for 'sam_options.reorder'') Traceback (most recent call last): File "/Users/mvandenb/src/galaxy/lib/galaxy/util/__init__.py", line 1039, in unicodify value = str(value) File "/Users/mvandenb/src/galaxy/.venv/lib/python3.8/site-packages/Cheetah/Template.py", line 1053, in __unicode__ return getattr(self, mainMethName)() File "DynamicallyCompiledCheetahTemplate.py", line 86, in respond NameMapper.NotFound: cannot find 'reorder' while searching for 'sam_options.reorder' galaxy.util ERROR 2021-02-12 09:49:37,923 Value '' could not be coerced to Unicode: NotFound('cannot find 'sam_opt' while searching for 'sam_options.sam_opt'') Traceback (most recent call last): File "/Users/mvandenb/src/galaxy/lib/galaxy/util/__init__.py", line 1039, in unicodify value = str(value) File "/Users/mvandenb/src/galaxy/.venv/lib/python3.8/site-packages/Cheetah/Template.py", line 1053, in __unicode__ return getattr(self, mainMethName)() File "cheetah_DynamicallyCompiledCheetahTemplate_1613119560_966509_95726.py", line 86, in respond NameMapper.NotFound: cannot find 'sam_opt' while searching for 'sam_options.sam_opt' ``` Even though everything is fine. --- lib/galaxy/util/__init__.py | 7 ++++--- lib/galaxy/util/template.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/util/__init__.py b/lib/galaxy/util/__init__.py index 1c2bbf19d9e..ce3104bd104 100644 --- a/lib/galaxy/util/__init__.py +++ b/lib/galaxy/util/__init__.py @@ -1015,7 +1015,7 @@ def roundify(amount, sfs=2): return amount[0:sfs] + '0' * (len(amount) - sfs) -def unicodify(value, encoding=DEFAULT_ENCODING, error='replace', strip_null=False): +def unicodify(value, encoding=DEFAULT_ENCODING, error='replace', strip_null=False, log_exception=True): """ Returns a Unicode string or None. @@ -1041,8 +1041,9 @@ def unicodify(value, encoding=DEFAULT_ENCODING, error='replace', strip_null=Fals if not isinstance(value, str): value = str(value, encoding, error) except Exception as e: - msg = "Value '{}' could not be coerced to Unicode: {}('{}')".format(repr(value), type(e).__name__, e) - log.exception(msg) + if log_exception: + msg = "Value '{}' could not be coerced to Unicode: {}('{}')".format(repr(value), type(e).__name__, e) + log.exception(msg) raise if strip_null: return value.replace('\0', '') diff --git a/lib/galaxy/util/template.py b/lib/galaxy/util/template.py index 037daf8e880..13cd2951fec 100644 --- a/lib/galaxy/util/template.py +++ b/lib/galaxy/util/template.py @@ -77,7 +77,7 @@ def fill_template(template_text, raise first_exception or e t = klass(searchList=[context]) try: - return unicodify(t) + return unicodify(t, log_exception=False) except NotFound as e: if first_exception is None: first_exception = e From 1b98e2ca12158bae104ff8475adc58335ad90e31 Mon Sep 17 00:00:00 2001 From: Marius van den Beek Date: Fri, 12 Feb 2021 14:45:24 +0100 Subject: [PATCH 11/18] Calrify why we don't raise Attribute error here Co-authored-by: Nicola Soranzo --- lib/galaxy/model/metadata.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/metadata.py b/lib/galaxy/model/metadata.py index bff4109560f..97fe0df49be 100644 --- a/lib/galaxy/model/metadata.py +++ b/lib/galaxy/model/metadata.py @@ -113,6 +113,7 @@ class MetadataCollection(Mapping): return self.spec[name].wrap(self.spec[name].default, object_session(self.parent)) if name in self.parent._metadata: return self.parent._metadata[name] + # Instead of raising an AttributeError for non-existing metadata, we return None return None def __setattr__(self, name, value): From b930e60d366e455b2d2c3a88d23bc612ed62ed32 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Fri, 12 Feb 2021 11:00:37 -0500 Subject: [PATCH 12/18] Another try... --- lib/galaxy/jobs/__init__.py | 4 ++++ lib/galaxy/jobs/runners/pulsar.py | 11 +++++++++-- lib/galaxy/tools/evaluation.py | 5 +++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/jobs/__init__.py b/lib/galaxy/jobs/__init__.py index 6e41dd49074..8e1cf8a1e16 100644 --- a/lib/galaxy/jobs/__init__.py +++ b/lib/galaxy/jobs/__init__.py @@ -2586,6 +2586,10 @@ class SharedComputeEnvironment(SimpleComputeEnvironment): def working_directory(self): return self.job_wrapper.working_directory + def env_config_directory(self): + """Working directory (possibly as environment variable evaluation).""" + return "$_GALAXY_JOB_DIR" + def new_file_path(self): return os.path.abspath(self.app.config.new_file_path) diff --git a/lib/galaxy/jobs/runners/pulsar.py b/lib/galaxy/jobs/runners/pulsar.py index 109aae0d758..bd3633a52ee 100644 --- a/lib/galaxy/jobs/runners/pulsar.py +++ b/lib/galaxy/jobs/runners/pulsar.py @@ -382,11 +382,15 @@ class PulsarJobRunner(AsynchronousJobRunner): if os.path.exists(tool_script): log.debug("Registering tool_script for Pulsar transfer [%s]" % tool_script) job_directory_files.append(tool_script) - # Following is job destination environment variables env = client.env # extend it with tool defined environment variables - env.extend(job_wrapper.environment_variables) + tool_envs = job_wrapper.environment_variables + env.extend(tool_envs) + for tool_env in tool_envs: + job_directory_path = tool_env.get("job_directory_path") + if job_directory_path: + config_files.append(job_directory_path) client_job_description = ClientJobDescription( command_line=command_line, @@ -1062,6 +1066,9 @@ class PulsarComputeEnvironment(ComputeEnvironment): def working_directory(self): return self._working_directory + def env_config_directory(self): + return self.config_directory() + def config_directory(self): return self._config_directory diff --git a/lib/galaxy/tools/evaluation.py b/lib/galaxy/tools/evaluation.py index 84ca3b9f8fc..9de9998c145 100644 --- a/lib/galaxy/tools/evaluation.py +++ b/lib/galaxy/tools/evaluation.py @@ -540,13 +540,14 @@ class ToolEvaluator: is_template = False else: is_template = True - with tempfile.NamedTemporaryFile(dir=directory, delete=False) as temp: + with tempfile.NamedTemporaryFile(dir=directory, prefix="tool_env_", delete=False) as temp: config_filename = temp.name self.__write_workdir_file(config_filename, environment_variable_template, param_dict, is_template=is_template, strip=environment_variable_def.get("strip", False)) config_file_basename = os.path.basename(config_filename) # environment setup in job file template happens before `cd $working_directory` - environment_variable["value"] = '`cat "$_GALAXY_JOB_DIR/%s"`' % config_file_basename + environment_variable["value"] = '`cat "%s/%s"`' % (self.compute_environment.env_config_directory(), config_file_basename) environment_variable["raw"] = True + environment_variable["job_directory_path"] = config_filename environment_variables.append(environment_variable) home_dir = self.compute_environment.home_directory() From e63e31327174c3c60fb49e8daaa8b606a05a6aeb Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Fri, 12 Feb 2021 13:49:27 -0500 Subject: [PATCH 13/18] Add default props for toolsearch --- client/src/components/Panels/Common/ToolSearch.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/components/Panels/Common/ToolSearch.vue b/client/src/components/Panels/Common/ToolSearch.vue index a09dfe7c382..f85944fe239 100644 --- a/client/src/components/Panels/Common/ToolSearch.vue +++ b/client/src/components/Panels/Common/ToolSearch.vue @@ -16,9 +16,11 @@ export default { props: { query: { type: String, + default: '' }, placeholder: { type: String, + default: "search tools" }, }, data() { From 13fcb84e9ea12163b6fd1a79bc1fee7a222c76ea Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Fri, 12 Feb 2021 14:31:47 -0500 Subject: [PATCH 14/18] I *think* this should correctly handle both versioned and unversioned matches? --- client/src/components/Panels/utilities.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/src/components/Panels/utilities.js b/client/src/components/Panels/utilities.js index 3d5090edd9c..7b2da177d8a 100644 --- a/client/src/components/Panels/utilities.js +++ b/client/src/components/Panels/utilities.js @@ -77,10 +77,9 @@ export function filterTools(layout, results) { function normalize_results(results) { var norm_results = []; results.forEach((result) => { + norm_results.push(result); if (result.includes("/repos/")) { norm_results.push(result.split("/")[3]); - } else { - norm_results.push(result); } }); return norm_results; From 74bc0d65397a81525d97f9c49ef9d2f6e8d2f882 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Fri, 12 Feb 2021 16:30:15 -0500 Subject: [PATCH 15/18] Correct subset of tool result for matching --- client/src/components/Panels/utilities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/Panels/utilities.js b/client/src/components/Panels/utilities.js index 7b2da177d8a..8c02e3fb7b9 100644 --- a/client/src/components/Panels/utilities.js +++ b/client/src/components/Panels/utilities.js @@ -79,7 +79,7 @@ function normalize_results(results) { results.forEach((result) => { norm_results.push(result); if (result.includes("/repos/")) { - norm_results.push(result.split("/")[3]); + norm_results.push(result.split("/repos/")[1].split("/")[2]); } }); return norm_results; From 7ddd9c2f3fbfee24de08ea99b7b1c33913346005 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 23:50:05 +0100 Subject: [PATCH 16/18] Change some more JSONType fields to non-tracked variant Fixes ``` galaxy.web.framework.decorators ERROR 2021-02-12 16:45:00,808 [p:24875,w:1,m:0] [uWSGIWorker1Core2] Uncaught exception in exposed API method: Traceback (most recent call last): File "lib/galaxy/web/framework/decorators.py", line 305, in decorator rval = func(self, trans, *args, **kwargs) File "lib/galaxy/webapps/galaxy/api/users.py", line 346, in get_information info_form_models = self.get_all_forms(trans, filter=dict(deleted=False), form_type=trans.app.model.FormDefinition.types.USER_INFO) File "lib/galaxy/webapps/base/controller.py", line 1294, in get_all_forms return [fdc.latest_form for fdc in fdc_list if fdc.latest_form.type == form_type] File "lib/galaxy/webapps/base/controller.py", line 1294, in return [fdc.latest_form for fdc in fdc_list if fdc.latest_form.type == form_type] File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 287, in __get__ return self.impl.get(instance_state(instance), dict_) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/attributes.py", line 723, in get value = self.callable_(state, passive) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/strategies.py", line 760, in _load_for_state session, state, primary_key_identity, passive File "", line 1, in File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/strategies.py", line 850, in _emit_lazyload session.query(self.mapper), primary_key_identity File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/ext/baked.py", line 615, in _load_on_pk_identity result = list(bq.for_session(self.session).params(**params)) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 100, in instances cursor.close() File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ with_traceback=exc_tb, File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 182, in raise_ raise exception File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 80, in instances rows = [proc(row) for row in fetch] File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 80, in rows = [proc(row) for row in fetch] File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 601, in _instance state.manager.dispatch.load(state, context) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/event/attr.py", line 322, in __call__ fn(*args, **kw) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy/ext/mutable.py", line 462, in load val = cls.coerce(key, val) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/sqlalchemy_json/__init__.py", line 46, in coerce return super(cls).coerce(key, value) AttributeError: 'super' object has no attribute 'coerce' ``` --- lib/galaxy/model/mapping.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/model/mapping.py b/lib/galaxy/model/mapping.py index f273f755468..8fd25354ec5 100644 --- a/lib/galaxy/model/mapping.py +++ b/lib/galaxy/model/mapping.py @@ -1225,9 +1225,9 @@ model.FormDefinition.table = Table( Column("name", TrimmedString(255), nullable=False), Column("desc", TEXT), Column("form_definition_current_id", Integer, ForeignKey("form_definition_current.id", use_alter=True), index=True, nullable=False), - Column("fields", JSONType), + Column("fields", SimpleJSONType), Column("type", TrimmedString(255), index=True), - Column("layout", JSONType)) + Column("layout", SimpleJSONType)) model.FormValues.table = Table( "form_values", metadata, From 704e12de91ed10be67a2708e26a16644ac89f497 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Fri, 12 Feb 2021 19:54:21 -0500 Subject: [PATCH 17/18] PrETTIer --- client/src/components/Panels/Common/ToolSearch.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/Panels/Common/ToolSearch.vue b/client/src/components/Panels/Common/ToolSearch.vue index f85944fe239..11fe95f8f77 100644 --- a/client/src/components/Panels/Common/ToolSearch.vue +++ b/client/src/components/Panels/Common/ToolSearch.vue @@ -16,11 +16,11 @@ export default { props: { query: { type: String, - default: '' + default: "", }, placeholder: { type: String, - default: "search tools" + default: "search tools", }, }, data() { From c5e288dbd253cc781dd574d665c44d8ac935b8c0 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Sat, 13 Feb 2021 10:35:25 +0100 Subject: [PATCH 18/18] Change log level for sqlalchemy_json --- lib/galaxy/config/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/galaxy/config/__init__.py b/lib/galaxy/config/__init__.py index d2c2127fa32..11bde511c05 100644 --- a/lib/galaxy/config/__init__.py +++ b/lib/galaxy/config/__init__.py @@ -66,6 +66,10 @@ LOGGING_CONFIG_DEFAULT = { 'level': 'WARN', 'qualname': 'paste.httpserver.ThreadPool', }, + 'sqlalchemy_json.track': { + 'level': 'WARN', + 'qualname': 'sqlalchemy_json.track', + }, 'urllib3.connectionpool': { 'level': 'WARN', 'qualname': 'urllib3.connectionpool',