app.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. const select = document.getElementById('bootVM');
  9. select.innerHTML = '<option value="">Select VM</option>';
  10. data.vms.forEach(vm => {
  11. const row = document.createElement('tr');
  12. row.innerHTML = `
  13. <td>${vm.id}</td>
  14. <td>${vm.name}</td>
  15. <td>${vm.state}</td>
  16. <td>
  17. <button class="btn btn-sm btn-success" onclick="startVM('${vm.name}')">Lanzar</button>
  18. <button class="btn btn-sm btn-warning" onclick="stopVM('${vm.name}')">Stop</button>
  19. <button class="btn btn-sm btn-danger" onclick="deleteVM('${vm.name}')">Delete</button>
  20. ${vm.vnc_port ? `<button class="btn btn-sm btn-info" onclick="openVNC('${vm.name}')">Console</button>` : ''}
  21. </td>
  22. `;
  23. tbody.appendChild(row);
  24. select.innerHTML += `<option value="${vm.name}">${vm.name}</option>`;
  25. });
  26. } catch (error) {
  27. console.error('Error loading VMs:', error);
  28. alert('Error loading VMs');
  29. }
  30. }
  31. async function startVM(name) {
  32. try {
  33. await fetch(`${API_BASE}/vms/${name}/start`);
  34. loadVMs();
  35. } catch (error) {
  36. console.error('Error starting VM:', error);
  37. alert('Error starting VM');
  38. }
  39. }
  40. async function stopVM(name) {
  41. try {
  42. await fetch(`${API_BASE}/vms/${name}/stop`);
  43. loadVMs();
  44. } catch (error) {
  45. console.error('Error stopping VM:', error);
  46. alert('Error stopping VM');
  47. }
  48. }
  49. async function deleteVM(name) {
  50. if (confirm(`Delete VM ${name}?`)) {
  51. try {
  52. await fetch(`${API_BASE}/vms/${name}`, { method: 'DELETE' });
  53. loadVMs();
  54. } catch (error) {
  55. console.error('Error deleting VM:', error);
  56. alert('Error deleting VM');
  57. }
  58. }
  59. }
  60. function openVNC(vm_name) {
  61. fetch(`${API_BASE}/console/${vm_name}`)
  62. .then(response => response.json())
  63. .then(data => {
  64. if (data.url) {
  65. window.open(data.url);
  66. } else {
  67. alert(data.error || 'Error opening console');
  68. }
  69. })
  70. .catch(error => {
  71. console.error('Error:', error);
  72. alert('Error opening console');
  73. });
  74. }
  75. document.getElementById('createVMForm').addEventListener('submit', async (e) => {
  76. e.preventDefault();
  77. const name = document.getElementById('name').value;
  78. const memory = document.getElementById('memory').value;
  79. const disk_size = document.getElementById('disk_size').value;
  80. const iso = document.getElementById('iso').value;
  81. try {
  82. const response = await fetch(`${API_BASE}/vms?name=${name}&memory=${memory}&disk_size=${disk_size}&iso=${iso}`, {
  83. method: 'POST'
  84. });
  85. const result = await response.json();
  86. if (response.ok) {
  87. alert(result.message);
  88. loadVMs();
  89. document.getElementById('createVMForm').reset();
  90. } else {
  91. alert(result.error);
  92. }
  93. } catch (error) {
  94. console.error('Error creating VM:', error);
  95. alert('Error creating VM');
  96. }
  97. });
  98. document.getElementById('setBootOrderForm').addEventListener('submit', async (e) => {
  99. e.preventDefault();
  100. const vm_name = document.getElementById('bootVM').value;
  101. const boot_order_str = document.getElementById('bootOrder').value;
  102. const order = boot_order_str.split(',').map(s => s.trim());
  103. try {
  104. const response = await fetch(`${API_BASE}/vms/${vm_name}/boot-order`, {
  105. method: 'PUT',
  106. headers: {
  107. 'Content-Type': 'application/json'
  108. },
  109. body: JSON.stringify({ order: order })
  110. });
  111. const result = await response.json();
  112. if (response.ok) {
  113. alert(result.message);
  114. loadVMs();
  115. document.getElementById('setBootOrderForm').reset();
  116. } else {
  117. alert(result.error);
  118. }
  119. } catch (error) {
  120. console.error('Error setting boot order:', error);
  121. alert('Error setting boot order');
  122. }
  123. });
  124. // Load VMs on page load
  125. loadVMs();