import React, { useState, useEffect } from 'react'; import { Grid, Paper, Typography, Box, Divider } from '@mui/material'; import StorageIcon from '@mui/icons-material/Storage'; import ComputerIcon from '@mui/icons-material/Computer'; import { config } from '../../config/env'; interface VM { name: string; power: number; } interface VMPlacementData { data_center: string; id: number; physical_machines: Array<{ name: string; power_consumption: number; vms: { active: VM[]; inactive: VM[]; }; }>; } const ENDPOINT = `${config.apiUrl}/prom/get_chart_data/vm_placement`; const REFRESH_INTERVAL = 30000; // 30 seconds const SummaryStats: React.FC = () => { const [data, setData] = useState(null); const fetchData = async () => { try { const response = await fetch(ENDPOINT); if (!response.ok) { throw new Error(`Failed to fetch data: ${response.status}`); } const jsonData = await response.json(); setData(jsonData); } catch (err) { console.error('Error fetching VM placement data:', err); } }; useEffect(() => { fetchData(); const interval = setInterval(fetchData, REFRESH_INTERVAL); return () => clearInterval(interval); }, []); const stats = React.useMemo(() => { if (!data?.physical_machines) { return { activeComputes: 0, totalComputes: 0, activeVMs: 0, inactiveVMs: 0, }; } const activeComputes = data.physical_machines.filter( pm => pm.power_consumption > 0 || pm.vms.active.length > 0 ).length; const totalActiveVMs = data.physical_machines.reduce( (sum, pm) => sum + pm.vms.active.length, 0 ); const totalInactiveVMs = data.physical_machines.reduce( (sum, pm) => sum + pm.vms.inactive.length, 0 ); return { activeComputes, totalComputes: data.physical_machines.length, activeVMs: totalActiveVMs, inactiveVMs: totalInactiveVMs, }; }, [data]); return ( Compute Nodes {stats.activeComputes}/{stats.totalComputes} Virtual Machines {stats.activeVMs} active / {stats.activeVMs + stats.inactiveVMs} total ); }; export default SummaryStats;