const API_BASE = window.location.origin; let selectedVM = null; // Initialize dashboard document.addEventListener('DOMContentLoaded', () => { loadVMs(); loadISOsForSelect(); // Initialize sidebar state for mobile const sidebar = document.querySelector('.sidebar'); if (window.innerWidth <= 768) { sidebar.classList.add('hidden-mobile'); } // Create VM Form document.getElementById('createVMForm').addEventListener('submit', createVM); }); // Get badge class based on VM state function getStateClass(state) { switch (state) { case 'running': return 'badge-running'; case 'shut off': return 'badge-off'; case 'paused': return 'badge-paused'; case 'crashed': return 'badge-error'; default: return 'bg-light text-dark'; } } // Get icon for state function getStateIcon(state) { switch (state) { case 'running': return ''; case 'shut off': return ''; case 'paused': return ''; default: return ''; } } // Load VMs from API async function loadVMs() { try { const response = await fetch(`${API_BASE}/vms`); const data = await response.json(); const vmList = document.getElementById('vmList'); if (!data.vms || data.vms.length === 0) { vmList.innerHTML = '
No hay máquinas virtuales
'; return; } vmList.innerHTML = data.vms.map(vm => `Haz clic en una VM del panel lateral para ver sus detalles
Error: ${data.error}
`; return; } const snapshots = data.snapshots; if (!snapshots || snapshots.length === 0) { document.getElementById('snapshotsList').innerHTML = 'No hay snapshots disponibles
'; return; } let html = `| Nombre | Creado | Descripción | Estado | Acciones |
|---|---|---|---|---|
| ${snap.name} | ${created} | ${snap.description || '-'} | ${snap.state} |
Error: ${error.message}
`; } } // Delete snapshot with confirmation function deleteSnapshotConfirm(vmName, snapshotName) { if (confirm(`¿Estás seguro de que deseas eliminar el snapshot "${snapshotName}"?`)) { deleteSnapshot(vmName, snapshotName); } } // Delete snapshot async function deleteSnapshot(vmName, snapshotName) { try { const encodedSnapshotName = encodeURIComponent(snapshotName); const response = await fetch(`${API_BASE}/vms/${vmName}/snapshots/${encodedSnapshotName}`, { method: 'DELETE' }); const data = await response.json(); if (data.error) { alert(`Error: ${data.error}`); return; } alert(`✓ Snapshot "${snapshotName}" eliminado exitosamente`); // Recargar lista de snapshots loadSnapshotsList(vmName); } catch (error) { console.error('Error:', error); alert(`Error al eliminar snapshot: ${error.message}`); } } // Performance monitoring let statsInterval = null; // Initialize and update performance indicators async function initializePerformanceCharts(vmName) { // Clear any existing interval if (statsInterval) clearInterval(statsInterval); // Update immediately await updatePerformanceStats(vmName); // Update every 2 seconds statsInterval = setInterval(() => updatePerformanceStats(vmName), 2000); } // Update performance statistics async function updatePerformanceStats(vmName) { try { const response = await fetch(`${API_BASE}/vms/${vmName}/stats`); const data = await response.json(); if (data.error || data.state === 'error') { console.log('VM not running or stats not available'); return; } // Update CPU bar const cpuPercent = data.cpu_percent; const cpuBar = document.getElementById('cpuBar'); const cpuPercentEl = document.getElementById('cpuPercent'); if (cpuBar) { cpuBar.style.width = cpuPercent + '%'; cpuBar.setAttribute('aria-valuenow', cpuPercent); } if (cpuPercentEl) { cpuPercentEl.textContent = cpuPercent.toFixed(1) + '%'; } // Update Memory bar const memPercent = data.memory_percent; const memBar = document.getElementById('memBar'); const memPercentEl = document.getElementById('memPercent'); if (memBar) { memBar.style.width = memPercent + '%'; memBar.setAttribute('aria-valuenow', memPercent); } if (memPercentEl) { memPercentEl.textContent = memPercent.toFixed(1) + '%'; } } catch (error) { console.error('Error updating stats:', error); } } // Clean up performance monitoring when switching VMs function cleanupCharts() { if (statsInterval) { clearInterval(statsInterval); statsInterval = null; } }