diff --git a/client/src/components/Workflow/Editor/Index.vue b/client/src/components/Workflow/Editor/Index.vue
index b045017acc9c..64502b77a927 100644
--- a/client/src/components/Workflow/Editor/Index.vue
+++ b/client/src/components/Workflow/Editor/Index.vue
@@ -13,6 +13,7 @@
@onRefactor="onRefactor"
@onShow="hideModal" />
+
import { Toast } from "composables/toast";
import { storeToRefs } from "pinia";
-import Vue, { computed, onUnmounted, ref, unref } from "vue";
+import Vue, { computed, nextTick, onUnmounted, ref, unref } from "vue";
import { replaceLabel } from "@/components/Markdown/parse";
import { getUntypedWorkflowParameters } from "@/components/Workflow/Editor/modules/parameters";
@@ -195,6 +196,7 @@ import WorkflowLint from "./Lint.vue";
import MessagesModal from "./MessagesModal.vue";
import WorkflowOptions from "./Options.vue";
import RefactorConfirmationModal from "./RefactorConfirmationModal.vue";
+import SaveChangesModal from "./SaveChangesModal.vue";
import StateUpgradeModal from "./StateUpgradeModal.vue";
import WorkflowGraph from "./WorkflowGraph.vue";
import MarkdownEditor from "@/components/Markdown/MarkdownEditor.vue";
@@ -207,6 +209,7 @@ export default {
components: {
MarkdownEditor,
FlexPanel,
+ SaveChangesModal,
StateUpgradeModal,
ToolPanel,
FormDefault,
@@ -313,7 +316,6 @@ export default {
data() {
return {
isCanvas: true,
- markdownConfig: null,
markdownText: null,
versions: [],
parameters: null,
@@ -341,6 +343,8 @@ export default {
transform: { x: 0, y: 0, k: 1 },
graphOffset: { left: 0, top: 0, width: 0, height: 0 },
debounceTimer: null,
+ showSaveChangesModal: false,
+ navUrl: "",
};
},
computed: {
@@ -702,14 +706,21 @@ export default {
const runUrl = `/workflows/run?id=${this.id}`;
this.onNavigate(runUrl);
},
- async onNavigate(url) {
+ async onNavigate(url, forceSave = false, ignoreChanges = false) {
if (this.isNewTempWorkflow) {
await this.onCreate();
- } else {
- await this.onSave(true);
+ } else if (this.hasChanges && !forceSave && !ignoreChanges) {
+ // if there are changes, prompt user to save or discard or cancel
+ this.navUrl = url;
+ this.showSaveChangesModal = true;
+ return;
+ } else if (forceSave) {
+ // when forceSave is true, save the workflow before navigating
+ await this.onSave();
}
this.hasChanges = false;
+ await nextTick();
this.$router.push(url);
},
onSave(hideProgress = false) {
@@ -787,8 +798,8 @@ export default {
const report = data.report || {};
const markdown = report.markdown || reportDefault;
+ this.report = report;
this.markdownText = markdown;
- this.markdownConfig = report;
this.hideModal();
this.stateMessages = getStateUpgradeMessages(data);
const has_changes = this.stateMessages.length > 0;
diff --git a/client/src/components/Workflow/Editor/SaveChangesModal.vue b/client/src/components/Workflow/Editor/SaveChangesModal.vue
new file mode 100644
index 000000000000..9a2b5bbda2d0
--- /dev/null
+++ b/client/src/components/Workflow/Editor/SaveChangesModal.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+ {{ body }}
+
+
+
+
+ {{ localize("Cancel") }}
+
+
+
+ {{ localize("Don't Save") }}
+
+
+
+ {{ localize("Save") }}
+
+
+
+
diff --git a/client/src/stores/workflowStepStore.ts b/client/src/stores/workflowStepStore.ts
index c696f3141ad9..e1ee49f479df 100644
--- a/client/src/stores/workflowStepStore.ts
+++ b/client/src/stores/workflowStepStore.ts
@@ -340,6 +340,7 @@ export const useWorkflowStepStore = defineScopedStore("workflowStepStore", (work
del(steps.value, stepId.toString());
del(stepExtraInputs.value, stepId);
+ del(stepMapOver.value, stepId.toString());
}
return {
diff --git a/doc/source/admin/galaxy_options.rst b/doc/source/admin/galaxy_options.rst
index 2100c81f8cae..f3021dc25d48 100644
--- a/doc/source/admin/galaxy_options.rst
+++ b/doc/source/admin/galaxy_options.rst
@@ -1453,7 +1453,7 @@
This option has no effect if the file specified by
object_store_config_file exists. Otherwise, if this option is set,
it overrides any other objectstore settings.
- The syntax, available instrumenters, and documentation of their
+ The syntax, available storage plugins, and documentation of their
options is explained in detail in the object store sample
configuration file, `object_store_conf.sample.yml`
:Default: ``None``
@@ -2606,8 +2606,20 @@
:Description:
The upload store is a temporary directory in which files uploaded
- by the tus middleware or server will be placed. Defaults to
- new_file_path if not set.
+ by the tus middleware or server for user uploads will be placed.
+ Defaults to new_file_path if not set.
+:Default: ``None``
+:Type: str
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+``tus_upload_store_job_files``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+:Description:
+ The upload store is a temporary directory in which files uploaded
+ by the tus middleware or server for remote job files (Pulsar) will
+ be placed. Defaults to tus_upload_store if not set.
:Default: ``None``
:Type: str
@@ -4030,6 +4042,23 @@
:Type: str
+~~~~~~~~~~~~~~~~~~~~~
+``oidc_scope_prefix``
+~~~~~~~~~~~~~~~~~~~~~
+
+:Description:
+ Sets the prefix for OIDC scopes specific to this Galaxy instance.
+ If an API call is made against this Galaxy instance using an OIDC
+ bearer token, any scopes must be prefixed with this value e.g.
+ https://galaxyproject.org/api. More concretely, to request all
+ permissions that the user has, the scope would have to be
+ specified as ":*". e.g "https://galaxyproject.org/api:*".
+ Currently, only * is recognised as a valid scope, and future
+ iterations may provide more fine-grained scopes.
+:Default: ``https://galaxyproject.org/api``
+:Type: str
+
+
~~~~~~~~~~~~~~~~~~~~
``auth_config_file``
~~~~~~~~~~~~~~~~~~~~
@@ -5439,9 +5468,9 @@
:Type: str
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-``help_forum_tool_panel_integration_enabled``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+``enable_help_forum_tool_panel_integration``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Description:
Enable the integration of the Galaxy Help Forum in the tool panel.
diff --git a/doc/source/releases/24.0_announce.rst b/doc/source/releases/24.0_announce.rst
index 34c63d9757dd..1773e2c1223a 100644
--- a/doc/source/releases/24.0_announce.rst
+++ b/doc/source/releases/24.0_announce.rst
@@ -16,7 +16,7 @@ Highlights
**image_diff.** For tool developers, image_diff, a new comparison method for test output verification using images has been added. Unlike previously used comparison methods, image_diff is specifically tailored for single-channel and multi-channel image data (e.g. RGB). The difference of a pair of images is quantified as the pixel-wise distance between the images, for which different metrics can be used. A pair of images is considered to be equal in terms of the specified metric, if the distance between the images computed with respect to the metric is not above a given threshold. For more details, see `the original pull request `__).
-Other notable improvements include consolidating resource grids for histories, visualizations and pages into tab views; the addition of a new UI feature for "relocating" a dataset to a new object store; and, for tool developers, a new comparison method for test output verification using images. Check out the `24.0 user release notes <24.0_announce_user.html>`__ for all the details.
+Other notable improvements include consolidating resource grids for histories, visualizations and pages into tab views; the addition of a new UI feature for "relocating" a dataset to a different storage location; and, for tool developers, a new comparison method for test output verification using images. Check out the `24.0 user release notes <24.0_announce_user.html>`__ for all the details.
Are you an admin? See the Administration Notes below, and check out `some admin relevant PRs `__.
diff --git a/doc/source/releases/24.0_announce_user.rst b/doc/source/releases/24.0_announce_user.rst
index f48ba67eb1ec..56569265996d 100644
--- a/doc/source/releases/24.0_announce_user.rst
+++ b/doc/source/releases/24.0_announce_user.rst
@@ -30,9 +30,9 @@ My workflows: list view
New select component for selecting a large amount of options
-----------------------------------------------------------
-This new component addresses the need of selecting a very large number of options at once. The component features a list based layout which can be filtered using plain-text or a regular expression. Options can be added individually, in bulk via the filter value, or by first highlighting a range.
+This new component addresses the need of selecting a very large number of options at once. The component features a list based layout which can be filtered using plain-text or a regular expression. Options can be added individually, in bulk via the filter value, or by first highlighting a range.
-The component is fully keyboard accessible. All methods of selection and highlighting work via keyboard. The options are not selectable individually with tab, but can be scrolled through using the arrow-keys. The hover hint adapts when a keyboard is used.
+The component is fully keyboard accessible. All methods of selection and highlighting work via keyboard. The options are not selectable individually with tab, but can be scrolled through using the arrow-keys. The hover hint adapts when a keyboard is used.
The size of the table can be increased to allow for seeing more options at once.The options in the list are limited to 1000 for performance reasons, but this can be temporarily increased in steps of 500, when reaching the end of a list.
@@ -47,7 +47,7 @@ The component can be chosen when multiple options are available; a local prefere
Multiple item drag and drop and keyboard navigation
-----------------------------------------------------------
-This new feature allows users to select multiple history items and drag and drop them into other histories or even tool forms! Users can also navigate their history using the arrow keys; multiple history items can be selected with the Shift + ArrowUp/ArrowDown key combination.
+This new feature allows users to select multiple history items and drag and drop them into other histories or even tool forms! Users can also navigate their history using the arrow keys; multiple history items can be selected with the Shift + ArrowUp/ArrowDown key combination.
Drag and drop:
@@ -73,7 +73,7 @@ Your histories, visualisations, and pages are now consolidated into an easier to
Move datasets between storage locations
-----------------------------------------------------------
-Relocate a dataset to a new object store with ease using this new UI feature! The example below uses an instance with four object stores defined, but only three of them declaring the same "device" ID. Clicking on the dataset information and scrolling to storage details has a "Relocate" option if the dataset is "safe" to relocate and there are valid targets to relocate it to. The UI utilizes the same visual language used for describing attributes of the storage and exposing admin provided details. This example also shows what the buttons look like with quota enabled object stores and object stores without quota enabled.
+Relocate a dataset to a different storage location with ease using this new UI feature! The example below uses an instance with four storage locations defined, but only three of them declaring the same "device" ID (set by the administrator). Clicking on the dataset information and scrolling to storage details has a "Relocate" option if the dataset is "safe" to relocate and there are valid targets to relocate it to. The UI utilizes the same visual language used for describing attributes of the storage and exposing admin provided details. This example also shows what the buttons look like for storage locations with and without quota enabled.
.. raw:: html
diff --git a/lib/galaxy/config/sample/galaxy.yml.sample b/lib/galaxy/config/sample/galaxy.yml.sample
index 96c2a84e0bda..21b325bdb490 100644
--- a/lib/galaxy/config/sample/galaxy.yml.sample
+++ b/lib/galaxy/config/sample/galaxy.yml.sample
@@ -1,21 +1,21 @@
# Galaxy is configured by default to be usable in a single-user development
# environment. To tune the application for a multi-user production
# environment, see the documentation at:
-#
+#
# https://docs.galaxyproject.org/en/master/admin/production.html
-#
+#
# Throughout this sample configuration file, except where stated otherwise,
# uncommented values override the default if left unset, whereas commented
# values are set to the default value. Relative paths are relative to the root
# Galaxy directory.
-#
+#
# Examples of many of these options are explained in more detail in the Galaxy
# Community Hub.
-#
+#
# https://galaxyproject.org/admin/config
-#
+#
# Config hackers are encouraged to check there before asking for help.
-#
+#
# Configuration for Gravity process manager.
# ``uwsgi:`` section will be ignored if Galaxy is started via Gravity commands (e.g ``./run.sh``, ``galaxy`` or ``galaxyctl``).
gravity:
@@ -181,7 +181,7 @@ gravity:
# enable: false
# gx-it-proxy version
- # version: '>=0.0.5'
+ # version: '>=0.0.6'
# Public-facing IP of the proxy
# ip: localhost
@@ -248,6 +248,14 @@ gravity:
# Must match ``tus_upload_store`` setting in ``galaxy:`` section.
# upload_dir:
+ # Value of tusd -hooks-httpd option
+ #
+ # the default of is suitable for using tusd for Galaxy uploads and should not be changed unless you are using tusd for
+ # other purposes such as Pulsar staging.
+ #
+ # The value of galaxy_infrastructure_url is automatically prepended if the option starts with a `/`
+ # hooks_http: /api/upload/hooks
+
# Comma-separated string of enabled tusd hooks.
#
# Leave at the default value to require authorization at upload creation time.
@@ -333,15 +341,9 @@ gravity:
# names.
# environment: {}
- # Configure dynamic handlers in this section. Below is a simple example
+ # Configure dynamic handlers in this section.
# See https://docs.galaxyproject.org/en/latest/admin/scaling.html#dynamically-defined-handlers for details.
- #handlers:
- # handler:
- # processes: 3
- # pools:
- # - job-handlers
- # - workflow-schedulers
-
+ # handlers: {}
galaxy:
# The directory that will be prepended to relative paths in options
@@ -1030,7 +1032,7 @@ galaxy:
# This option has no effect if the file specified by
# object_store_config_file exists. Otherwise, if this option is set,
# it overrides any other objectstore settings.
- # The syntax, available instrumenters, and documentation of their
+ # The syntax, available storage plugins, and documentation of their
# options is explained in detail in the object store sample
# configuration file, `object_store_conf.sample.yml`
#object_store_config: null
@@ -1067,6 +1069,13 @@ galaxy:
# for that object store entry.
#object_store_cache_size: -1
+ # Set this to true to indicate in the UI that a user's object store
+ # selection isn't simply a "preference" that job destinations often
+ # respect but in fact will always be respected. This should be set to
+ # true to simplify the UI as long as job destinations never override
+ # 'object_store_id's for a jobs.
+ #object_store_always_respect_user_selection: false
+
# What Dataset attribute is used to reference files in an ObjectStore
# implementation, this can be 'uuid' or 'id'. The default will depend
# on how the object store is configured, starting with 20.05 Galaxy
@@ -1304,9 +1313,6 @@ galaxy:
# The value of this option will be resolved with respect to
# .
#interactivetools_map: interactivetools_map.sqlite
- # Note: the following config should still be used due to lack of
- # support of data_dir resolution in gx-it-proxy and gravity:
- #interactivetools_map: database/interactivetools_map.sqlite
# Prefix to use in the formation of the subdomain or path for
# interactive tools
@@ -1547,10 +1553,15 @@ galaxy:
#nginx_upload_job_files_path: null
# The upload store is a temporary directory in which files uploaded by
- # the tus middleware or server will be placed. Defaults to
- # new_file_path if not set.
+ # the tus middleware or server for user uploads will be placed.
+ # Defaults to new_file_path if not set.
#tus_upload_store: null
+ # The upload store is a temporary directory in which files uploaded by
+ # the tus middleware or server for remote job files (Pulsar) will be
+ # placed. Defaults to tus_upload_store if not set.
+ #tus_upload_store_job_files: null
+
# Galaxy can upload user files in chunks without using nginx. Enable
# the chunk uploader by specifying a chunk size larger than 0. The
# chunk size is specified in bytes (default: 10MB).
@@ -2189,12 +2200,13 @@ galaxy:
# .
#oidc_backends_config_file: oidc_backends_config.xml
- # Sets the prefix for OIDC scopes specific to this Galaxy instance.
- # If an API call is made against this Galaxy instance using an OIDC bearer token,
- # any scopes must be prefixed with this value e.g. https://galaxyproject.org/api.
- # More concretely, to request all permissions that the user has, the scope
- # would have to be specified as ":*". e.g "https://galaxyproject.org/api:*".
- # Currently, only * is recognised as a valid scope, and future iterations may
+ # Sets the prefix for OIDC scopes specific to this Galaxy instance. If
+ # an API call is made against this Galaxy instance using an OIDC
+ # bearer token, any scopes must be prefixed with this value e.g.
+ # https://galaxyproject.org/api. More concretely, to request all
+ # permissions that the user has, the scope would have to be specified
+ # as ":*". e.g "https://galaxyproject.org/api:*". Currently,
+ # only * is recognised as a valid scope, and future iterations may
# provide more fine-grained scopes.
#oidc_scope_prefix: https://galaxyproject.org/api
@@ -2897,3 +2909,4 @@ galaxy:
# Enable the integration of the Galaxy Help Forum in the tool panel.
# This requires the help_forum_api_url to be set.
#enable_help_forum_tool_panel_integration: false
+
diff --git a/lib/galaxy/jobs/handler.py b/lib/galaxy/jobs/handler.py
index 008a4eee0be4..1df3503ffb96 100644
--- a/lib/galaxy/jobs/handler.py
+++ b/lib/galaxy/jobs/handler.py
@@ -395,6 +395,8 @@ def __monitor_step(self):
self.__handle_waiting_jobs()
except StopSignalException:
pass
+ finally:
+ self.sa_session.remove()
log.trace(monitor_step_timer.to_str())
def __handle_waiting_jobs(self):
@@ -583,9 +585,6 @@ def __handle_waiting_jobs(self):
with transaction(self.sa_session):
self.sa_session.commit()
- # Done with the session
- self.sa_session.remove()
-
def __filter_jobs_with_invalid_input_states(self, jobs):
"""
Takes list of jobs and filters out jobs whose input datasets are in invalid state and
diff --git a/scripts/update_cwl_conformance_tests.sh b/scripts/update_cwl_conformance_tests.sh
index 2a71267c554e..4cc2cdc1386d 100755
--- a/scripts/update_cwl_conformance_tests.sh
+++ b/scripts/update_cwl_conformance_tests.sh
@@ -17,11 +17,7 @@ for version in $VERSIONS; do
conformance_filepath=conformance_tests.yaml
tests_dir=tests
fi
- if [ "$version" = '1.2' ]; then
- branch=1.2.1_proposed
- else
- branch=main
- fi
+ branch=main
wget "https://github.com/common-workflow-language/${repo_name}/archive/${branch}.zip"
unzip ${branch}.zip
rm -rf "${DEST_DIR}/v${version}"