diff --git a/.github/workflows/api.yaml b/.github/workflows/api.yaml index 8eb5a2dd564a..0ca4399f9314 100644 --- a/.github/workflows/api.yaml +++ b/.github/workflows/api.yaml @@ -18,6 +18,7 @@ env: GALAXY_TEST_DBURI: 'postgresql://postgres:postgres@localhost:5432/galaxy?client_encoding=utf8' GALAXY_TEST_RAISE_EXCEPTION_ON_HISTORYLESS_HDA: '1' GALAXY_CONFIG_SQLALCHEMY_WARN_20: '1' + GALAXY_TEST_REQUIRE_ALL_NEEDED_TOOLS: '1' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/dependencies.yaml b/.github/workflows/dependencies.yaml index 9b319d1954e1..2401107eb325 100644 --- a/.github/workflows/dependencies.yaml +++ b/.github/workflows/dependencies.yaml @@ -8,18 +8,17 @@ jobs: name: Update dependencies if: github.repository_owner == 'galaxyproject' runs-on: ubuntu-latest - strategy: - matrix: - python-version: ['3.8'] steps: - uses: actions/checkout@v4 + # Install Python 3.8 for update_lint_requirements.sh + # Install Python 3.9 (as default) to allow `uv lock` to generate metadata for rucio-clients - uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: | + 3.8 + 3.9 - name: Update dependencies - run: | - python -m venv .venv - make update-dependencies + run: make update-dependencies - name: Create pull request uses: peter-evans/create-pull-request@v6 with: diff --git a/.github/workflows/first_startup.yaml b/.github/workflows/first_startup.yaml index e35170d063a0..05efc45367b9 100644 --- a/.github/workflows/first_startup.yaml +++ b/.github/workflows/first_startup.yaml @@ -23,7 +23,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] defaults: run: shell: bash -l {0} diff --git a/.github/workflows/framework_workflows.yaml b/.github/workflows/framework_workflows.yaml index 93ab6c0bbf1a..018463833e22 100644 --- a/.github/workflows/framework_workflows.yaml +++ b/.github/workflows/framework_workflows.yaml @@ -16,6 +16,7 @@ on: env: GALAXY_TEST_DBURI: 'postgresql://postgres:postgres@localhost:5432/galaxy?client_encoding=utf8' GALAXY_TEST_RAISE_EXCEPTION_ON_HISTORYLESS_HDA: '1' + GALAXY_TEST_WORKFLOW_AFTER_RERUN: '1' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 130be9861afb..37d337fb95fe 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] env: LINT_PATH: 'lib/galaxy/dependencies/pinned-lint-requirements.txt' TYPE_PATH: 'lib/galaxy/dependencies/pinned-typecheck-requirements.txt' diff --git a/.github/workflows/lint_openapi_schema.yml b/.github/workflows/lint_openapi_schema.yml index 2a94508ce6f2..4dc692fc2739 100644 --- a/.github/workflows/lint_openapi_schema.yml +++ b/.github/workflows/lint_openapi_schema.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/osx_startup.yaml b/.github/workflows/osx_startup.yaml index 22ffc4d7e5b6..13960eb8e85f 100644 --- a/.github/workflows/osx_startup.yaml +++ b/.github/workflows/osx_startup.yaml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] defaults: run: shell: bash -l {0} diff --git a/.github/workflows/reports_startup.yaml b/.github/workflows/reports_startup.yaml index 137c1a5e1204..b7449dc5979c 100644 --- a/.github/workflows/reports_startup.yaml +++ b/.github/workflows/reports_startup.yaml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] defaults: run: shell: bash -l {0} diff --git a/.github/workflows/test_galaxy_packages.yaml b/.github/workflows/test_galaxy_packages.yaml index 293e98e658bd..f38f05846e74 100644 --- a/.github/workflows/test_galaxy_packages.yaml +++ b/.github/workflows/test_galaxy_packages.yaml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/toolshed.yaml b/.github/workflows/toolshed.yaml index fae33b4e1225..14be278e16bc 100644 --- a/.github/workflows/toolshed.yaml +++ b/.github/workflows/toolshed.yaml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] shed-api: ['v1', 'v2'] test-install-client: ['galaxy_api', 'standalone'] services: diff --git a/.github/workflows/unit.yaml b/.github/workflows/unit.yaml index 80f54e87a704..671dcac0162d 100644 --- a/.github/workflows/unit.yaml +++ b/.github/workflows/unit.yaml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.8', '3.13'] steps: - uses: actions/checkout@v4 with: diff --git a/client/package.json b/client/package.json index a4f2c4b695d2..b2a751ff3d94 100644 --- a/client/package.json +++ b/client/package.json @@ -62,6 +62,7 @@ "dom-to-image": "^2.6.0", "dompurify": "^3.0.6", "dumpmeta-webpack-plugin": "^0.2.0", + "echarts": "^5.5.1", "elkjs": "^0.8.2", "file-saver": "^2.0.5", "flush-promises": "^1.0.2", @@ -100,7 +101,11 @@ "tus-js-client": "^3.1.1", "underscore": "^1.13.6", "util": "^0.12.5", + "vega": "^5.30.0", + "vega-embed": "^6.26.0", + "vega-lite": "^5.21.0", "vue": "^2.7.14", + "vue-echarts": "^7.0.3", "vue-infinite-scroll": "^2.0.2", "vue-multiselect": "^2.1.7", "vue-observe-visibility": "^1.0.0", diff --git a/client/src/api/schema/schema.ts b/client/src/api/schema/schema.ts index a8ddacee9b22..f4f0ba6b4c94 100644 --- a/client/src/api/schema/schema.ts +++ b/client/src/api/schema/schema.ts @@ -2594,6 +2594,23 @@ export interface paths { patch?: never; trace?: never; }; + "/api/invocations/{invocation_id}/metrics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get Invocation Metrics */ + get: operations["get_invocation_metrics_api_invocations__invocation_id__metrics_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/invocations/{invocation_id}/prepare_store_download": { parameters: { query?: never; @@ -2645,6 +2662,23 @@ export interface paths { patch?: never; trace?: never; }; + "/api/invocations/{invocation_id}/request": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a description modeling an API request to invoke this workflow - this is recreated and will be more specific in some ways than the initial creation request. */ + get: operations["invocation_as_request_api_invocations__invocation_id__request_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/invocations/{invocation_id}/step_jobs_summary": { parameters: { query?: never; @@ -7175,6 +7209,12 @@ export interface components { CreateWorkflowLandingRequestPayload: { /** Client Secret */ client_secret?: string | null; + /** + * Public + * @description If workflow landing request is public anyone with the uuid can use the landing request. If not public the request must be claimed before use and additional verification might occur. + * @default false + */ + public: boolean; /** Request State */ request_state?: Record | null; /** Workflow Id */ @@ -7183,7 +7223,7 @@ export interface components { * Workflow Target Type * @enum {string} */ - workflow_target_type: "stored_workflow" | "workflow"; + workflow_target_type: "stored_workflow" | "workflow" | "trs_url"; }; /** CreatedEntryResponse */ CreatedEntryResponse: { @@ -8730,6 +8770,11 @@ export interface components { * @description The email of the user that owns this job. Only the owner of the job and administrators can see this value. */ user_email?: string | null; + /** + * User Id + * @description User ID of user that ran this job + */ + user_id?: string | null; }; /** EncodedJobParameterHistoryItem */ EncodedJobParameterHistoryItem: { @@ -12385,8 +12430,9 @@ export interface components { */ batch: boolean | null; /** - * Dataset Map - * @description TODO + * Legacy Dataset Map + * @deprecated + * @description An older alternative to specifying inputs using database IDs, do not use this and use inputs instead * @default {} */ ds_map: { @@ -12409,12 +12455,12 @@ export interface components { history_id?: string | null; /** * Inputs - * @description TODO + * @description Specify values for formal inputs to the workflow */ inputs?: Record | null; /** * Inputs By - * @description How inputs maps to inputs (datasets/collections) to workflows steps. + * @description How the 'inputs' field maps its inputs (datasets/collections/step parameters) to workflows steps. */ inputs_by?: string | null; /** @@ -12441,35 +12487,35 @@ export interface components { */ no_add_to_history: boolean | null; /** - * Parameters - * @description The raw parameters for the workflow invocation. + * Legacy Step Parameters + * @description Parameters specified per-step for the workflow invocation, this is legacy and you should generally use inputs and only specify the formal parameters of a workflow instead. * @default {} */ parameters: Record | null; /** - * Parameters Normalized - * @description Indicates if parameters are already normalized for workflow invocation. + * Legacy Step Parameters Normalized + * @description Indicates if legacy parameters are already normalized to be indexed by the order_index and are specified as a dictionary per step. Legacy-style parameters could previously be specified as one parameter per step or by tool ID. * @default false */ parameters_normalized: boolean | null; /** * Preferred Intermediate Object Store ID - * @description The ID of the ? object store that should be used to store ? datasets in this history. + * @description The ID of the object store that should be used to store the intermediate datasets of this workflow - - Galaxy's job configuration may override this in some cases but this workflow preference will override tool and user preferences */ preferred_intermediate_object_store_id?: string | null; /** * Preferred Object Store ID - * @description The ID of the object store that should be used to store new datasets in this history. + * @description The ID of the object store that should be used to store all datasets (can instead specify object store IDs for intermediate and outputs datasts separately) - - Galaxy's job configuration may override this in some cases but this workflow preference will override tool and user preferences */ preferred_object_store_id?: string | null; /** * Preferred Outputs Object Store ID - * @description The ID of the object store that should be used to store ? datasets in this history. + * @description The ID of the object store that should be used to store the marked output datasets of this workflow - Galaxy's job configuration may override this in some cases but this workflow preference will override tool and user preferences. */ preferred_outputs_object_store_id?: string | null; /** * Replacement Parameters - * @description TODO + * @description Class of parameters mostly used for string replacement in PJAs. In best practice workflows, these should be replaced with input parameters * @default {} */ replacement_params: Record | null; @@ -12481,7 +12527,7 @@ export interface components { require_exact_tool_versions: boolean | null; /** * Resource Parameters - * @description TODO + * @description If a workflow_resource_params_file file is defined and the target workflow is configured to consumer resource parameters, they can be specified with this parameter. See https://github.com/galaxyproject/galaxy/pull/4830 for more information. * @default {} */ resource_params: Record | null; @@ -12490,11 +12536,6 @@ export interface components { * @description Scheduler to use for workflow invocation. */ scheduler?: string | null; - /** - * Step Parameters - * @description TODO - */ - step_parameters?: Record | null; /** * Use cached job * @description Indicated whether to use a cached job for workflow invocation. @@ -14064,21 +14105,6 @@ export interface components { * @description The source of the content. Can be other history element to be copied or library elements. */ source: components["schemas"]["DatasetSourceType"]; - /** - * Validate hashes - * @description Set to true to enable dataset validation during materialization. - * @default false - */ - validate_hashes: boolean; - }; - /** MaterializeDatasetOptions */ - MaterializeDatasetOptions: { - /** - * Validate hashes - * @description Set to true to enable dataset validation during materialization. - * @default false - */ - validate_hashes: boolean; }; /** MessageExceptionModel */ MessageExceptionModel: { @@ -16158,6 +16184,11 @@ export interface components { * @description The email of the user that owns this job. Only the owner of the job and administrators can see this value. */ user_email?: string | null; + /** + * User Id + * @description User ID of user that ran this job + */ + user_id?: string | null; }; /** * Src @@ -18188,6 +18219,86 @@ export interface components { */ workflow_id: string; }; + /** + * WorkflowInvocationRequestModel + * @description Model a workflow invocation request (InvokeWorkflowPayload) for an existing invocation. + */ + WorkflowInvocationRequestModel: { + /** + * History ID + * @description The encoded history id the workflow was run in. + */ + history_id: string; + /** + * Inputs + * @description Values for inputs + */ + inputs: Record; + /** + * Inputs by + * @description How the 'inputs' field maps its inputs (datasets/collections/step parameters) to workflows steps. + */ + inputs_by: string; + /** + * Is instance + * @description This API yields a particular workflow instance, newer workflows belonging to the same storedworkflow may have different state. + * @default true + * @constant + * @enum {boolean} + */ + instance: true; + /** + * Legacy Step Parameters + * @description Parameters specified per-step for the workflow invocation, this is legacy and you should generally use inputs and only specify the formal parameters of a workflow instead. If these are set, the workflow was not executed in a best-practice fashion and we the resulting invocation request may not fully reflect the executed workflow state. + */ + parameters?: Record | null; + /** + * Legacy Step Parameters Normalized + * @description Indicates if legacy parameters are already normalized to be indexed by the order_index and are specified as a dictionary per step. Legacy-style parameters could previously be specified as one parameter per step or by tool ID. + * @default true + * @constant + * @enum {boolean} + */ + parameters_normalized: true; + /** + * Preferred Intermediate Object Store ID + * @description The ID of the object store that should be used to store the intermediate datasets of this workflow - - Galaxy's job configuration may override this in some cases but this workflow preference will override tool and user preferences + */ + preferred_intermediate_object_store_id?: string | null; + /** + * Preferred Object Store ID + * @description The ID of the object store that should be used to store all datasets (can instead specify object store IDs for intermediate and outputs datasts separately) - - Galaxy's job configuration may override this in some cases but this workflow preference will override tool and user preferences + */ + preferred_object_store_id?: string | null; + /** + * Preferred Outputs Object Store ID + * @description The ID of the object store that should be used to store the marked output datasets of this workflow - Galaxy's job configuration may override this in some cases but this workflow preference will override tool and user preferences. + */ + preferred_outputs_object_store_id?: string | null; + /** + * Replacement Parameters + * @description Class of parameters mostly used for string replacement in PJAs. In best practice workflows, these should be replaced with input parameters + * @default {} + */ + replacement_params: Record | null; + /** + * Resource Parameters + * @description If a workflow_resource_params_file file is defined and the target workflow is configured to consumer resource parameters, they can be specified with this parameter. See https://github.com/galaxyproject/galaxy/pull/4830 for more information. + * @default {} + */ + resource_params: Record | null; + /** + * Use cached job + * @description Indicated whether to use a cached job for workflow invocation. + * @default false + */ + use_cached_job: boolean; + /** + * Workflow ID + * @description The encoded Workflow ID associated with the invocation. + */ + workflow_id: string; + }; /** WorkflowInvocationResponse */ WorkflowInvocationResponse: | components["schemas"]["WorkflowInvocationElementView"] @@ -18218,6 +18329,49 @@ export interface components { [key: string]: number; }; }; + /** + * WorkflowJobMetric + * @example { + * "name": "start_epoch", + * "plugin": "core", + * "raw_value": "1614261340.0000000", + * "title": "Job Start Time", + * "value": "2021-02-25 14:55:40" + * } + */ + WorkflowJobMetric: { + /** + * Name + * @description The name of the metric variable. + */ + name: string; + /** + * Plugin + * @description The instrumenter plugin that generated this metric. + */ + plugin: string; + /** + * Raw Value + * @description The raw value of the metric as a string. + */ + raw_value: string; + /** Step Index */ + step_index: number; + /** Step Label */ + step_label: string | null; + /** + * Title + * @description A descriptive title for this metric. + */ + title: string; + /** Tool Id */ + tool_id: string; + /** + * Value + * @description The textual representation of the metric value. + */ + value: string; + }; /** WorkflowLandingRequest */ WorkflowLandingRequest: { /** Request State */ @@ -18235,7 +18389,7 @@ export interface components { * Workflow Target Type * @enum {string} */ - workflow_target_type: "stored_workflow" | "workflow"; + workflow_target_type: "stored_workflow" | "workflow" | "trs_url"; }; /** WriteInvocationStoreToPayload */ WriteInvocationStoreToPayload: { @@ -24316,11 +24470,7 @@ export interface operations { }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["MaterializeDatasetOptions"] | null; - }; - }; + requestBody?: never; responses: { /** @description Successful Response */ 200: { @@ -26922,6 +27072,50 @@ export interface operations { }; }; }; + get_invocation_metrics_api_invocations__invocation_id__metrics_get: { + parameters: { + query?: never; + header?: { + /** @description The user ID that will be used to effectively make this API call. Only admins and designated users can make API calls on behalf of other users. */ + "run-as"?: string | null; + }; + path: { + /** @description The encoded database identifier of the Invocation. */ + invocation_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WorkflowJobMetric"][]; + }; + }; + /** @description Request Error */ + "4XX": { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MessageExceptionModel"]; + }; + }; + /** @description Server Error */ + "5XX": { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MessageExceptionModel"]; + }; + }; + }; + }; prepare_store_download_api_invocations__invocation_id__prepare_store_download_post: { parameters: { query?: never; @@ -27056,6 +27250,50 @@ export interface operations { }; }; }; + invocation_as_request_api_invocations__invocation_id__request_get: { + parameters: { + query?: never; + header?: { + /** @description The user ID that will be used to effectively make this API call. Only admins and designated users can make API calls on behalf of other users. */ + "run-as"?: string | null; + }; + path: { + /** @description The encoded database identifier of the Invocation. */ + invocation_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["WorkflowInvocationRequestModel"]; + }; + }; + /** @description Request Error */ + "4XX": { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MessageExceptionModel"]; + }; + }; + /** @description Server Error */ + "5XX": { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["MessageExceptionModel"]; + }; + }; + }; + }; invocation_step_jobs_summary_api_invocations__invocation_id__step_jobs_summary_get: { parameters: { query?: never; diff --git a/client/src/components/DatasetInformation/DatasetAttributes.vue b/client/src/components/DatasetInformation/DatasetAttributes.vue index a9fa7db9acd0..1444085890ff 100644 --- a/client/src/components/DatasetInformation/DatasetAttributes.vue +++ b/client/src/components/DatasetInformation/DatasetAttributes.vue @@ -138,7 +138,8 @@ onMounted(async () => { v-if=" (!datasetAttributes['conversion_disable'] || !datasetAttributes['datatype_disable']) && !datasetAttributes['metadata_disable'] - "> + " + title-link-class="dataset-edit-datatype-tab">