Module demo_api.utils.api.vm
Functions
def attach_vm_to_user(base_url, token, vm_id, user_id)-
Expand source code
@retry_on_429() def attach_vm_to_user(base_url, token, vm_id, user_id): """Associe une VM à un utilisateur. Args: base_url (str): L'URL de base de l'API token (str): Token d'authentification vm_id (int): ID de la VM user_id (int): ID de l'utilisateur Returns: dict: Résultat de l'association Raises: VMUpdateError: Si l'association échoue """ logger.info("Association VM-utilisateur", vm_id=vm_id, user_id=user_id) payload = {"vm_id": vm_id, "user_id": user_id} headers = {"Authorization": f"Bearer {token}"} if token else {} try: resp = requests.post( f"{base_url}/Attach_VM_to_user", json=payload, headers=headers, timeout=5 ) resp.raise_for_status() logger.info( "VM associée avec succès à l'utilisateur", vm_id=vm_id, user_id=user_id, status_code=resp.status_code, ) try: return resp.json() except: return {"success": True, "vm_id": vm_id, "user_id": user_id} except requests.RequestException as e: logger.error( "Erreur lors de l'association VM-utilisateur", error=str(e), status_code=getattr(resp, "status_code", None), response_text=getattr(resp, "text", "")[:200] + "..." if len(getattr(resp, "text", "")) > 200 else getattr(resp, "text", ""), vm_id=vm_id, user_id=user_id, ) raise VMUpdateError( f"Impossible d'associer la VM {vm_id} à l'utilisateur {user_id}: {str(e)}", status_code=getattr(resp, "status_code", None), response_data={"error": str(e), "vm_id": vm_id, "user_id": user_id}, vm_id=vm_id, )Associe une VM à un utilisateur.
Args
base_url:str- L'URL de base de l'API
token:str- Token d'authentification
vm_id:int- ID de la VM
user_id:int- ID de l'utilisateur
Returns
dict- Résultat de l'association
Raises
VMUpdateError- Si l'association échoue
def create_vm(token,
base_url,
user_id,
name,
operating_system,
cpu_cores,
ram_gb,
disk_gb,
status='running')-
Expand source code
@retry_on_429() def create_vm( token, base_url, user_id, name, operating_system, cpu_cores, ram_gb, disk_gb, status="running", ): logger.info( "Création d'une nouvelle VM", name=name, user_id=user_id, operating_system=operating_system, cpu_cores=cpu_cores, ram_gb=ram_gb, disk_gb=disk_gb, status=status, ) payload = { "user_id": user_id, "name": name, "operating_system": operating_system, "cpu_cores": cpu_cores, "ram_gb": ram_gb, "disk_gb": disk_gb, "status": status, } headers = {"Authorization": f"Bearer {token}"} if token else {} logger.debug( "Payload de création VM", user_id=user_id, name=name, operating_system=operating_system, status=status, token_length=len(token) if token else 0, token_is_none=token is None, ) try: logger.debug(f"Envoi de la requête POST vers {base_url}/vm") logger.debug(f"Headers: {headers}") logger.debug(f"Payload: {payload}") resp = requests.post(f"{base_url}/vm", json=payload, timeout=5, headers=headers) logger.debug(f"Réponse reçue - Status: {resp.status_code}") logger.debug(f"Headers de réponse: {dict(resp.headers)}") logger.debug(f"Contenu de la réponse: {resp.text[:500]}...") resp.raise_for_status() # Vérifier que la réponse n'est pas vide if not resp.text or resp.text.strip() == "": logger.error( "Réponse API vide pour la création de VM", status_code=resp.status_code ) raise VMCreationError( f"Réponse API vide lors de la création de la VM '{name}' pour l'utilisateur {user_id}", status_code=resp.status_code, response_data={ "error": "empty_response", "user_id": user_id, "name": name, }, user_id=user_id, vm_name=name, ) try: vm_result = resp.json() logger.debug( f"Réponse JSON de l'API VM: {vm_result} (type: {type(vm_result)})" ) except Exception as json_error: logger.error( "Erreur lors du parsing JSON de la réponse VM", json_error=str(json_error), response_text=resp.text[:200], status_code=resp.status_code, user_id=user_id, name=name, ) raise VMCreationError( f"Erreur de parsing JSON lors de la création de la VM '{name}' pour l'utilisateur {user_id}: {str(json_error)}", status_code=resp.status_code, response_data={ "error": "json_parse_error", "user_id": user_id, "name": name, }, user_id=user_id, vm_name=name, ) # Vérifier que vm_result est valide if not vm_result or not isinstance(vm_result, dict): logger.error( "Réponse API invalide pour la création de VM", vm_result=vm_result, vm_result_type=type(vm_result), status_code=resp.status_code, response_text=resp.text[:200] if resp.text else "Pas de texte de réponse", user_id=user_id, name=name, ) raise VMCreationError( f"Réponse API invalide lors de la création de la VM '{name}' pour l'utilisateur {user_id}", status_code=resp.status_code, response_data={ "error": "invalid_response", "user_id": user_id, "name": name, }, user_id=user_id, vm_name=name, ) logger.info( "VM créée avec succès", vm_id=vm_result.get("id"), name=name, user_id=user_id, status_code=resp.status_code, ) return vm_result except requests.RequestException as e: logger.error( "Erreur lors de la création de la VM", error=str(e), status_code=getattr(resp, "status_code", None), user_id=user_id, name=name, ) raise VMCreationError( f"Impossible de créer la VM '{name}' pour l'utilisateur {user_id}: {str(e)}", status_code=getattr(resp, "status_code", None), response_data={"error": str(e), "user_id": user_id, "name": name}, user_id=user_id, vm_name=name, ) def delete_vm(base_url, token, vm_id)-
Expand source code
@retry_on_429() def delete_vm(base_url, token, vm_id): """Supprime une VM. Args: base_url (str): L'URL de base de l'API token (str): Token d'authentification vm_id (int): ID de la VM Returns: dict: Résultat de la suppression Raises: VMDeleteError: Si la suppression de la VM échoue """ logger.info("Suppression d'une VM", vm_id=vm_id) headers = {"Authorization": f"Bearer {token}"} if token else {} try: resp = requests.delete(f"{base_url}/vm/{vm_id}", headers=headers, timeout=5) resp.raise_for_status() logger.info( "VM supprimée avec succès", vm_id=vm_id, status_code=resp.status_code, ) # Retourner le résultat si disponible, sinon un dict vide try: return resp.json() except: return {"success": True, "vm_id": vm_id} except requests.RequestException as e: logger.error( "Erreur lors de la suppression de la VM", error=str(e), status_code=getattr(resp, "status_code", None), response_text=getattr(resp, "text", "")[:200] + "..." if len(getattr(resp, "text", "")) > 200 else getattr(resp, "text", ""), vm_id=vm_id, ) raise VMDeleteError( f"Impossible de supprimer la VM {vm_id}: {str(e)}", status_code=getattr(resp, "status_code", None), response_data={"error": str(e), "vm_id": vm_id}, vm_id=vm_id, )Supprime une VM.
Args
base_url:str- L'URL de base de l'API
token:str- Token d'authentification
vm_id:int- ID de la VM
Returns
dict- Résultat de la suppression
Raises
VMDeleteError- Si la suppression de la VM échoue
def get_vm(base_url, vm_id)-
Expand source code
@retry_on_429() def get_vm(base_url, vm_id): """Récupère une VM spécifique par son ID. Args: base_url (str): L'URL de base de l'API vm_id (int): ID de la VM Returns: dict: Données de la VM Raises: VMsFetchError: Si la récupération de la VM échoue """ logger.info("Récupération d'une VM spécifique", vm_id=vm_id) try: resp = requests.get(f"{base_url}/vm/{vm_id}", timeout=5) resp.raise_for_status() vm_data = resp.json() vm_data["created_at"] = parse_unix_timestamp(vm_data["created_at"]) logger.info( "VM récupérée avec succès", vm_id=vm_id, name=vm_data.get("name"), status_code=resp.status_code, ) return vm_data except requests.RequestException as e: logger.error( "Erreur lors de la récupération de la VM", error=str(e), status_code=getattr(resp, "status_code", None), response_text=getattr(resp, "text", "")[:200] + "..." if len(getattr(resp, "text", "")) > 200 else getattr(resp, "text", ""), vm_id=vm_id, ) raise VMsFetchError( f"Impossible de récupérer la VM {vm_id}: {str(e)}", status_code=getattr(resp, "status_code", None), response_data={"error": str(e)}, base_url=base_url, )Récupère une VM spécifique par son ID.
Args
base_url:str- L'URL de base de l'API
vm_id:int- ID de la VM
Returns
dict- Données de la VM
Raises
VMsFetchError- Si la récupération de la VM échoue
def get_vms(base_url)-
Expand source code
@retry_on_429() def get_vms(base_url): logger.info("Récupération des VMs depuis l'API", base_url=base_url) try: resp = requests.get(f"{base_url}/vm", timeout=5) resp.raise_for_status() vms = [] for vm in resp.json(): vm["created_at"] = parse_unix_timestamp(vm["created_at"]) vms.append(vm) logger.info( "VMs récupérées avec succès", count=len(vms), status_code=resp.status_code ) logger.debug( "Détails des VMs récupérées", vm_ids=[vm.get("id") for vm in vms[:5]] ) return vms except requests.RequestException as e: logger.error( "Erreur lors de la récupération des VMs", error=str(e), status_code=getattr(resp, "status_code", None), response_text=getattr(resp, "text", "")[:200] + "..." if len(getattr(resp, "text", "")) > 200 else getattr(resp, "text", ""), base_url=base_url, ) raise VMsFetchError( f"Impossible de récupérer les VMs depuis {base_url}: {str(e)}", status_code=getattr(resp, "status_code", None), response_data={"error": str(e)}, base_url=base_url, ) def stop_vm(base_url, token, vm_id)-
Expand source code
@retry_on_429() def stop_vm(base_url, token, vm_id): """Arrête une VM. Args: base_url (str): L'URL de base de l'API token (str): Token d'authentification vm_id (int): ID de la VM Returns: dict: Résultat de l'arrêt Raises: VMUpdateError: Si l'arrêt de la VM échoue """ logger.info("Arrêt d'une VM", vm_id=vm_id) payload = {"vm_id": vm_id} headers = {"Authorization": f"Bearer {token}"} if token else {} try: resp = requests.post( f"{base_url}/Stop_VM", json=payload, headers=headers, timeout=5 ) resp.raise_for_status() logger.info( "VM arrêtée avec succès", vm_id=vm_id, status_code=resp.status_code, ) try: return resp.json() except: return {"success": True, "vm_id": vm_id, "action": "stopped"} except requests.RequestException as e: logger.error( "Erreur lors de l'arrêt de la VM", error=str(e), status_code=getattr(resp, "status_code", None), response_text=getattr(resp, "text", "")[:200] + "..." if len(getattr(resp, "text", "")) > 200 else getattr(resp, "text", ""), vm_id=vm_id, ) raise VMUpdateError( f"Impossible d'arrêter la VM {vm_id}: {str(e)}", status_code=getattr(resp, "status_code", None), response_data={"error": str(e), "vm_id": vm_id}, vm_id=vm_id, )Arrête une VM.
Args
base_url:str- L'URL de base de l'API
token:str- Token d'authentification
vm_id:int- ID de la VM
Returns
dict- Résultat de l'arrêt
Raises
VMUpdateError- Si l'arrêt de la VM échoue
def update_vm(base_url, token, vm_id, updates)-
Expand source code
@retry_on_429() def update_vm(base_url, token, vm_id, updates): """Met à jour une VM existante. Args: base_url (str): L'URL de base de l'API token (str): Token d'authentification vm_id (int): ID de la VM updates (dict): Données à mettre à jour Returns: dict: Données de la VM mise à jour Raises: VMUpdateError: Si la mise à jour de la VM échoue """ logger.info("Mise à jour d'une VM", vm_id=vm_id, updates_keys=list(updates.keys())) headers = {"Authorization": f"Bearer {token}"} if token else {} try: resp = requests.patch( f"{base_url}/vm/{vm_id}", json=updates, headers=headers, timeout=5 ) resp.raise_for_status() vm_data = resp.json() logger.info( "VM mise à jour avec succès", vm_id=vm_id, updates_count=len(updates), status_code=resp.status_code, ) return vm_data except requests.RequestException as e: logger.error( "Erreur lors de la mise à jour de la VM", error=str(e), status_code=getattr(resp, "status_code", None), response_text=getattr(resp, "text", "")[:200] + "..." if len(getattr(resp, "text", "")) > 200 else getattr(resp, "text", ""), vm_id=vm_id, ) raise VMUpdateError( f"Impossible de mettre à jour la VM {vm_id}: {str(e)}", status_code=getattr(resp, "status_code", None), response_data={"error": str(e), "vm_id": vm_id}, vm_id=vm_id, )Met à jour une VM existante.
Args
base_url:str- L'URL de base de l'API
token:str- Token d'authentification
vm_id:int- ID de la VM
updates:dict- Données à mettre à jour
Returns
dict- Données de la VM mise à jour
Raises
VMUpdateError- Si la mise à jour de la VM échoue