app.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. const API_BASE = window.location.origin;
  2. async function loadVMs() {
  3. try {
  4. const response = await fetch(`${API_BASE}/vms`);
  5. const data = await response.json();
  6. const tbody = document.getElementById('vmTableBody');
  7. tbody.innerHTML = '';
  8. data.vms.forEach(vm => {
  9. const row = document.createElement('tr');
  10. row.innerHTML = `
  11. <td>${vm.id}</td>
  12. <td>${vm.name}</td>
  13. <td>${vm.state}</td>
  14. <td>
  15. <button class="btn btn-sm btn-success" onclick="startVM(${vm.id})">Lanzar</button>
  16. <button class="btn btn-sm btn-warning" onclick="stopVM(${vm.id})">Stop</button>
  17. <button class="btn btn-sm btn-danger" onclick="deleteVM('${vm.name}')">Delete</button>
  18. ${vm.vnc_port ? `<button class="btn btn-sm btn-info" onclick="openVNC('${vm.name}')">Console</button>` : ''}
  19. </td>
  20. `;
  21. tbody.appendChild(row);
  22. });
  23. } catch (error) {
  24. console.error('Error loading VMs:', error);
  25. alert('Error loading VMs');
  26. }
  27. }
  28. async function startVM(id) {
  29. try {
  30. await fetch(`${API_BASE}/vms/${id}/start`);
  31. loadVMs();
  32. } catch (error) {
  33. console.error('Error starting VM:', error);
  34. alert('Error starting VM');
  35. }
  36. }
  37. async function stopVM(id) {
  38. try {
  39. await fetch(`${API_BASE}/vms/${id}/stop`);
  40. loadVMs();
  41. } catch (error) {
  42. console.error('Error stopping VM:', error);
  43. alert('Error stopping VM');
  44. }
  45. }
  46. async function deleteVM(name) {
  47. if (confirm(`Delete VM ${name}?`)) {
  48. try {
  49. await fetch(`${API_BASE}/vms/${name}`, { method: 'DELETE' });
  50. loadVMs();
  51. } catch (error) {
  52. console.error('Error deleting VM:', error);
  53. alert('Error deleting VM');
  54. }
  55. }
  56. }
  57. function openVNC(vm_name) {
  58. fetch(`${API_BASE}/console/${vm_name}`)
  59. .then(response => response.json())
  60. .then(data => {
  61. if (data.url) {
  62. window.open(data.url);
  63. } else {
  64. alert(data.error || 'Error opening console');
  65. }
  66. })
  67. .catch(error => {
  68. console.error('Error:', error);
  69. alert('Error opening console');
  70. });
  71. }
  72. document.getElementById('createVMForm').addEventListener('submit', async (e) => {
  73. e.preventDefault();
  74. const name = document.getElementById('name').value;
  75. const memory = document.getElementById('memory').value;
  76. const disk_size = document.getElementById('disk_size').value;
  77. const iso = document.getElementById('iso').value;
  78. try {
  79. const response = await fetch(`${API_BASE}/vms?name=${name}&memory=${memory}&disk_size=${disk_size}&iso=${iso}`, {
  80. method: 'POST'
  81. });
  82. const result = await response.json();
  83. if (response.ok) {
  84. alert(result.message);
  85. loadVMs();
  86. document.getElementById('createVMForm').reset();
  87. } else {
  88. alert(result.error);
  89. }
  90. } catch (error) {
  91. console.error('Error creating VM:', error);
  92. alert('Error creating VM');
  93. }
  94. });
  95. // Load VMs on page load
  96. loadVMs();