15768: new dialog box for multi-copy Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa...
[arvados-workbench2.git] / src / store / processes / process-copy-actions.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { Dispatch } from 'redux';
6 import { dialogActions } from 'store/dialog/dialog-actions';
7 import { initialize, startSubmit } from 'redux-form';
8 import { resetPickerProjectTree } from 'store/project-tree-picker/project-tree-picker-actions';
9 import { RootState } from 'store/store';
10 import { ServiceRepository } from 'services/services';
11 import { CopyFormDialogData } from 'store/copy-dialog/copy-dialog';
12 import { Process, getProcess } from 'store/processes/process';
13 import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions';
14 import { initProjectsTreePicker } from 'store/tree-picker/tree-picker-actions';
15 import { ContainerRequestResource, ContainerRequestState } from 'models/container-request';
16
17 export const PROCESS_COPY_FORM_NAME = 'processCopyFormName';
18 export const MULTI_PROCESS_COPY_FORM_NAME = 'multiProcessCopyFormName';
19
20 export const openCopyProcessDialog = (resource: { name: string; uuid: string }) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
21     const process = getProcess(resource.uuid)(getState().resources);
22     if (process) {
23         dispatch<any>(resetPickerProjectTree());
24         dispatch<any>(initProjectsTreePicker(PROCESS_COPY_FORM_NAME));
25         const initialData: CopyFormDialogData = { name: `Copy of: ${resource.name}`, uuid: resource.uuid, ownerUuid: '' };
26         dispatch<any>(initialize(PROCESS_COPY_FORM_NAME, initialData));
27         dispatch(dialogActions.OPEN_DIALOG({ id: PROCESS_COPY_FORM_NAME, data: {} }));
28     } else {
29         dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Process not found', hideDuration: 2000, kind: SnackbarKind.ERROR }));
30     }
31 };
32
33 export const openCopyManyProcessesDialog = (list: Array<string>) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
34     //need to test with undefined process array
35     const testList = ['tordo-xvhdp-f8ps1vs3s3c2u3v', 'foo'];
36     const processes = list.map((uuid) => {
37         // const processes = testList.map((uuid) => {
38         const process = getProcess(uuid)(getState().resources);
39         if (!process) {
40             dispatch(snackbarActions.OPEN_SNACKBAR({ message: `Process ${uuid} not found`, hideDuration: 2000, kind: SnackbarKind.ERROR }));
41             return undefined;
42         } else return process;
43     });
44     console.log(processes);
45
46     let initialData: CopyFormDialogData;
47     if (processes.every((process) => !!process)) {
48         const { name, uuid } = (processes[0] as Process).containerRequest;
49         dispatch<any>(resetPickerProjectTree());
50         dispatch<any>(initProjectsTreePicker(MULTI_PROCESS_COPY_FORM_NAME));
51         initialData = { name: `Copy of: ${name}`, uuid: uuid, ownerUuid: '' };
52         dispatch<any>(initialize(MULTI_PROCESS_COPY_FORM_NAME, initialData));
53         dispatch(dialogActions.OPEN_DIALOG({ id: MULTI_PROCESS_COPY_FORM_NAME, data: {} }));
54     }
55 };
56
57 export const copyProcess = (resource: CopyFormDialogData) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
58     dispatch(startSubmit(PROCESS_COPY_FORM_NAME));
59     try {
60         const process = await services.containerRequestService.get(resource.uuid);
61         const {
62             command,
63             containerCountMax,
64             containerImage,
65             cwd,
66             description,
67             environment,
68             kind,
69             mounts,
70             outputName,
71             outputPath,
72             outputProperties,
73             outputStorageClasses,
74             outputTtl,
75             properties,
76             runtimeConstraints,
77             schedulingParameters,
78             useExisting,
79         } = process;
80         const newProcess = await services.containerRequestService.create({
81             command,
82             containerCountMax,
83             containerImage,
84             cwd,
85             description,
86             environment,
87             kind,
88             mounts,
89             name: resource.name,
90             outputName,
91             outputPath,
92             outputProperties,
93             outputStorageClasses,
94             outputTtl,
95             ownerUuid: resource.ownerUuid,
96             priority: 500,
97             properties,
98             runtimeConstraints,
99             schedulingParameters,
100             state: ContainerRequestState.UNCOMMITTED,
101             useExisting,
102         });
103         dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_COPY_FORM_NAME }));
104         return newProcess;
105     } catch (e) {
106         dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_COPY_FORM_NAME }));
107         throw new Error('Could not copy the process.');
108     }
109 };