api response init
[arvados-workbench2.git] / src / store / advanced-tab / advanced-tab.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { dialogActions } from '~/store/dialog/dialog-actions';
6 import { RootState } from '~/store/store';
7 import { Dispatch } from 'redux';
8 import { ResourceKind, extractUuidKind, Resource } from '~/models/resource';
9 import { getResource } from '~/store/resources/resources';
10 import { GroupContentsResourcePrefix } from '~/services/groups-service/groups-service';
11 import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
12 import { ContainerRequestResource } from '~/models/container-request';
13 import { CollectionResource } from '~/models/collection';
14
15 export const ADVANCED_TAB_DIALOG = 'advancedTabDialog';
16
17 export interface AdvancedTabDialogData {
18     apiResponse: any;
19     pythonHeader: string;
20     pythonExample: string;
21     cliGetHeader: string;
22     cliGetExample: string;
23     cliUpdateHeader: string;
24     cliUpdateExample: string;
25     curlHeader: string;
26     curlExample: string;
27 }
28
29 enum CollectionData {
30     COLLECTION = 'collection',
31     STORAGE_CLASSES_CONFIRMED = 'storage_classes_confirmed'
32 }
33
34 enum ProcessData {
35     CONTAINER_REQUEST = 'container_request',
36     OUTPUT_NAME = 'output_name'
37 }
38
39 enum ProjectData {
40     GROUP = 'group',
41     DELETE_AT = 'delete_at'
42 }
43
44 interface AdvancedData extends Resource {
45     storageClassesConfirmed: string[];
46     outputName: string;
47     deleteAt: string;
48 }
49
50 export const openAdvancedTabDialog = (uuid: string) =>
51     (dispatch: Dispatch<any>, getState: () => RootState) => {
52         const { resources } = getState();
53         const kind = extractUuidKind(uuid);
54         const data = getResource<any>(uuid)(resources);
55         if (data) {
56             console.log(data);
57             if (kind === ResourceKind.COLLECTION) {
58                 const dataCollection: AdvancedTabDialogData = {
59                     apiResponse: collectionApiResponse(data),
60                     pythonHeader: pythonHeader(CollectionData.COLLECTION),
61                     pythonExample: pythonExample(data.uuid, GroupContentsResourcePrefix.COLLECTION),
62                     cliGetHeader: cliGetHeader(CollectionData.COLLECTION),
63                     cliGetExample: cliGetExample(data.uuid, GroupContentsResourcePrefix.COLLECTION),
64                     cliUpdateHeader: cliUpdateHeader(CollectionData.COLLECTION, CollectionData.STORAGE_CLASSES_CONFIRMED),
65                     cliUpdateExample: cliUpdateExample(data.uuid, CollectionData.COLLECTION, data.storageClassesConfirmed, CollectionData.STORAGE_CLASSES_CONFIRMED),
66                     curlHeader: curlHeader(CollectionData.COLLECTION, CollectionData.STORAGE_CLASSES_CONFIRMED),
67                     curlExample: curlExample(data.uuid, GroupContentsResourcePrefix.COLLECTION, data.storageClassesConfirmed, CollectionData.COLLECTION, CollectionData.STORAGE_CLASSES_CONFIRMED)
68                 };
69                 dispatch(dialogActions.OPEN_DIALOG({ id: ADVANCED_TAB_DIALOG, data: dataCollection }));
70             } else if (kind === ResourceKind.PROCESS) {
71                 const dataProcess: AdvancedTabDialogData = {
72                     apiResponse: containerRequestApiResponse(data),
73                     pythonHeader: pythonHeader(ProcessData.CONTAINER_REQUEST),
74                     pythonExample: pythonExample(data.uuid, GroupContentsResourcePrefix.PROCESS),
75                     cliGetHeader: cliGetHeader(ProcessData.CONTAINER_REQUEST),
76                     cliGetExample: cliGetExample(data.uuid, GroupContentsResourcePrefix.PROCESS),
77                     cliUpdateHeader: cliUpdateHeader(ProcessData.CONTAINER_REQUEST, ProcessData.OUTPUT_NAME),
78                     cliUpdateExample: cliUpdateExample(data.uuid, ProcessData.CONTAINER_REQUEST, data.outputName, ProcessData.OUTPUT_NAME),
79                     curlHeader: curlHeader(ProcessData.CONTAINER_REQUEST, ProcessData.OUTPUT_NAME),
80                     curlExample: curlExample(data.uuid, GroupContentsResourcePrefix.PROCESS, data.outputName, ProcessData.CONTAINER_REQUEST, ProcessData.OUTPUT_NAME)
81                 };
82                 dispatch(dialogActions.OPEN_DIALOG({ id: ADVANCED_TAB_DIALOG, data: dataProcess }));
83             } else if (kind === ResourceKind.PROJECT) {
84                 const dataProject: AdvancedTabDialogData = {
85                     apiResponse: `'${data}'`,
86                     pythonHeader: pythonHeader(ProjectData.GROUP),
87                     pythonExample: pythonExample(data.uuid, GroupContentsResourcePrefix.PROJECT),
88                     cliGetHeader: cliGetHeader(ProjectData.GROUP),
89                     cliGetExample: cliGetExample(data.uuid, GroupContentsResourcePrefix.PROJECT),
90                     cliUpdateHeader: cliUpdateHeader(ProjectData.GROUP, ProjectData.DELETE_AT),
91                     cliUpdateExample: cliUpdateExample(data.uuid, ProjectData.GROUP, data.deleteAt, ProjectData.DELETE_AT),
92                     curlHeader: curlHeader(ProjectData.GROUP, ProjectData.DELETE_AT),
93                     curlExample: curlExample(data.uuid, GroupContentsResourcePrefix.PROJECT, data.deleteAt, ProjectData.GROUP, ProjectData.DELETE_AT)
94                 };
95                 dispatch(dialogActions.OPEN_DIALOG({ id: ADVANCED_TAB_DIALOG, data: dataProject }));
96             }
97         } else {
98             dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Could not open advanced tab for this resource.", hideDuration: 2000, kind: SnackbarKind.ERROR }));
99         }
100     };
101
102 const pythonHeader = (resourceKind: string) =>
103     `An example python command to get a ${resourceKind} using its uuid:`;
104
105 const pythonExample = (uuid: string, resourcePrefix: string) => {
106     const pythonExample = `import arvados
107
108  x = arvados.api().${resourcePrefix}().get(uuid='${uuid}').execute()`;
109
110     return pythonExample;
111 };
112
113 const cliGetHeader = (resourceKind: string) =>
114     `An example arv command to get a ${resourceKind} using its uuid:`;
115
116 const cliGetExample = (uuid: string, resourcePrefix: string) => {
117     const cliGetExample = `arv ${resourcePrefix} get \\
118  --uuid ${uuid}`;
119
120     return cliGetExample;
121 };
122
123 const cliUpdateHeader = (resourceKind: string, resourceName: string) =>
124     `An example arv command to update the "${resourceName}" attribute for the current ${resourceKind}:`;
125
126 const cliUpdateExample = (uuid: string, resourceKind: string, resource: string | string[], resourceName: string) => {
127     const CLIUpdateCollectionExample = `arv ${resourceKind} update \\ 
128  --uuid ${uuid} \\
129  --${resourceKind} '{"${resourceName}":${resource}}'`;
130
131     return CLIUpdateCollectionExample;
132 };
133
134 const curlHeader = (resourceKind: string, resource: string) =>
135     `An example curl command to update the "${resource}" attribute for the current ${resourceKind}:`;
136
137 const curlExample = (uuid: string, resourcePrefix: string, resource: string | string[], resourceKind: string, resourceName: string) => {
138     const curlExample = `curl -X PUT \\
139  -H "Authorization: OAuth2 $ARVADOS_API_TOKEN" \\
140  --data-urlencode ${resourceKind}@/dev/stdin \\
141  https://$ARVADOS_API_HOST/arvados/v1/${resourcePrefix}/${uuid} \\
142  <<EOF
143 {
144   "${resourceName}": ${resource}
145 }
146 EOF`;
147
148     return curlExample;
149 };
150
151 const containerRequestApiResponse = (apiResponse: ContainerRequestResource) => {
152     const response = `{
153     "uuid": "${apiResponse.uuid}",
154     "owner_uuid": "${apiResponse.ownerUuid}",
155     "created_at": "${apiResponse.createdAt}",
156     "modified_at": "${apiResponse.modifiedAt}",
157     "modified_by_client_uuid": "${apiResponse.modifiedByClientUuid}",
158     "modified_by_user_uuid": "${apiResponse.modifiedByUserUuid}",
159     "name": "${apiResponse.name}",
160     "description": "${apiResponse.description}",
161     "properties": "${apiResponse.properties}",
162     "state": "${apiResponse.state}",
163     "requesting_container_uuid": "${apiResponse.requestingContainerUuid}",
164     "container_uuid": "${apiResponse.containerUuid}",
165     "container_count_max": "${apiResponse.containerCountMax}",
166     "mounts": "${apiResponse.mounts}",
167     "runtime_constraints": "${apiResponse.runtimeConstraints}",
168     "container_image": "${apiResponse.containerImage}",
169     "environment": "${apiResponse.environment}",
170     "cwd": "${apiResponse.cwd}",
171     "command": "${apiResponse.command}",
172     "output_path": "${apiResponse.outputPath}",
173     "priority": "${apiResponse.priority}",
174     "expires_at": "${apiResponse.expiresAt}",
175     "filters": "${apiResponse.filters}"
176     "use_existing": "${apiResponse.useExisting}",
177     "output_uuid": "${apiResponse.outputUuid}",
178     "scheduling_parameters": "${apiResponse.schedulingParameters}",
179     "kind": "${apiResponse.kind}",
180     "log_uuid": "${apiResponse.logUuid}",
181     "output_name": "${apiResponse.outputName}",
182     "output_ttl": "${apiResponse.outputTtl}",
183 }`;
184
185     return response;
186 };
187
188 const collectionApiResponse = (apiResponse: CollectionResource) => {
189     const response = `{
190     "uuid": "${apiResponse.uuid}",
191     "owner_uuid": "${apiResponse.ownerUuid}",
192     "created_at": "${apiResponse.createdAt}",
193     "modified_at": "${apiResponse.modifiedAt}",
194     "modified_by_client_uuid": "${apiResponse.modifiedByClientUuid}",
195     "modified_by_user_uuid": "${apiResponse.modifiedByUserUuid}",
196     "portable_data_hash": "${apiResponse.portableDataHash}",
197     "replication_desired": "${apiResponse.replicationDesired}",
198     "replication_confirmed_at": "${apiResponse.replicationConfirmedAt}",
199     "replication_confirmed": "${apiResponse.replicationConfirmed}",
200
201     "manifest_text": "${apiResponse.manifestText}",
202     "name": "${apiResponse.name}",
203     "description": "${apiResponse.description}",
204     "properties": "${apiResponse.properties}",
205     "delete_at": "${apiResponse.deleteAt}",
206     
207     "trash_at": "${apiResponse.trashAt}",
208     "is_trashed": "${apiResponse.isTrashed}",
209     
210
211     
212 }`;
213
214     return response;
215 };
216
217 const groupRequestApiResponse = (apiResponse: ContainerRequestResource) => {
218     const response = `{
219     "uuid": "${apiResponse.uuid}",
220     "owner_uuid": "${apiResponse.ownerUuid}",
221     "created_at": "${apiResponse.createdAt}",
222     "modified_at": "${apiResponse.modifiedAt}",
223     "modified_by_client_uuid": "${apiResponse.modifiedByClientUuid}",
224     "modified_by_user_uuid": "${apiResponse.modifiedByUserUuid}",
225     "name": "${apiResponse.name}",
226     "description": "${apiResponse.description}",
227     "properties": "${apiResponse.properties}",
228     "state": "${apiResponse.state}",
229     "requesting_container_uuid": "${apiResponse.requestingContainerUuid}",
230     "container_uuid": "${apiResponse.containerUuid}",
231     "container_count_max": "${apiResponse.containerCountMax}",
232     "mounts": "${apiResponse.mounts}",
233     "runtime_constraints": "${apiResponse.runtimeConstraints}",
234     "container_image": "${apiResponse.containerImage}",
235     "environment": "${apiResponse.environment}",
236     "cwd": "${apiResponse.cwd}",
237     "command": "${apiResponse.command}",
238     "output_path": "${apiResponse.outputPath}",
239     "priority": "${apiResponse.priority}",
240     "expires_at": "${apiResponse.expiresAt}",
241     "filters": "${apiResponse.filters}"
242     "use_existing": "${apiResponse.useExisting}",
243     "output_uuid": "${apiResponse.outputUuid}",
244     "scheduling_parameters": "${apiResponse.schedulingParameters}",
245     "kind": "${apiResponse.kind}",
246     "log_uuid": "${apiResponse.logUuid}",
247     "output_name": "${apiResponse.outputName}",
248     "output_ttl": "${apiResponse.outputTtl}",
249 }`;
250
251     return response;
252 };