mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
import { DetailsTable } from '@@/DetailsTable';
 | 
						|
 | 
						|
import { DockerSnapshot } from '../snapshots/types';
 | 
						|
 | 
						|
export function GpuInfo({
 | 
						|
  gpus,
 | 
						|
  snapshot,
 | 
						|
}: {
 | 
						|
  gpus: Array<{ name: string }>;
 | 
						|
  snapshot?: DockerSnapshot;
 | 
						|
}) {
 | 
						|
  if (!snapshot) {
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
 | 
						|
  const gpuUseAll = snapshot.GpuUseAll;
 | 
						|
  const gpuUseList = snapshot.GpuUseList;
 | 
						|
  let gpuFreeStr = '';
 | 
						|
  if (gpuUseAll) {
 | 
						|
    gpuFreeStr = 'none';
 | 
						|
  } else {
 | 
						|
    gpuFreeStr = buildGpusStr(gpuUseList, gpus);
 | 
						|
  }
 | 
						|
 | 
						|
  return (
 | 
						|
    <DetailsTable.Row label={gpus.length <= 1 ? 'GPU' : 'GPUs'}>
 | 
						|
      {gpuFreeStr}
 | 
						|
    </DetailsTable.Row>
 | 
						|
  );
 | 
						|
 | 
						|
  function buildGpusStr(
 | 
						|
    gpuUseList: Array<string>,
 | 
						|
    gpus: Array<{ name: string }> = []
 | 
						|
  ) {
 | 
						|
    if (!gpus.length) {
 | 
						|
      return 'none';
 | 
						|
    }
 | 
						|
 | 
						|
    const gpuUseSet = new Set(gpuUseList);
 | 
						|
    const gpusAvailable: Record<string, number> = {};
 | 
						|
    for (let i = 0; i < gpus.length; i++) {
 | 
						|
      if (!gpuUseSet.has(gpus[i].name)) {
 | 
						|
        if (gpusAvailable[gpus[i].name]) {
 | 
						|
          gpusAvailable[gpus[i].name] += 1;
 | 
						|
        } else {
 | 
						|
          gpusAvailable[gpus[i].name] = 1;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    const gpusKeys = Object.keys(gpusAvailable);
 | 
						|
 | 
						|
    if (!gpusKeys.length) {
 | 
						|
      return 'none';
 | 
						|
    }
 | 
						|
 | 
						|
    return Object.keys(gpusAvailable)
 | 
						|
      .map((gpuAvailable) => `${gpusAvailable[gpuAvailable]} x ${gpuAvailable}`)
 | 
						|
      .join(' + ');
 | 
						|
  }
 | 
						|
}
 |