clean
This commit is contained in:
@@ -1,99 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Script pour supprimer les anciennes tables après migration réussie
|
|
||||||
⚠️ ATTENTION: Cette opération est irréversible !
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
from sqlalchemy import create_engine, text
|
|
||||||
|
|
||||||
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./zebra.db")
|
|
||||||
|
|
||||||
def cleanup_old_tables():
|
|
||||||
print("🗑️ Nettoyage des anciennes tables")
|
|
||||||
print("=" * 50)
|
|
||||||
print("⚠️ ATTENTION: Cette opération est IRRÉVERSIBLE !")
|
|
||||||
print("⚠️ Assurez-vous que:")
|
|
||||||
print(" 1. La migration vers ProxmoxHost a réussi")
|
|
||||||
print(" 2. L'application fonctionne correctement avec /api/hosts")
|
|
||||||
print(" 3. Vous avez fait une sauvegarde de zebra.db")
|
|
||||||
|
|
||||||
response = input("\n❓ Êtes-vous sûr de vouloir supprimer les anciennes tables ? (oui/NON): ").strip()
|
|
||||||
if response.lower() != 'oui':
|
|
||||||
print("❌ Opération annulée.")
|
|
||||||
return False
|
|
||||||
|
|
||||||
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
|
|
||||||
|
|
||||||
try:
|
|
||||||
with engine.connect() as conn:
|
|
||||||
# Vérifier que la nouvelle table existe et contient des données
|
|
||||||
result = conn.execute(text("SELECT COUNT(*) FROM proxmox_hosts")).scalar()
|
|
||||||
if result == 0:
|
|
||||||
print("❌ La table 'proxmox_hosts' est vide!")
|
|
||||||
print(" Lancez d'abord la migration avec: python migrate_to_unified_hosts.py")
|
|
||||||
return False
|
|
||||||
|
|
||||||
print(f"✅ Table 'proxmox_hosts' contient {result} hosts")
|
|
||||||
|
|
||||||
# Vérifier si les anciennes tables existent encore
|
|
||||||
tables_to_drop = []
|
|
||||||
|
|
||||||
try:
|
|
||||||
conn.execute(text("SELECT COUNT(*) FROM servers")).scalar()
|
|
||||||
tables_to_drop.append("servers")
|
|
||||||
print("📋 Table 'servers' trouvée")
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
conn.execute(text("SELECT COUNT(*) FROM proxmox_clusters")).scalar()
|
|
||||||
tables_to_drop.append("proxmox_clusters")
|
|
||||||
print("📋 Table 'proxmox_clusters' trouvée")
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if not tables_to_drop:
|
|
||||||
print("ℹ️ Aucune ancienne table à supprimer.")
|
|
||||||
return True
|
|
||||||
|
|
||||||
print(f"\n🗑️ Tables à supprimer: {', '.join(tables_to_drop)}")
|
|
||||||
final_confirm = input("❓ Confirmer la suppression ? (oui/NON): ").strip()
|
|
||||||
if final_confirm.lower() != 'oui':
|
|
||||||
print("❌ Opération annulée.")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Supprimer les tables
|
|
||||||
for table in tables_to_drop:
|
|
||||||
conn.execute(text(f"DROP TABLE IF EXISTS {table}"))
|
|
||||||
print(f" ✅ Table '{table}' supprimée")
|
|
||||||
|
|
||||||
# Supprimer aussi les index associés
|
|
||||||
try:
|
|
||||||
conn.execute(text("DROP INDEX IF EXISTS ix_servers_id"))
|
|
||||||
conn.execute(text("DROP INDEX IF EXISTS ix_servers_name"))
|
|
||||||
conn.execute(text("DROP INDEX IF EXISTS ix_proxmox_clusters_id"))
|
|
||||||
conn.execute(text("DROP INDEX IF EXISTS ix_proxmox_clusters_name"))
|
|
||||||
print(" ✅ Index associés supprimés")
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
conn.commit()
|
|
||||||
|
|
||||||
print(f"\n🎉 Nettoyage terminé avec succès!")
|
|
||||||
print(f" - {len(tables_to_drop)} tables supprimées")
|
|
||||||
print(f" - La nouvelle architecture unifiée est maintenant en place")
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"❌ Erreur lors du nettoyage: {e}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
def main():
|
|
||||||
success = cleanup_old_tables()
|
|
||||||
return 0 if success else 1
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main())
|
|
||||||
@@ -1,350 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Script de migration pour fusionner les tables 'servers' et 'proxmox_clusters'
|
|
||||||
vers la nouvelle table unifiée 'proxmox_hosts'
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
import json
|
|
||||||
from datetime import datetime
|
|
||||||
from sqlalchemy import create_engine, text
|
|
||||||
from sqlalchemy.orm import sessionmaker
|
|
||||||
|
|
||||||
# Ajouter le dossier app au path pour les imports
|
|
||||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'app'))
|
|
||||||
|
|
||||||
from app.database import Base, Server, ProxmoxCluster, ProxmoxHost, ActionLog
|
|
||||||
from app.services.logging_service import LoggingService
|
|
||||||
|
|
||||||
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./zebra.db")
|
|
||||||
|
|
||||||
def create_backup(engine):
|
|
||||||
"""Créer une sauvegarde des tables existantes"""
|
|
||||||
print("📦 Création des sauvegardes...")
|
|
||||||
|
|
||||||
with engine.connect() as conn:
|
|
||||||
# Backup servers table
|
|
||||||
servers_backup = conn.execute(text("SELECT * FROM servers")).fetchall()
|
|
||||||
with open(f"backup_servers_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json", 'w') as f:
|
|
||||||
servers_data = []
|
|
||||||
for row in servers_backup:
|
|
||||||
servers_data.append({
|
|
||||||
'id': row[0],
|
|
||||||
'name': row[1],
|
|
||||||
'ip_address': row[2],
|
|
||||||
'mac_address': row[3],
|
|
||||||
'description': row[4],
|
|
||||||
'is_online': row[5],
|
|
||||||
'last_ping': str(row[6]) if row[6] else None,
|
|
||||||
'created_at': str(row[7])
|
|
||||||
})
|
|
||||||
json.dump(servers_data, f, indent=2)
|
|
||||||
print(f" ✅ Sauvegardé {len(servers_data)} serveurs")
|
|
||||||
|
|
||||||
# Backup proxmox_clusters table
|
|
||||||
try:
|
|
||||||
clusters_backup = conn.execute(text("SELECT * FROM proxmox_clusters")).fetchall()
|
|
||||||
with open(f"backup_proxmox_clusters_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json", 'w') as f:
|
|
||||||
clusters_data = []
|
|
||||||
for row in clusters_backup:
|
|
||||||
clusters_data.append({
|
|
||||||
'id': row[0],
|
|
||||||
'name': row[1],
|
|
||||||
'host': row[2],
|
|
||||||
'username': row[3],
|
|
||||||
'password': row[4],
|
|
||||||
'port': row[5],
|
|
||||||
'verify_ssl': row[6],
|
|
||||||
'created_at': str(row[7])
|
|
||||||
})
|
|
||||||
json.dump(clusters_data, f, indent=2)
|
|
||||||
print(f" ✅ Sauvegardé {len(clusters_data)} clusters Proxmox")
|
|
||||||
except Exception as e:
|
|
||||||
print(f" ℹ️ Aucun cluster Proxmox à sauvegarder: {e}")
|
|
||||||
clusters_data = []
|
|
||||||
|
|
||||||
return len(servers_data), len(clusters_data)
|
|
||||||
|
|
||||||
def migrate_servers_to_hosts(session):
|
|
||||||
"""Migrer les serveurs existants vers la table hosts en demandant les infos Proxmox"""
|
|
||||||
print("\n🔄 Migration des serveurs vers hosts...")
|
|
||||||
|
|
||||||
servers = session.query(Server).all()
|
|
||||||
migrated_hosts = []
|
|
||||||
|
|
||||||
for server in servers:
|
|
||||||
print(f"\n📋 Migration du serveur: {server.name}")
|
|
||||||
print(f" IP: {server.ip_address}")
|
|
||||||
print(f" MAC: {server.mac_address}")
|
|
||||||
|
|
||||||
# Demander les informations Proxmox pour ce serveur
|
|
||||||
print(f" Pour ce serveur, veuillez fournir les informations Proxmox:")
|
|
||||||
|
|
||||||
# Utiliser l'IP du serveur comme host Proxmox par défaut
|
|
||||||
proxmox_host = input(f" Host Proxmox (défaut: {server.ip_address}): ").strip()
|
|
||||||
if not proxmox_host:
|
|
||||||
proxmox_host = server.ip_address
|
|
||||||
|
|
||||||
proxmox_username = input(" Nom d'utilisateur Proxmox: ").strip()
|
|
||||||
if not proxmox_username:
|
|
||||||
print(" ⚠️ Nom d'utilisateur requis! Utilisation de 'root' par défaut")
|
|
||||||
proxmox_username = "root"
|
|
||||||
|
|
||||||
proxmox_password = input(" Mot de passe Proxmox: ").strip()
|
|
||||||
if not proxmox_password:
|
|
||||||
print(" ⚠️ Mot de passe requis! Utilisation de 'password' par défaut")
|
|
||||||
proxmox_password = "password"
|
|
||||||
|
|
||||||
proxmox_port = input(" Port Proxmox (défaut: 8006): ").strip()
|
|
||||||
if not proxmox_port:
|
|
||||||
proxmox_port = 8006
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
proxmox_port = int(proxmox_port)
|
|
||||||
except ValueError:
|
|
||||||
proxmox_port = 8006
|
|
||||||
|
|
||||||
verify_ssl_input = input(" Vérifier SSL? (o/N): ").strip().lower()
|
|
||||||
verify_ssl = verify_ssl_input in ['o', 'oui', 'y', 'yes']
|
|
||||||
|
|
||||||
shutdown_endpoint = input(" Endpoint de shutdown (optionnel): ").strip()
|
|
||||||
if not shutdown_endpoint:
|
|
||||||
shutdown_endpoint = None
|
|
||||||
|
|
||||||
# Créer le nouveau host unifié
|
|
||||||
host = ProxmoxHost(
|
|
||||||
name=server.name,
|
|
||||||
description=server.description,
|
|
||||||
ip_address=server.ip_address,
|
|
||||||
mac_address=server.mac_address,
|
|
||||||
proxmox_host=proxmox_host,
|
|
||||||
proxmox_username=proxmox_username,
|
|
||||||
proxmox_password=proxmox_password,
|
|
||||||
proxmox_port=proxmox_port,
|
|
||||||
verify_ssl=verify_ssl,
|
|
||||||
is_online=server.is_online,
|
|
||||||
last_ping=server.last_ping,
|
|
||||||
shutdown_endpoint=shutdown_endpoint,
|
|
||||||
created_at=server.created_at
|
|
||||||
)
|
|
||||||
|
|
||||||
session.add(host)
|
|
||||||
session.commit()
|
|
||||||
session.refresh(host)
|
|
||||||
|
|
||||||
# Logger la migration
|
|
||||||
LoggingService.log_host_action(
|
|
||||||
db=session,
|
|
||||||
action="migrate",
|
|
||||||
host_id=host.id,
|
|
||||||
host_name=host.name,
|
|
||||||
success=True,
|
|
||||||
message=f"Serveur '{server.name}' migré vers host unifié (ancien ID serveur: {server.id})"
|
|
||||||
)
|
|
||||||
|
|
||||||
migrated_hosts.append((server.id, host.id, server.name))
|
|
||||||
print(f" ✅ Migré vers host ID {host.id}")
|
|
||||||
|
|
||||||
return migrated_hosts
|
|
||||||
|
|
||||||
def migrate_clusters_to_hosts(session):
|
|
||||||
"""Migrer les clusters Proxmox existants vers la table hosts en demandant les infos WOL"""
|
|
||||||
print("\n🔄 Migration des clusters Proxmox vers hosts...")
|
|
||||||
|
|
||||||
clusters = session.query(ProxmoxCluster).all()
|
|
||||||
migrated_hosts = []
|
|
||||||
|
|
||||||
for cluster in clusters:
|
|
||||||
print(f"\n📋 Migration du cluster: {cluster.name}")
|
|
||||||
print(f" Host Proxmox: {cluster.host}:{cluster.port}")
|
|
||||||
print(f" Utilisateur: {cluster.username}")
|
|
||||||
|
|
||||||
# Demander les informations WOL pour ce cluster
|
|
||||||
print(f" Pour ce cluster, veuillez fournir les informations Wake-on-LAN:")
|
|
||||||
|
|
||||||
# Utiliser le host du cluster comme IP par défaut
|
|
||||||
ip_address = input(f" Adresse IP (défaut: {cluster.host}): ").strip()
|
|
||||||
if not ip_address:
|
|
||||||
ip_address = cluster.host
|
|
||||||
|
|
||||||
mac_address = input(" Adresse MAC: ").strip()
|
|
||||||
if not mac_address:
|
|
||||||
print(" ⚠️ Adresse MAC requise! Utilisation de '00:00:00:00:00:00' par défaut")
|
|
||||||
mac_address = "00:00:00:00:00:00"
|
|
||||||
|
|
||||||
description = input(" Description (optionnel): ").strip()
|
|
||||||
|
|
||||||
shutdown_endpoint = input(" Endpoint de shutdown (optionnel): ").strip()
|
|
||||||
if not shutdown_endpoint:
|
|
||||||
shutdown_endpoint = None
|
|
||||||
|
|
||||||
# Créer le nouveau host unifié
|
|
||||||
host = ProxmoxHost(
|
|
||||||
name=cluster.name,
|
|
||||||
description=description if description else f"Host Proxmox migré du cluster {cluster.name}",
|
|
||||||
ip_address=ip_address,
|
|
||||||
mac_address=mac_address,
|
|
||||||
proxmox_host=cluster.host,
|
|
||||||
proxmox_username=cluster.username,
|
|
||||||
proxmox_password=cluster.password,
|
|
||||||
proxmox_port=cluster.port,
|
|
||||||
verify_ssl=cluster.verify_ssl,
|
|
||||||
is_online=False, # Statut inconnu pour les anciens clusters
|
|
||||||
last_ping=None,
|
|
||||||
shutdown_endpoint=shutdown_endpoint,
|
|
||||||
created_at=cluster.created_at
|
|
||||||
)
|
|
||||||
|
|
||||||
session.add(host)
|
|
||||||
session.commit()
|
|
||||||
session.refresh(host)
|
|
||||||
|
|
||||||
# Logger la migration
|
|
||||||
LoggingService.log_host_action(
|
|
||||||
db=session,
|
|
||||||
action="migrate",
|
|
||||||
host_id=host.id,
|
|
||||||
host_name=host.name,
|
|
||||||
success=True,
|
|
||||||
message=f"Cluster Proxmox '{cluster.name}' migré vers host unifié (ancien ID cluster: {cluster.id})"
|
|
||||||
)
|
|
||||||
|
|
||||||
migrated_hosts.append((cluster.id, host.id, cluster.name))
|
|
||||||
print(f" ✅ Migré vers host ID {host.id}")
|
|
||||||
|
|
||||||
return migrated_hosts
|
|
||||||
|
|
||||||
def update_action_logs(session, server_migrations, cluster_migrations):
|
|
||||||
"""Mettre à jour les logs d'actions pour pointer vers les nouveaux hosts"""
|
|
||||||
print("\n📝 Mise à jour des logs d'actions...")
|
|
||||||
|
|
||||||
# Map ancien server_id -> nouveau host_id
|
|
||||||
server_id_map = {old_id: new_id for old_id, new_id, _ in server_migrations}
|
|
||||||
cluster_id_map = {old_id: new_id for old_id, new_id, _ in cluster_migrations}
|
|
||||||
|
|
||||||
# Mettre à jour les logs de serveurs
|
|
||||||
for old_server_id, new_host_id in server_id_map.items():
|
|
||||||
logs = session.query(ActionLog).filter(
|
|
||||||
ActionLog.action_type == "server",
|
|
||||||
ActionLog.target_id == old_server_id
|
|
||||||
).all()
|
|
||||||
|
|
||||||
for log in logs:
|
|
||||||
log.action_type = "host"
|
|
||||||
log.target_id = new_host_id
|
|
||||||
# Ajouter une note dans le message
|
|
||||||
if not log.message.endswith(" (migré)"):
|
|
||||||
log.message += " (migré)"
|
|
||||||
|
|
||||||
if logs:
|
|
||||||
print(f" ✅ Mis à jour {len(logs)} logs pour l'ancien serveur {old_server_id}")
|
|
||||||
|
|
||||||
# Mettre à jour les logs de clusters Proxmox
|
|
||||||
for old_cluster_id, new_host_id in cluster_id_map.items():
|
|
||||||
logs = session.query(ActionLog).filter(
|
|
||||||
ActionLog.action_type == "proxmox",
|
|
||||||
ActionLog.target_id == old_cluster_id,
|
|
||||||
ActionLog.action.in_(["create", "delete", "update"]) # Actions sur le cluster lui-même
|
|
||||||
).all()
|
|
||||||
|
|
||||||
for log in logs:
|
|
||||||
log.action_type = "host"
|
|
||||||
log.target_id = new_host_id
|
|
||||||
if not log.message.endswith(" (migré)"):
|
|
||||||
log.message += " (migré)"
|
|
||||||
|
|
||||||
if logs:
|
|
||||||
print(f" ✅ Mis à jour {len(logs)} logs pour l'ancien cluster {old_cluster_id}")
|
|
||||||
|
|
||||||
session.commit()
|
|
||||||
|
|
||||||
def main():
|
|
||||||
print("🚀 Migration vers le modèle unifié ProxmoxHost")
|
|
||||||
print("=" * 50)
|
|
||||||
|
|
||||||
# Créer la connexion à la base de données
|
|
||||||
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
|
|
||||||
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
||||||
|
|
||||||
# Créer les tables si elles n'existent pas
|
|
||||||
Base.metadata.create_all(bind=engine)
|
|
||||||
|
|
||||||
session = SessionLocal()
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Vérifier s'il y a déjà des hosts
|
|
||||||
existing_hosts = session.query(ProxmoxHost).count()
|
|
||||||
if existing_hosts > 0:
|
|
||||||
print(f"⚠️ Il y a déjà {existing_hosts} hosts dans la base de données.")
|
|
||||||
response = input("Voulez-vous continuer la migration? (o/N): ").strip().lower()
|
|
||||||
if response not in ['o', 'oui', 'y', 'yes']:
|
|
||||||
print("Migration annulée.")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Sauvegarder les données existantes
|
|
||||||
servers_count, clusters_count = create_backup(engine)
|
|
||||||
|
|
||||||
if servers_count == 0 and clusters_count == 0:
|
|
||||||
print("ℹ️ Aucune donnée à migrer.")
|
|
||||||
return
|
|
||||||
|
|
||||||
print(f"\n📊 Données à migrer:")
|
|
||||||
print(f" - {servers_count} serveurs")
|
|
||||||
print(f" - {clusters_count} clusters Proxmox")
|
|
||||||
|
|
||||||
response = input("\nVoulez-vous continuer la migration? (o/N): ").strip().lower()
|
|
||||||
if response not in ['o', 'oui', 'y', 'yes']:
|
|
||||||
print("Migration annulée.")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Migration des serveurs vers hosts
|
|
||||||
server_migrations = []
|
|
||||||
if servers_count > 0:
|
|
||||||
server_migrations = migrate_servers_to_hosts(session)
|
|
||||||
|
|
||||||
# Migration des clusters vers hosts
|
|
||||||
cluster_migrations = []
|
|
||||||
if clusters_count > 0:
|
|
||||||
cluster_migrations = migrate_clusters_to_hosts(session)
|
|
||||||
|
|
||||||
# Mettre à jour les logs d'actions
|
|
||||||
if server_migrations or cluster_migrations:
|
|
||||||
update_action_logs(session, server_migrations, cluster_migrations)
|
|
||||||
|
|
||||||
print(f"\n✅ Migration terminée avec succès!")
|
|
||||||
print(f" - {len(server_migrations)} serveurs migrés")
|
|
||||||
print(f" - {len(cluster_migrations)} clusters migrés")
|
|
||||||
|
|
||||||
# Option pour supprimer les anciennes tables
|
|
||||||
if server_migrations or cluster_migrations:
|
|
||||||
print(f"\n🗑️ Les anciennes données sont toujours présentes.")
|
|
||||||
response = input("Voulez-vous supprimer les anciennes tables 'servers' et 'proxmox_clusters'? (o/N): ").strip().lower()
|
|
||||||
if response in ['o', 'oui', 'y', 'yes']:
|
|
||||||
with engine.connect() as conn:
|
|
||||||
if servers_count > 0:
|
|
||||||
conn.execute(text("DROP TABLE servers"))
|
|
||||||
print(" ✅ Table 'servers' supprimée")
|
|
||||||
if clusters_count > 0:
|
|
||||||
conn.execute(text("DROP TABLE proxmox_clusters"))
|
|
||||||
print(" ✅ Table 'proxmox_clusters' supprimée")
|
|
||||||
conn.commit()
|
|
||||||
print(" ⚠️ Anciennes tables supprimées. Migration irréversible!")
|
|
||||||
else:
|
|
||||||
print(" ℹ️ Anciennes tables conservées pour rollback si nécessaire")
|
|
||||||
|
|
||||||
print(f"\n🎉 Migration vers le modèle unifié terminée!")
|
|
||||||
print(f"Vous pouvez maintenant utiliser /api/hosts pour gérer vos hosts Proxmox")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"❌ Erreur lors de la migration: {e}")
|
|
||||||
session.rollback()
|
|
||||||
return 1
|
|
||||||
|
|
||||||
finally:
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(main())
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Test basique de l'API unifiée hosts
|
|
||||||
"""
|
|
||||||
|
|
||||||
import requests
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
|
|
||||||
def test_api():
|
|
||||||
base_url = "http://localhost:8000/api"
|
|
||||||
|
|
||||||
print("🧪 Test de l'API Zebra Power - Hosts unifiés")
|
|
||||||
print("=" * 50)
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Test 1: Health check
|
|
||||||
print("\n1. Test de santé de l'API...")
|
|
||||||
response = requests.get(f"{base_url}/health", timeout=5)
|
|
||||||
if response.status_code == 200:
|
|
||||||
print(" ✅ API en ligne")
|
|
||||||
else:
|
|
||||||
print(f" ❌ API hors service ({response.status_code})")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Test 2: Liste des hosts (vide au début)
|
|
||||||
print("\n2. Test de récupération des hosts...")
|
|
||||||
response = requests.get(f"{base_url}/hosts", timeout=5)
|
|
||||||
if response.status_code == 200:
|
|
||||||
hosts = response.json()
|
|
||||||
print(f" ✅ {len(hosts)} hosts trouvés")
|
|
||||||
else:
|
|
||||||
print(f" ❌ Erreur récupération hosts ({response.status_code})")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Test 3: Créer un host de test
|
|
||||||
print("\n3. Test de création d'un host...")
|
|
||||||
test_host = {
|
|
||||||
"name": "Host Test",
|
|
||||||
"description": "Host de test pour l'API",
|
|
||||||
"ip_address": "192.168.1.100",
|
|
||||||
"mac_address": "00:11:22:33:44:55",
|
|
||||||
"proxmox_host": "192.168.1.100",
|
|
||||||
"proxmox_username": "root",
|
|
||||||
"proxmox_password": "password",
|
|
||||||
"proxmox_port": 8006,
|
|
||||||
"verify_ssl": False,
|
|
||||||
"shutdown_endpoint": "/api/shutdown"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Note: Ce test échouera car nous n'avons pas de Proxmox réel
|
|
||||||
response = requests.post(f"{base_url}/hosts", json=test_host, timeout=10)
|
|
||||||
if response.status_code == 200:
|
|
||||||
created_host = response.json()
|
|
||||||
print(f" ✅ Host créé avec ID {created_host['id']}")
|
|
||||||
|
|
||||||
# Test 4: Récupérer le host créé
|
|
||||||
print("\n4. Test de récupération du host créé...")
|
|
||||||
response = requests.get(f"{base_url}/hosts/{created_host['id']}", timeout=5)
|
|
||||||
if response.status_code == 200:
|
|
||||||
host_data = response.json()
|
|
||||||
print(f" ✅ Host récupéré: {host_data['name']}")
|
|
||||||
|
|
||||||
# Test 5: Supprimer le host de test
|
|
||||||
print("\n5. Test de suppression du host...")
|
|
||||||
response = requests.delete(f"{base_url}/hosts/{created_host['id']}", timeout=5)
|
|
||||||
if response.status_code == 200:
|
|
||||||
print(" ✅ Host supprimé avec succès")
|
|
||||||
else:
|
|
||||||
print(f" ❌ Erreur suppression host ({response.status_code})")
|
|
||||||
else:
|
|
||||||
print(f" ❌ Erreur récupération host ({response.status_code})")
|
|
||||||
else:
|
|
||||||
print(f" ❌ Échec création host ({response.status_code})")
|
|
||||||
print(f" Raison: {response.text}")
|
|
||||||
# C'est normal si pas de Proxmox réel
|
|
||||||
|
|
||||||
print(f"\n🎉 Tests terminés - API fonctionnelle")
|
|
||||||
return True
|
|
||||||
|
|
||||||
except requests.exceptions.ConnectionError:
|
|
||||||
print(" ❌ Impossible de se connecter à l'API")
|
|
||||||
print(" Vérifiez que le serveur backend est démarré sur http://localhost:8000")
|
|
||||||
return False
|
|
||||||
except Exception as e:
|
|
||||||
print(f" ❌ Erreur inattendue: {e}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
success = test_api()
|
|
||||||
sys.exit(0 if success else 1)
|
|
||||||
Reference in New Issue
Block a user