X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/d4f479b1c2bd4bb67d5e69f792b503f375d6dfc9..0c37a7e69b11fb23a4ffa2902a1343b3cd6769bc:/src/store/advanced-tab/advanced-tab.tsx diff --git a/src/store/advanced-tab/advanced-tab.tsx b/src/store/advanced-tab/advanced-tab.tsx index b1f0f983..82b4dfb0 100644 --- a/src/store/advanced-tab/advanced-tab.tsx +++ b/src/store/advanced-tab/advanced-tab.tsx @@ -3,32 +3,33 @@ // SPDX-License-Identifier: AGPL-3.0 import { Dispatch } from 'redux'; -import { dialogActions } from '~/store/dialog/dialog-actions'; -import { RootState } from '~/store/store'; -import { ResourceKind, extractUuidKind } from '~/models/resource'; -import { getResource } from '~/store/resources/resources'; -import { GroupContentsResourcePrefix } from '~/services/groups-service/groups-service'; -import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions'; -import { ContainerRequestResource } from '~/models/container-request'; -import { CollectionResource } from '~/models/collection'; -import { ProjectResource } from '~/models/project'; -import { ServiceRepository } from '~/services/services'; -import { FilterBuilder } from '~/services/api/filter-builder'; -import { ListResults } from '~/services/common-service/common-service'; -import { RepositoryResource } from '~/models/repositories'; -import { SshKeyResource } from '~/models/ssh-key'; -import { VirtualMachinesResource } from '~/models/virtual-machines'; -import { UserResource } from '~/models/user'; -import { LinkResource } from '~/models/link'; -import { KeepServiceResource } from '~/models/keep-services'; -import { NodeResource } from '~/models/node'; -import { ApiClientAuthorization } from '~/models/api-client-authorization'; -import * as React from 'react'; +import { dialogActions } from 'store/dialog/dialog-actions'; +import { RootState } from 'store/store'; +import { ResourceKind, extractUuidKind } from 'models/resource'; +import { getResource } from 'store/resources/resources'; +import { GroupContentsResourcePrefix } from 'services/groups-service/groups-service'; +import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions'; +import { ContainerRequestResource } from 'models/container-request'; +import { CollectionResource } from 'models/collection'; +import { ProjectResource } from 'models/project'; +import { ServiceRepository } from 'services/services'; +import { FilterBuilder } from 'services/api/filter-builder'; +import { ListResults } from 'services/common-service/common-service'; +import { RepositoryResource } from 'models/repositories'; +import { SshKeyResource } from 'models/ssh-key'; +import { VirtualMachinesResource } from 'models/virtual-machines'; +import { UserResource } from 'models/user'; +import { LinkResource } from 'models/link'; +import { WorkflowResource } from 'models/workflow'; +import { KeepServiceResource } from 'models/keep-services'; +import { ApiClientAuthorization } from 'models/api-client-authorization'; +import React from 'react'; export const ADVANCED_TAB_DIALOG = 'advancedTabDialog'; -interface AdvancedTabDialogData { - apiResponse: any; +export interface AdvancedTabDialogData { + uuid: string; + apiResponse: JSX.Element; metadata: ListResults | string; user: UserResource | string; pythonHeader: string; @@ -76,7 +77,6 @@ enum ResourcePrefix { AUTORIZED_KEYS = 'authorized_keys', VIRTUAL_MACHINES = 'virtual_machines', KEEP_SERVICES = 'keep_services', - COMPUTE_NODES = 'nodes', USERS = 'users', API_CLIENT_AUTHORIZATIONS = 'api_client_authorizations', LINKS = 'links' @@ -92,11 +92,6 @@ enum UserData { USERNAME = 'username' } -enum ComputeNodeData { - COMPUTE_NODE = 'node', - PROPERTIES = 'properties' -} - enum ApiClientAuthorizationsData { API_CLIENT_AUTHORIZATION = 'api_client_authorization', DEFAULT_OWNER_UUID = 'default_owner_uuid' @@ -107,9 +102,14 @@ enum LinkData { PROPERTIES = 'properties' } -type AdvanceResourceKind = CollectionData | ProcessData | ProjectData | RepositoryData | SshKeyData | VirtualMachineData | KeepServiceData | ComputeNodeData | ApiClientAuthorizationsData | UserData | LinkData; +enum WorkflowData { + WORKFLOW = 'workflow', + CREATED_AT = 'created_at' +} + +type AdvanceResourceKind = CollectionData | ProcessData | ProjectData | RepositoryData | SshKeyData | VirtualMachineData | KeepServiceData | ApiClientAuthorizationsData | UserData | LinkData | WorkflowData; type AdvanceResourcePrefix = GroupContentsResourcePrefix | ResourcePrefix; -type AdvanceResponseData = ContainerRequestResource | ProjectResource | CollectionResource | RepositoryResource | SshKeyResource | VirtualMachinesResource | KeepServiceResource | NodeResource | ApiClientAuthorization | UserResource | LinkResource | undefined; +type AdvanceResponseData = ContainerRequestResource | ProjectResource | CollectionResource | RepositoryResource | SshKeyResource | VirtualMachinesResource | KeepServiceResource | ApiClientAuthorization | UserResource | LinkResource | WorkflowResource | undefined; export const openAdvancedTabDialog = (uuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { @@ -225,7 +225,7 @@ export const openAdvancedTabDialog = (uuid: string) => const data = getResource(uuid)(resources); const metadata = await services.linkService.list({ filters: new FilterBuilder() - .addEqual('headUuid', uuid) + .addEqual('head_uuid', uuid) .getFilters() }); const advanceDataUser = advancedTabData({ @@ -241,22 +241,6 @@ export const openAdvancedTabDialog = (uuid: string) => }); dispatch(initAdvancedTabDialog(advanceDataUser)); break; - case ResourceKind.NODE: - const computeNodeResources = getState().resources; - const dataComputeNode = getResource(uuid)(computeNodeResources); - const advanceDataComputeNode = advancedTabData({ - uuid, - metadata: '', - user: '', - apiResponseKind: computeNodeApiResponse, - data: dataComputeNode, - resourceKind: ComputeNodeData.COMPUTE_NODE, - resourcePrefix: ResourcePrefix.COMPUTE_NODES, - resourceKindProperty: ComputeNodeData.PROPERTIES, - property: dataComputeNode ? dataComputeNode.properties : {} - }); - dispatch(initAdvancedTabDialog(advanceDataComputeNode)); - break; case ResourceKind.API_CLIENT_AUTHORIZATION: const apiClientAuthorizationResources = getState().resources; const dataApiClientAuthorization = getResource(uuid)(apiClientAuthorizationResources); @@ -289,6 +273,23 @@ export const openAdvancedTabDialog = (uuid: string) => }); dispatch(initAdvancedTabDialog(advanceDataLink)); break; + case ResourceKind.WORKFLOW: + const wfResources = getState().resources; + const dataWf = getResource(uuid)(wfResources); + const advanceDataWf = advancedTabData({ + uuid, + metadata: '', + user: '', + apiResponseKind: wfApiResponse, + data: dataWf, + resourceKind: WorkflowData.WORKFLOW, + resourcePrefix: GroupContentsResourcePrefix.WORKFLOW, + resourceKindProperty: WorkflowData.CREATED_AT, + property: dataWf!.createdAt + }); + dispatch(initAdvancedTabDialog(advanceDataWf)); + break; + default: dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Could not open advanced tab for this resource.", hideDuration: 2000, kind: SnackbarKind.ERROR })); } @@ -300,11 +301,11 @@ const getDataForAdvancedTab = (uuid: string) => const data = getResource(uuid)(resources); const metadata = await services.linkService.list({ filters: new FilterBuilder() - .addEqual('headUuid', uuid) + .addEqual('head_uuid', uuid) .getFilters() }); - const user = metadata.itemsAvailable && await services.userService.get(metadata.items[0].tailUuid || ''); - return { data, metadata, user }; + + return { data, metadata }; }; const initAdvancedTabDialog = (data: AdvancedTabDialogData) => dialogActions.OPEN_DIALOG({ id: ADVANCED_TAB_DIALOG, data }); @@ -313,7 +314,7 @@ interface AdvancedTabData { uuid: string; metadata: ListResults | string; user: UserResource | string; - apiResponseKind: any; + apiResponseKind: (apiResponse) => JSX.Element; data: AdvanceResponseData; resourceKind: AdvanceResourceKind; resourcePrefix: AdvanceResourcePrefix; @@ -393,7 +394,7 @@ const stringify = (item: string | null | number | boolean) => const stringifyObject = (item: any) => JSON.stringify(item, null, 2) || 'null'; -const containerRequestApiResponse = (apiResponse: ContainerRequestResource) => { +const containerRequestApiResponse = (apiResponse: ContainerRequestResource): JSX.Element => { const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, name, description, properties, state, requestingContainerUuid, containerUuid, containerCountMax, mounts, runtimeConstraints, containerImage, environment, cwd, command, outputPath, priority, expiresAt, filters, containerCount, useExisting, schedulingParameters, outputUuid, logUuid, outputName, outputTtl } = apiResponse; @@ -413,7 +414,7 @@ const containerRequestApiResponse = (apiResponse: ContainerRequestResource) => { "container_count_max": ${stringify(containerCountMax)}, "mounts": ${stringifyObject(mounts)}, "runtime_constraints": ${stringifyObject(runtimeConstraints)}, -"container_image": "${stringify(containerImage)}", +"container_image": ${stringify(containerImage)}, "environment": ${stringifyObject(environment)}, "cwd": ${stringify(cwd)}, "command": ${stringifyObject(command)}, @@ -432,10 +433,10 @@ const containerRequestApiResponse = (apiResponse: ContainerRequestResource) => { return {'{'} {response} {'\n'} {'}'}; }; -const collectionApiResponse = (apiResponse: CollectionResource) => { +const collectionApiResponse = (apiResponse: CollectionResource): JSX.Element => { const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, name, description, properties, portableDataHash, replicationDesired, - replicationConfirmedAt, replicationConfirmed, manifestText, deleteAt, trashAt, isTrashed, storageClassesDesired, - storageClassesConfirmed, storageClassesConfirmedAt, currentVersionUuid, version, preserveVersion } = apiResponse; + replicationConfirmedAt, replicationConfirmed, deleteAt, trashAt, isTrashed, storageClassesDesired, + storageClassesConfirmed, storageClassesConfirmedAt, currentVersionUuid, version, preserveVersion, fileCount, fileSizeTotal } = apiResponse; const response = ` "uuid": "${uuid}", "owner_uuid": "${ownerUuid}", @@ -447,7 +448,6 @@ const collectionApiResponse = (apiResponse: CollectionResource) => { "replication_desired": ${stringify(replicationDesired)}, "replication_confirmed_at": ${stringify(replicationConfirmedAt)}, "replication_confirmed": ${stringify(replicationConfirmed)}, -"manifest_text": ${stringify(manifestText)}, "name": ${stringify(name)}, "description": ${stringify(description)}, "properties": ${stringifyObject(properties)}, @@ -457,15 +457,17 @@ const collectionApiResponse = (apiResponse: CollectionResource) => { "storage_classes_desired": ${JSON.stringify(storageClassesDesired, null, 2)}, "storage_classes_confirmed": ${JSON.stringify(storageClassesConfirmed, null, 2)}, "storage_classes_confirmed_at": ${stringify(storageClassesConfirmedAt)}, -"currentVersionUuid": ${stringify(currentVersionUuid)}, +"current_version_uuid": ${stringify(currentVersionUuid)}, "version": ${version}, -"preserveVersion": ${preserveVersion}`; +"preserve_version": ${preserveVersion}, +"file_count": ${fileCount}, +"file_size_total": ${fileSizeTotal}`; return {'{'} {response} {'\n'} {'}'}; }; -const groupRequestApiResponse = (apiResponse: ProjectResource) => { - const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, name, description, groupClass, trashAt, isTrashed, deleteAt, properties, writeableBy } = apiResponse; +const groupRequestApiResponse = (apiResponse: ProjectResource): JSX.Element => { + const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, name, description, groupClass, trashAt, isTrashed, deleteAt, properties, writableBy } = apiResponse; const response = ` "uuid": "${uuid}", "owner_uuid": "${ownerUuid}", @@ -480,12 +482,12 @@ const groupRequestApiResponse = (apiResponse: ProjectResource) => { "is_trashed": ${stringify(isTrashed)}, "delete_at": ${stringify(deleteAt)}, "properties": ${stringifyObject(properties)}, -"witable_by": ${stringifyObject(writeableBy)}`; +"writable_by": ${stringifyObject(writableBy)}`; return {'{'} {response} {'\n'} {'}'}; }; -const repositoryApiResponse = (apiResponse: RepositoryResource) => { +const repositoryApiResponse = (apiResponse: RepositoryResource): JSX.Element => { const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, name, cloneUrls } = apiResponse; const response = ` "uuid": "${uuid}", @@ -500,7 +502,7 @@ const repositoryApiResponse = (apiResponse: RepositoryResource) => { return {'{'} {response} {'\n'} {'}'}; }; -const sshKeyApiResponse = (apiResponse: SshKeyResource) => { +const sshKeyApiResponse = (apiResponse: SshKeyResource): JSX.Element => { const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, name, authorizedUserUuid, expiresAt } = apiResponse; const response = ` "uuid": "${uuid}", @@ -515,7 +517,7 @@ const sshKeyApiResponse = (apiResponse: SshKeyResource) => { return {'{'} {response} {'\n'} {'}'}; }; -const virtualMachineApiResponse = (apiResponse: VirtualMachinesResource) => { +const virtualMachineApiResponse = (apiResponse: VirtualMachinesResource): JSX.Element => { const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, hostname } = apiResponse; const response = ` "hostname": ${stringify(hostname)}, @@ -530,7 +532,7 @@ const virtualMachineApiResponse = (apiResponse: VirtualMachinesResource) => { return {'{'} {response} {'\n'} {'}'}; }; -const keepServiceApiResponse = (apiResponse: KeepServiceResource) => { +const keepServiceApiResponse = (apiResponse: KeepServiceResource): JSX.Element => { const { uuid, readOnly, serviceHost, servicePort, serviceSslFlag, serviceType, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid @@ -551,7 +553,7 @@ const keepServiceApiResponse = (apiResponse: KeepServiceResource) => { return {'{'} {response} {'\n'} {'}'}; }; -const userApiResponse = (apiResponse: UserResource) => { +const userApiResponse = (apiResponse: UserResource): JSX.Element => { const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, email, firstName, lastName, username, isActive, isAdmin, prefs, defaultOwnerUuid, @@ -576,33 +578,7 @@ const userApiResponse = (apiResponse: UserResource) => { return {'{'} {response} {'\n'} {'}'}; }; -const computeNodeApiResponse = (apiResponse: NodeResource) => { - const { - uuid, slotNumber, hostname, domain, ipAddress, firstPingAt, lastPingAt, jobUuid, - ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, - properties, info - } = apiResponse; - const response = ` -"uuid": "${uuid}", -"owner_uuid": "${ownerUuid}", -"modified_by_client_uuid": ${stringify(modifiedByClientUuid)}, -"modified_by_user_uuid": ${stringify(modifiedByUserUuid)}, -"modified_at": ${stringify(modifiedAt)}, -"created_at": "${createdAt}", -"slot_number": "${stringify(slotNumber)}", -"hostname": "${stringify(hostname)}", -"domain": "${stringify(domain)}", -"ip_address": "${stringify(ipAddress)}", -"first_ping_at": "${stringify(firstPingAt)}", -"last_ping_at": "${stringify(lastPingAt)}", -"job_uuid": "${stringify(jobUuid)}", -"properties": "${JSON.stringify(properties, null, 2)}", -"info": "${JSON.stringify(info, null, 2)}"`; - - return {'{'} {response} {'\n'} {'}'}; -}; - -const apiClientAuthorizationApiResponse = (apiResponse: ApiClientAuthorization) => { +const apiClientAuthorizationApiResponse = (apiResponse: ApiClientAuthorization): JSX.Element => { const { uuid, ownerUuid, apiToken, apiClientId, userId, createdByIpAddress, lastUsedByIpAddress, lastUsedAt, expiresAt, defaultOwnerUuid, scopes, updatedAt, createdAt @@ -625,7 +601,7 @@ const apiClientAuthorizationApiResponse = (apiResponse: ApiClientAuthorization) return {'{'} {response} {'\n'} {'}'}; }; -const linkApiResponse = (apiResponse: LinkResource) => { +const linkApiResponse = (apiResponse: LinkResource): JSX.Element => { const { uuid, name, headUuid, properties, headKind, tailUuid, tailKind, linkClass, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid @@ -647,3 +623,22 @@ const linkApiResponse = (apiResponse: LinkResource) => { return {'{'} {response} {'\n'} {'}'}; }; + + +const wfApiResponse = (apiResponse: WorkflowResource): JSX.Element => { + const { + uuid, name, + ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, description, definition + } = apiResponse; + const response = ` +"uuid": "${uuid}", +"name": "${name}", +"owner_uuid": "${ownerUuid}", +"created_at": "${stringify(createdAt)}", +"modified_at": ${stringify(modifiedAt)}, +"modified_by_client_uuid": ${stringify(modifiedByClientUuid)}, +"modified_by_user_uuid": ${stringify(modifiedByUserUuid)} +"description": ${stringify(description)}`; + + return {'{'} {response} {'\n'} {'}'}; +};