Merge branch 'master'
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 2 Oct 2018 12:34:51 +0000 (14:34 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 2 Oct 2018 12:34:51 +0000 (14:34 +0200)
Feature #13863

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

1  2 
src/store/run-process-panel/run-process-panel-actions.ts
src/store/run-process-panel/run-process-panel-reducer.ts
src/views/run-process-panel/run-process-panel-root.tsx
src/views/run-process-panel/run-process-panel.tsx

index a58eff8ad03ad45d1db963788226754dd97fa912,3a3f6b0500e29441186ca1543c7854b2f67363d7..7112f715b4c449d2ee7aa15ac6786f783a4c0d2b
@@@ -7,20 -7,12 +7,21 @@@ import { unionize, ofType, UnionOf } fr
  import { ServiceRepository } from "~/services/services";
  import { RootState } from '~/store/store';
  import { WorkflowResource } 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';
 +import { RunProcessAdvancedFormData, RUN_PROCESS_ADVANCED_FORM } from '~/views/run-process-panel/run-process-advanced-form';
  
  export const runProcessPanelActions = unionize({
 +    SET_PROCESS_OWNER_UUID: ofType<string>(),
      SET_CURRENT_STEP: ofType<number>(),
      SET_WORKFLOWS: ofType<WorkflowResource[]>(),
      SET_SELECTED_WORKFLOW: ofType<WorkflowResource>(),
+     SEARCH_WORKFLOWS: ofType<string>()
  });
  
  export interface RunProcessSecondStepDataFormProps {
@@@ -42,52 -34,11 +43,53 @@@ export const loadRunProcessPanel = () =
          }
      };
  
 -export const setWorkflow = (workflow: WorkflowResource) => 
 +export const setWorkflow = (workflow: WorkflowResource) =>
      async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
          dispatch(runProcessPanelActions.SET_SELECTED_WORKFLOW(workflow));
      };
  
  export const goToStep = (step: number) => runProcessPanelActions.SET_CURRENT_STEP(step);
  
 -export const searchWorkflows = (term: string) => runProcessPanelActions.SEARCH_WORKFLOWS(term);
 +export const runProcess = async (dispatch: Dispatch<any>, 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 advancedForm = getFormValues(RUN_PROCESS_ADVANCED_FORM)(state) as RunProcessAdvancedFormData;
 +    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,
 +            outputName: advancedForm && advancedForm.output ? advancedForm.output : undefined,
 +        };
 +        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],
-     }), {});
++    }), {});
++export const searchWorkflows = (term: string) => runProcessPanelActions.SEARCH_WORKFLOWS(term);
index 2470de1436e30605356dfbbdb83cdb764859eb11,10cdaeb77e3de7280774e157dfef381d7305d319..0ad06bee58da253d83e2ad31fbad04a65b1bd7d6
@@@ -3,33 -3,27 +3,36 @@@
  // SPDX-License-Identifier: AGPL-3.0
  
  import { RunProcessPanelAction, runProcessPanelActions } from '~/store/run-process-panel/run-process-panel-actions';
 -import { WorkflowResource } from '~/models/workflow';
 +import { WorkflowResource, CommandInputParameter, getWorkflowInputs, parseWorkflowDefinition } from '~/models/workflow';
  
  interface RunProcessPanel {
 +    processOwnerUuid: string;
      currentStep: number;
      workflows: WorkflowResource[];
+     searchWorkflows: WorkflowResource[];
      selectedWorkflow: WorkflowResource | undefined;
 +    inputs: CommandInputParameter[];
  }
  
  const initialState: RunProcessPanel = {
 +    processOwnerUuid: '',
      currentStep: 0,
      workflows: [],
 -    selectedWorkflow: undefined
 +    selectedWorkflow: undefined,
 +    inputs: [],
+     searchWorkflows: [],
  };
  
  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 => ({
 +            ...state,
 +            selectedWorkflow,
 +            inputs: getWorkflowInputs(parseWorkflowDefinition(selectedWorkflow)) || [],
 +        }),
+         SET_WORKFLOWS: workflows => ({ ...state, workflows, searchWorkflows: workflows }), 
 -        SET_SELECTED_WORKFLOW: selectedWorkflow => ({ ...state, selectedWorkflow }),
+         SEARCH_WORKFLOWS: term => ({ ...state, searchWorkflows: state.workflows.filter(workflow => workflow.name.includes(term)) }),
          default: () => state
      });
