X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/71b9264c1720e619f8cfcb297a7848ece420c61c..59a7af19f6889e79b1b9a4348e9253f3fa0f50c3:/src/store/processes/processes-actions.ts?ds=sidebyside diff --git a/src/store/processes/processes-actions.ts b/src/store/processes/processes-actions.ts index fa81da9f..91996dde 100644 --- a/src/store/processes/processes-actions.ts +++ b/src/store/processes/processes-actions.ts @@ -10,11 +10,19 @@ import { FilterBuilder } from '~/services/api/filter-builder'; import { ContainerRequestResource } from '~/models/container-request'; import { Process } from './process'; import { dialogActions } from '~/store/dialog/dialog-actions'; -import {snackbarActions, SnackbarKind} from '~/store/snackbar/snackbar-actions'; +import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions'; import { projectPanelActions } from '~/store/project-panel/project-panel-action'; +import { navigateToRunProcess } from '~/store/navigation/navigation-action'; +import { goToStep, runProcessPanelActions } from '~/store/run-process-panel/run-process-panel-actions'; +import { getResource } from '~/store/resources/resources'; +import { initialize } from "redux-form"; +import { RUN_PROCESS_BASIC_FORM, RunProcessBasicFormData } from "~/views/run-process-panel/run-process-basic-form"; +import { RunProcessAdvancedFormData, RUN_PROCESS_ADVANCED_FORM } from "~/views/run-process-panel/run-process-advanced-form"; export const loadProcess = (containerRequestUuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository): Promise => { + const response = await services.workflowService.list(); + dispatch(runProcessPanelActions.SET_WORKFLOWS(response.items)); const containerRequest = await services.containerRequestService.get(containerRequestUuid); dispatch(updateResources([containerRequest])); if (containerRequest.containerUuid) { @@ -44,9 +52,11 @@ export const loadSubprocesses = (containerUuid: string) => } }; +const MAX_AMOUNT_OF_SUBPROCESSES = 10000; + export const loadContainerRequests = (filters: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const { items } = await services.containerRequestService.list({ filters }); + const { items } = await services.containerRequestService.list({ filters, limit: MAX_AMOUNT_OF_SUBPROCESSES }); dispatch(updateResources(items)); return items; }; @@ -58,6 +68,64 @@ export const loadContainers = (filters: string) => return items; }; +export const cancelRunningWorkflow = (uuid: string) => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + try { + const process = await services.containerRequestService.update(uuid, { priority: 0 }); + return process; + } catch (e) { + throw new Error('Could not cancel the process.'); + } + }; + +export const reRunProcess = (processUuid: string, workflowUuid: string) => + (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + const process = getResource(processUuid)(getState().resources); + const workflows = getState().runProcessPanel.searchWorkflows; + const workflow = workflows.find(workflow => workflow.uuid === workflowUuid); + if (workflow && process) { + const newValues = getInputs(process); + process.mounts["/var/lib/cwl/workflow.json"].content.$graph.find( + (a: any) => a.id === '#main').inputs = newValues; + const stringifiedDefinition = JSON.stringify(process.mounts["/var/lib/cwl/workflow.json"].content); + const newWorkflow = { ...workflow, definition: stringifiedDefinition }; + + const basicInitialData: RunProcessBasicFormData = { name: `Copy of: ${process.name}`, description: process.description }; + dispatch(initialize(RUN_PROCESS_BASIC_FORM, basicInitialData)); + + const advancedInitialData: RunProcessAdvancedFormData = { + output: process.outputName, + runtime: process.schedulingParameters.max_run_time, + ram: process.runtimeConstraints.ram, + vcpus: process.runtimeConstraints.vcpus, + keep_cache_ram: process.runtimeConstraints.keep_cache_ram, + api: process.runtimeConstraints.API + }; + dispatch(initialize(RUN_PROCESS_ADVANCED_FORM, advancedInitialData)); + + dispatch(navigateToRunProcess); + dispatch(goToStep(1)); + dispatch(runProcessPanelActions.SET_STEP_CHANGED(true)); + dispatch(runProcessPanelActions.SET_SELECTED_WORKFLOW(newWorkflow)); + } else { + dispatch(snackbarActions.OPEN_SNACKBAR({ message: `You can't re-run this process`, kind: SnackbarKind.ERROR })); + } + }; + +const getInputs = (data: any) => + data && data.mounts["/var/lib/cwl/workflow.json"] ? data.mounts["/var/lib/cwl/workflow.json"].content.$graph.find( + (a: any) => a.id === '#main').inputs.map( + (it: any) => ( + { + type: it.type, + id: it.id, + label: it.label, + default: data.mounts["/var/lib/cwl/cwl.input.json"].content[it.id], + doc: it.doc + } + ) + ) : []; + export const openRemoveProcessDialog = (uuid: string) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(dialogActions.OPEN_DIALOG({ @@ -74,11 +142,11 @@ export const openRemoveProcessDialog = (uuid: string) => export const REMOVE_PROCESS_DIALOG = 'removeProcessDialog'; export const removeProcessPermanently = (uuid: string) => - async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) =>{ + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removing ...', kind: SnackbarKind.INFO })); await services.containerRequestService.delete(uuid); dispatch(projectPanelActions.REQUEST_ITEMS()); dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Removed.', hideDuration: 2000, kind: SnackbarKind.SUCCESS })); }; - +