1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
18 } from '@material-ui/core';
19 import { ArvadosTheme } from 'common/custom-theme';
26 } from 'components/icon/icon';
27 import { MPVPanelProps } from 'components/multi-panel-view/multi-panel-view';
28 import { connect } from 'react-redux';
29 import { Process } from 'store/processes/process';
30 import { NodeInstanceType } from 'store/process-panel/process-panel';
31 import { DefaultView } from 'components/default-view/default-view';
32 import { DetailsAttribute } from "components/details-attribute/details-attribute";
33 import { formatFileSize } from "common/formatters";
34 import { InputCollectionMount } from 'store/processes/processes-actions';
35 import { MountKind, TemporaryDirectoryMount } from 'models/mount-types';
37 interface ProcessResourceCardDataProps {
39 nodeInfo: NodeInstanceType | null;
42 type CssRules = "card" | "header" | "title" | "avatar" | "iconHeader" | "content" | "sectionH3";
44 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
52 paddingTop: theme.spacing.unit * 0.5
55 paddingTop: theme.spacing.unit * 0.5
59 color: theme.customs.colors.greyL,
63 maxHeight: `calc(100% - ${theme.spacing.unit * 7.5}px)`,
68 color: theme.customs.colors.greyD,
69 fontSize: "0.8125rem",
70 textTransform: "uppercase",
74 type ProcessResourceCardProps = ProcessResourceCardDataProps & WithStyles<CssRules> & MPVPanelProps;
76 export const ProcessResourceCard = withStyles(styles)(connect()(
77 ({ classes, nodeInfo, doHidePanel, doMaximizePanel, doUnMaximizePanel, panelMaximized, panelName, process, }: ProcessResourceCardProps) => {
79 const loading = false;
82 if (process.container?.mounts) {
83 for (const mnt in process.container.mounts) {
84 const mp = process.container.mounts[mnt];
85 if (mp.kind === MountKind.TEMPORARY_DIRECTORY) {
86 diskRequest += mp.capacity;
91 return <Card className={classes.card} data-cy="process-resources-card">
93 className={classes.header}
95 content: classes.title,
96 avatar: classes.avatar,
98 avatar={<MemoryIcon className={classes.iconHeader} />}
100 <Typography noWrap variant='h6' color='inherit'>
106 {doUnMaximizePanel && panelMaximized &&
107 <Tooltip title={`Unmaximize ${panelName || 'panel'}`} disableFocusListener>
108 <IconButton onClick={doUnMaximizePanel}><UnMaximizeIcon /></IconButton>
110 {doMaximizePanel && !panelMaximized &&
111 <Tooltip title={`Maximize ${panelName || 'panel'}`} disableFocusListener>
112 <IconButton onClick={doMaximizePanel}><MaximizeIcon /></IconButton>
115 <Tooltip title={`Close ${panelName || 'panel'}`} disableFocusListener>
116 <IconButton disabled={panelMaximized} onClick={doHidePanel}><CloseIcon /></IconButton>
120 <CardContent className={classes.content}>
123 <h3 className={classes.sectionH3}>Requested Resources</h3>
126 <DetailsAttribute label="Cores" value={process.container?.runtimeConstraints.vcpus} />
129 <DetailsAttribute label="RAM" value={formatFileSize(process.container?.runtimeConstraints.ram)} />
132 <DetailsAttribute label="Disk" value={formatFileSize(diskRequest)} />
135 {process.container?.runtimeConstraints.keep_cache_ram &&
136 process.container?.runtimeConstraints.keep_cache_ram > 0 ?
138 <DetailsAttribute label="Keep cache (RAM)" value={formatFileSize(process.container?.runtimeConstraints.keep_cache_ram)} />
141 {process.container?.runtimeConstraints.keep_cache_disk &&
142 process.container?.runtimeConstraints.keep_cache_disk > 0 ?
144 <DetailsAttribute label="Keep cache (disk)" value={formatFileSize(process.container?.runtimeConstraints.keep_cache_disk)} />
147 {process.container?.runtimeConstraints.API ? <Grid item xs={12}>
148 <DetailsAttribute label="API access" value={process.container?.runtimeConstraints.API.toString()} />
151 {process.container?.runtimeConstraints.cuda &&
152 process.container?.runtimeConstraints.cuda.device_count > 0 ?
155 <DetailsAttribute label="CUDA devices" value={process.container?.runtimeConstraints.cuda.device_count} />
158 <DetailsAttribute label="CUDA driver version" value={process.container?.runtimeConstraints.cuda.driver_version} />
161 <DetailsAttribute label="CUDA hardware capability" value={process.container?.runtimeConstraints.cuda.hardware_capability} />
169 <h3 className={classes.sectionH3}>Assigned Instance Type</h3>
170 {nodeInfo === null ? <Grid item xs={8}>
171 No instance type recorded
176 <DetailsAttribute label="Cores" value={nodeInfo.VCPUs} />
180 <DetailsAttribute label="Provider type" value={nodeInfo.ProviderType} />
184 <DetailsAttribute label="RAM" value={formatFileSize(nodeInfo.RAM)} />
188 <DetailsAttribute label="Price" value={"$" + nodeInfo.Price.toString()} />
192 <DetailsAttribute label="Included scratch disk" value={formatFileSize(nodeInfo.IncludedScratch)} />
196 <DetailsAttribute label="Preemptible" value={nodeInfo.Preemptible.toString()} />
200 <DetailsAttribute label="Added scratch disk" value={formatFileSize(nodeInfo.AddedScratch)} />
203 {nodeInfo.CUDA.DeviceCount > 0 &&
206 <DetailsAttribute label="CUDA devices" value={formatFileSize(nodeInfo.CUDA.DeviceCount)} />
213 <DetailsAttribute label="CUDA driver version" value={formatFileSize(nodeInfo.CUDA.DriverVersion)} />
220 <DetailsAttribute label="CUDA hardware capability" value={formatFileSize(nodeInfo.CUDA.HardwareCapability)} />