SOLUTION.md 4.8 KB

Solución de Problemas de Creación de VM - Resumen

Problema Original

El error "undefined" aparecía al intentar crear una VM, y el disco virtual se creaba pero no se agregaba a la configuración de la VM en libvirt.

Causas Identificadas

  1. Falta de permisos para crear discos: El usuario no tenía permisos para escribir en /var/lib/libvirt/images/
  2. Manejo de errores insuficiente: Los errores no se propagaban correctamente al frontend
  3. Falta de logging: No había suficiente información de debug para identificar el problema
  4. Ruta de script incorrecta: La ruta relativa del script helper no funcionaba correctamente

Soluciones Implementadas

1. Script Helper para Crear Discos

Archivo: create_disk.sh

  • Script que se ejecuta con sudo para manejar correctamente los permisos
  • Crea el disco QCOW2 con los permisos correctos para libvirt-qemu:kvm
  • Proporciona feedback claro sobre errores

2. Configuración de Sudoers

Archivo: /etc/sudoers.d/virtmanager

  • Permite ejecutar el script sin contraseña
  • Configuración única (no requiere re-ejecutar para cada usuario)

    creylopez ALL=(ALL) NOPASSWD: /home/creylopez/virtmanager/create_disk.sh
    

3. Backend Mejorado

Archivo: app/main.py - función create_vm()

Cambios:

  • Usa el script helper en lugar de qemu-img directo
  • Calcula la ruta del script de forma dinámica y robusta
  • Agrega logging extensivo con prefijo [CREATE_VM]
  • Verifica que el disco existe antes de crear la VM
  • Maneja errores específicos de libvirt
  • Limpia el disco si la definición de la VM falla
  • Timeout de 60 segundos para operaciones largas

4. Frontend Mejorado

Archivo: static/app.js

Cambios:

  • Validación de que se seleccione una ISO
  • Mejor manejo de errores JSON
  • Mensajes más descriptivos en lugar de "undefined"
  • Logging en consola para debugging

5. Documentación

Archivos nuevos:

  • RUNNING.md - Instrucciones para ejecutar el servidor y probar
  • TROUBLESHOOTING.md - Guía de resolución de problemas
  • README.md - Actualizado con configuración de permisos

Validación

Se realizó un test end-to-end que verifica:

  1. ✓ Creación de disco con permisos correctos
  2. ✓ Definición de VM en libvirt
  3. ✓ Verificación de existencia de la VM
  4. ✓ Limpieza correcta de recursos

Resultado: ✅ TEST EXITOSO

Instrucciones de Ejecución

Configuración (una sola vez)

cd /home/creylopez/virtmanager
chmod +x create_disk.sh
echo "creylopez ALL=(ALL) NOPASSWD: /home/creylopez/virtmanager/create_disk.sh" | sudo tee /etc/sudoers.d/virtmanager
sudo visudo -c -f /etc/sudoers.d/virtmanager

Ejecutar el servidor

cd /home/creylopez/virtmanager
source venv/bin/activate
sudo -E venv/bin/uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

Accede a http://localhost:8000

Flujo de Creación de VM

Usuario → Frontend (/vms)
         ↓
       Backend (create_vm)
         ↓
    [1] Crear disco (script helper + sudo)
         ↓
    [2] Verificar que disco existe
         ↓
    [3] Generar MAC aleatoria
         ↓
    [4] Generar XML de configuración
         ↓
    [5] Definir VM en libvirt (defineXML)
         ↓
    [6] Iniciar VM (create)
         ↓
    Respuesta al usuario

Logs Importantes

Cuando creas una VM, verás logs como:

[CREATE_VM] Starting VM creation: name=mivm, memory=2048, disk_size=20, cpus=2
[CREATE_VM] Using ISO path: /var/lib/libvirt/images/isos/ubuntu-22.04.iso
[CREATE_VM] Script path: /home/creylopez/virtmanager/create_disk.sh
[CREATE_VM] Disk creation return code: 0
[CREATE_VM] Disk created successfully: /var/lib/libvirt/images/mivm.qcow2
[CREATE_VM] Generated MAC: 52:54:00:ab:cd:ef
[CREATE_VM] XML template prepared for VM definition
[CREATE_VM] Defining VM with libvirt...
[CREATE_VM] VM defined successfully. Starting VM...
[CREATE_VM] VM started successfully!

Si hay un error, verás:

[CREATE_VM] ERROR: [descripción del error]

Archivos Modificados

  1. app/main.py - Función create_vm() mejorada con logging y mejor manejo de errores
  2. static/app.js - Frontend con mejor validación y manejo de errores
  3. README.md - Documentación actualizada
  4. create_disk.sh - Script helper para crear discos
  5. /etc/sudoers.d/virtmanager - Configuración de permisos

Archivos Nuevos

  1. RUNNING.md - Instrucciones de ejecución
  2. TROUBLESHOOTING.md - Guía de troubleshooting
  3. SOLUTION.md - Este archivo (documentación de la solución)

Próximos Pasos (Opcional)

  1. Agregar validación de espacio en disco antes de crear
  2. Agregar limite de tamaño máximo para VMs
  3. Agregar compresión opcional de discos
  4. Implementar progreso en tiempo real para creación de VMs
  5. Agregar soporte para múltiples rutas de almacenamiento