Skip to content

Commit cdb2ba0

Browse files
committed
Set default starting task when continuing a workflow execution
1 parent 59958ec commit cdb2ba0

File tree

7 files changed

+54
-9
lines changed

7 files changed

+54
-9
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* supported editing of single dataset images (\#457);
2020
* used switches to represent boolean flags (\#457);
2121
* implemented continue/restart workflow (\#465);
22+
* set default first task when continuing a workflow (\#466);
2223

2324
# 0.10.2
2425

__tests__/job_utilities.test.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { it, expect } from 'vitest';
22
import {
33
extractJobErrorParts,
44
extractRelevantJobError,
5-
generateNewUniqueDatasetName
5+
generateNewUniqueDatasetName,
6+
getFirstTaskIndexForContinuingWorkflow
67
} from '$lib/common/job_utilities.js';
78

89
const completeTracebackError = `TASK ERROR:Task id: 15 (Create OME-Zarr structure), e.workflow_task_order=0
@@ -237,6 +238,19 @@ it('generates new unique dataset name', () => {
237238
);
238239
});
239240

241+
it('get first task index for continuing workflow', () => {
242+
expect(testGetFirstTaskIndexForContinuingWorkflow([null, null, null, null])).toEqual(0);
243+
expect(testGetFirstTaskIndexForContinuingWorkflow(['done', 'done', null, null])).toEqual(2);
244+
expect(testGetFirstTaskIndexForContinuingWorkflow(['done', 'failed', 'done', null])).toEqual(1);
245+
expect(testGetFirstTaskIndexForContinuingWorkflow(['done', null, 'done', null])).toEqual(1);
246+
expect(testGetFirstTaskIndexForContinuingWorkflow(['done', 'done', 'done', 'done'])).toEqual(
247+
undefined
248+
);
249+
expect(testGetFirstTaskIndexForContinuingWorkflow(['submitted', 'failed', null, null])).toEqual(
250+
undefined
251+
);
252+
});
253+
240254
/**
241255
* @param {string[]} names
242256
*/
@@ -245,3 +259,20 @@ function getMockedDatasets(names) {
245259
return { id: index + 1, name };
246260
});
247261
}
262+
263+
/**
264+
* @param {Array<string|null>} values
265+
* @returns {number|undefined}
266+
*/
267+
function testGetFirstTaskIndexForContinuingWorkflow(values) {
268+
const workflowTasks = values.map((_, i) => {
269+
return {
270+
id: i + 1,
271+
order: i
272+
};
273+
});
274+
const statuses = Object.fromEntries(
275+
values.map((v, i) => [i + 1, v]).filter((e) => e[1] !== null)
276+
);
277+
return getFirstTaskIndexForContinuingWorkflow(workflowTasks, statuses);
278+
}

src/lib/common/job_utilities.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,16 @@ export function generateNewUniqueDatasetName(datasets, selectedDatasetName) {
133133
} while (datasets.filter((d) => d.name === newDatasetName).length > 0);
134134
return newDatasetName;
135135
}
136+
137+
/**
138+
* @param {Array<import("$lib/types-v2").WorkflowTaskV2>} workflowTasks
139+
* @param {{[key: number]: import('$lib/types').JobStatus}} statuses
140+
* @returns {number|undefined}
141+
*/
142+
export function getFirstTaskIndexForContinuingWorkflow(workflowTasks, statuses) {
143+
if (workflowTasks.find((wft) => statuses[wft.id] === 'submitted')) {
144+
// we can't re-submit while something is running
145+
return undefined;
146+
}
147+
return workflowTasks.find((wft) => !(wft.id in statuses) || statuses[wft.id] === 'failed')?.order;
148+
}

src/lib/components/v2/projects/datasets/DatasetFiltersModal.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
const result = await response.json();
5050
if (!response.ok) {
5151
console.log('Dataset update failed', result);
52-
throw new AlertError(await response.json());
52+
throw new AlertError(result);
5353
}
5454
updateDatasetCallback(result);
5555
},

src/lib/components/v2/workflow/RunWorkflowModal.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { page } from '$app/stores';
33
import { replaceEmptyStrings } from '$lib/common/component_utilities';
44
import { AlertError } from '$lib/common/errors';
5-
import { generateNewUniqueDatasetName } from '$lib/common/job_utilities';
5+
import { generateNewUniqueDatasetName, getFirstTaskIndexForContinuingWorkflow } from '$lib/common/job_utilities';
66
import Modal from '$lib/components/common/Modal.svelte';
77
88
/** @type {import('$lib/types-v2').DatasetV2[]} */
@@ -15,6 +15,8 @@
1515
export let onJobSubmitted;
1616
/** @type {(updatedDatasets: import('$lib/types-v2').DatasetV2[], newSelectedDatasetId: number) => void} */
1717
export let onDatasetsUpdated;
18+
/** @type {{[key: number]: import('$lib/types').JobStatus}} */
19+
export let statuses;
1820
1921
/** @type {Modal} */
2022
let modal;
@@ -48,7 +50,7 @@
4850
if ((mode === 'run' || mode === 'restart') && workflow.task_list.length > 0) {
4951
firstTaskIndex = 0;
5052
} else {
51-
firstTaskIndex = undefined;
53+
firstTaskIndex = getFirstTaskIndexForContinuingWorkflow(workflow.task_list, statuses);
5254
}
5355
lastTaskIndex = undefined;
5456
modal.show();
@@ -261,7 +263,7 @@
261263
class:is-invalid={newDatasetName === selectedDataset?.name}
262264
/>
263265
<span class="invalid-feedback">
264-
The new dataset name must be different than the original dataset name
266+
The new dataset name must be different from the original dataset name
265267
</span>
266268
</div>
267269
{/if}

src/routes/v2/projects/[projectId]/workflows/[workflowId]/+page.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,7 @@
10991099
{datasets}
11001100
{selectedDatasetId}
11011101
{onJobSubmitted}
1102+
{statuses}
11021103
onDatasetsUpdated={(updatedDatasets, newSelectedDatasetId) => {
11031104
datasets = updatedDatasets;
11041105
selectedDatasetId = newSelectedDatasetId;

tests/v2/run_mock_tasks.spec.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,7 @@ test('Collect and run mock tasks [v2]', async ({ page, workflow, request }) => {
232232
modal
233233
.getByRole('combobox', { name: 'First task (Optional)' })
234234
.getByRole('option', { selected: true })
235-
).toHaveText('Select first task');
236-
await modal
237-
.getByRole('combobox', { name: 'First task (Optional)' })
238-
.selectOption('generic_task');
235+
).toHaveText('generic_task');
239236
await modal.getByRole('button', { name: 'Run', exact: true }).click();
240237
await modal.getByRole('button', { name: 'Confirm' }).click();
241238
await waitModalClosed(page);

0 commit comments

Comments
 (0)