From: Michal Klobukowski Date: Tue, 2 Oct 2018 10:32:05 +0000 (+0200) Subject: Connect running a process X-Git-Tag: 1.3.0~72^2~5 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/d53f2e8a10937bff1bb16a4e37e060daddbf3fa5 Connect running a process Feature #13863 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- diff --git a/src/store/run-process-panel/run-process-panel-actions.ts b/src/store/run-process-panel/run-process-panel-actions.ts index de18e70f..07b0b175 100644 --- a/src/store/run-process-panel/run-process-panel-actions.ts +++ b/src/store/run-process-panel/run-process-panel-actions.ts @@ -6,9 +6,17 @@ import { Dispatch } from 'redux'; import { unionize, ofType, UnionOf } from "~/common/unionize"; import { ServiceRepository } from "~/services/services"; import { RootState } from '~/store/store'; -import { WorkflowResource } from '~/models/workflow'; +import { WorkflowResource, CommandInputParameter } from '~/models/workflow'; +import { getFormValues } from 'redux-form'; +import { RUN_PROCESS_BASIC_FORM, RunProcessBasicFormData } from '~/views/run-process-panel/run-process-basic-form'; +import { RUN_PROCESS_INPUTS_FORM } from '~/views/run-process-panel/run-process-inputs-form'; +import { WorkflowInputsData } from '~/models/workflow'; +import { createWorkflowMounts } from '~/models/process'; +import { ContainerRequestState } from '~/models/container-request'; +import { navigateToProcess } from '../navigation/navigation-action'; export const runProcessPanelActions = unionize({ + SET_PROCESS_OWNER_UUID: ofType(), SET_CURRENT_STEP: ofType(), SET_WORKFLOWS: ofType(), SET_SELECTED_WORKFLOW: ofType(), @@ -33,9 +41,50 @@ export const loadRunProcessPanel = () => } }; -export const setWorkflow = (workflow: WorkflowResource) => +export const setWorkflow = (workflow: WorkflowResource) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(runProcessPanelActions.SET_SELECTED_WORKFLOW(workflow)); }; -export const goToStep = (step: number) => runProcessPanelActions.SET_CURRENT_STEP(step); \ No newline at end of file +export const goToStep = (step: number) => runProcessPanelActions.SET_CURRENT_STEP(step); + +export const runProcess = async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + const state = getState(); + const basicForm = getFormValues(RUN_PROCESS_BASIC_FORM)(state) as RunProcessBasicFormData; + const inputsForm = getFormValues(RUN_PROCESS_INPUTS_FORM)(state) as WorkflowInputsData; + const { processOwnerUuid, selectedWorkflow } = state.runProcessPanel; + if (selectedWorkflow) { + const newProcessData = { + ownerUuid: processOwnerUuid, + name: basicForm.name, + description: basicForm.description, + state: ContainerRequestState.COMMITTED, + mounts: createWorkflowMounts(selectedWorkflow, normalizeInputKeys(inputsForm)), + runtimeConstraints: { + API: true, + vcpus: 1, + ram: 1073741824, + }, + containerImage: 'arvados/jobs:1.1.4.20180618144723', + cwd: '/var/spool/cwl', + command: [ + 'arvados-cwl-runner', + '--local', + '--api=containers', + `--project-uuid=${processOwnerUuid}`, + '/var/lib/cwl/workflow.json#main', + '/var/lib/cwl/cwl.input.json' + ], + outputPath: '/var/spool/cwl', + priority: 1, + }; + const newProcess = await services.containerRequestService.create(newProcessData); + dispatch(navigateToProcess(newProcess.uuid)); + } +}; + +const normalizeInputKeys = (inputs: WorkflowInputsData): WorkflowInputsData => + Object.keys(inputs).reduce((normalizedInputs, key) => ({ + ...normalizedInputs, + [key.split('/').slice(1).join('/')]: inputs[key], + }), {}); \ No newline at end of file diff --git a/src/store/run-process-panel/run-process-panel-reducer.ts b/src/store/run-process-panel/run-process-panel-reducer.ts index f91039b3..2470de14 100644 --- a/src/store/run-process-panel/run-process-panel-reducer.ts +++ b/src/store/run-process-panel/run-process-panel-reducer.ts @@ -6,6 +6,7 @@ import { RunProcessPanelAction, runProcessPanelActions } from '~/store/run-proce import { WorkflowResource, CommandInputParameter, getWorkflowInputs, parseWorkflowDefinition } from '~/models/workflow'; interface RunProcessPanel { + processOwnerUuid: string; currentStep: number; workflows: WorkflowResource[]; selectedWorkflow: WorkflowResource | undefined; @@ -13,6 +14,7 @@ interface RunProcessPanel { } const initialState: RunProcessPanel = { + processOwnerUuid: '', currentStep: 0, workflows: [], selectedWorkflow: undefined, @@ -21,6 +23,7 @@ const initialState: RunProcessPanel = { export const runProcessPanelReducer = (state = initialState, action: RunProcessPanelAction): RunProcessPanel => runProcessPanelActions.match(action, { + SET_PROCESS_OWNER_UUID: processOwnerUuid => ({ ...state, processOwnerUuid }), SET_CURRENT_STEP: currentStep => ({ ...state, currentStep }), SET_WORKFLOWS: workflows => ({ ...state, workflows }), SET_SELECTED_WORKFLOW: selectedWorkflow => ({ diff --git a/src/views-components/side-panel-button/side-panel-button.tsx b/src/views-components/side-panel-button/side-panel-button.tsx index 2e8433a9..9ba23267 100644 --- a/src/views-components/side-panel-button/side-panel-button.tsx +++ b/src/views-components/side-panel-button/side-panel-button.tsx @@ -15,6 +15,7 @@ import { openProjectCreateDialog } from '~/store/projects/project-create-actions import { openCollectionCreateDialog } from '~/store/collections/collection-create-actions'; import { matchProjectRoute } from '~/routes/routes'; import { navigateToRunProcess } from '~/store/navigation/navigation-action'; +import { runProcessPanelActions } from '~/store/run-process-panel/run-process-panel-actions'; type CssRules = 'button' | 'menuItem' | 'icon'; @@ -67,10 +68,10 @@ export const SidePanelButton = withStyles(styles)( }; render() { - const { classes, buttonVisible } = this.props; + const { classes, buttonVisible } = this.props; const { anchorEl } = this.state; return - {buttonVisible && + {buttonVisible &&