index da21d704d766e48577ecc96f9eb40d4b495998a2,b656ba1f0d776d819c2e292f0c37f35af622161a..1489527530fa427ea9e72f72a7ec316e7d41416a
@@@ -5,36 -5,34 +5,37 @@@
  import * as React from 'react';
  import { Stepper, Step, StepLabel, StepContent } from '@material-ui/core';
  import { RunProcessFirstStepDataProps, RunProcessFirstStepActionProps, RunProcessFirstStep } from '~/views/run-process-panel/run-process-first-step';
 -import { RunProcessSecondStepDataProps, RunProcessSecondStepActionProps, RunProcessSecondStepForm } from '~/views/run-process-panel/run-process-second-step';
 +import { RunProcessSecondStepForm } from './run-process-second-step';
  
  export type RunProcessPanelRootDataProps = {
      currentStep: number;
 -} & RunProcessFirstStepDataProps & RunProcessSecondStepDataProps;
 +} & RunProcessFirstStepDataProps;
  
 -export type RunProcessPanelRootActionProps = RunProcessFirstStepActionProps & RunProcessSecondStepActionProps;
 +export type RunProcessPanelRootActionProps = RunProcessFirstStepActionProps & {
 +    runProcess: () => void;
 +};
  
  type RunProcessPanelRootProps = RunProcessPanelRootDataProps & RunProcessPanelRootActionProps;
  
- export const RunProcessPanelRoot = ({ runProcess, currentStep, onSetStep, onSetWorkflow, workflows, selectedWorkflow }: RunProcessPanelRootProps) =>
 -export const RunProcessPanelRoot = ({ currentStep, onSearch, onSetStep, onRunProcess, onSetWorkflow, workflows, selectedWorkflow }: RunProcessPanelRootProps) =>
++export const RunProcessPanelRoot = ({ runProcess, currentStep, onSearch, onSetStep, onSetWorkflow, workflows, selectedWorkflow }: RunProcessPanelRootProps) =>
      <Stepper activeStep={currentStep} orientation="vertical" elevation={2}>
          <Step>
              <StepLabel>Choose a workflow</StepLabel>
              <StepContent>
 -                <RunProcessFirstStep 
 +                <RunProcessFirstStep
                      workflows={workflows}
                      selectedWorkflow={selectedWorkflow}
-                     onSetStep={onSetStep}
+                     onSearch={onSearch}
+                     onSetStep={onSetStep} 
                      onSetWorkflow={onSetWorkflow} />
              </StepContent>
          </Step>
          <Step>
              <StepLabel>Select inputs</StepLabel>
              <StepContent>
 -                <RunProcessSecondStepForm />
 -                {/* <RunProcessSecondStep onSetStep={onSetStep} onRunProcess={onRunProcess} /> */}
 +                <RunProcessSecondStepForm
 +                    goBack={() => onSetStep(0)}
 +                    runProcess={runProcess} />
              </StepContent>
          </Step>
      </Stepper>;
index 68917c2cf94ae108383be387488e475fae0d249a,1f43e05ce367fd66a1718c038bf85d636d227a54..42324ab032455c023ddd0c752895f24ec63a8c97
@@@ -6,12 -6,12 +6,12 @@@ import { Dispatch } from 'redux'
  import { connect } from 'react-redux';
  import { RootState } from '~/store/store';
  import { RunProcessPanelRootDataProps, RunProcessPanelRootActionProps, RunProcessPanelRoot } from '~/views/run-process-panel/run-process-panel-root';
- import { goToStep, setWorkflow, runProcess } from '~/store/run-process-panel/run-process-panel-actions';
 -import { goToStep, setWorkflow, searchWorkflows } from '~/store/run-process-panel/run-process-panel-actions';
++import { goToStep, setWorkflow, runProcess, searchWorkflows } from '~/store/run-process-panel/run-process-panel-actions';
  import { WorkflowResource } from '~/models/workflow';
  
  const mapStateToProps = ({ runProcessPanel }: RootState): RunProcessPanelRootDataProps => {
      return {
-         workflows: runProcessPanel.workflows,
+         workflows: runProcessPanel.searchWorkflows,
          currentStep: runProcessPanel.currentStep,
          selectedWorkflow: runProcessPanel.selectedWorkflow
      };
@@@ -24,8 -24,11 +24,11 @@@ const mapDispatchToProps = (dispatch: D
      onSetWorkflow: (workflow: WorkflowResource) => {
          dispatch<any>(setWorkflow(workflow));
      },
 -    onRunProcess: () => {
 -        
 +    runProcess: () => {
 +        dispatch<any>(runProcess);
+     },
+     onSearch: (term: string) => {
+         dispatch<any>(searchWorkflows(term));
      }
  });