from fastapi import APIRouter, HTTPException from pydantic import BaseModel from database import insert_virtual_machine, fetch_all import requests from datetime import datetime, timezone router = APIRouter() class VirtualMachine(BaseModel): name: str location: str cpu: int memory: str storage: str type: str class HetznerToken(BaseModel): api_token: str @router.get("/vm/data") def get_vm_data(): return {"virtual_machines": fetch_all("virtual_machines")} @router.post("/vm/data") def add_vm_data(vm: VirtualMachine): insert_virtual_machine( name=vm.name, location=vm.location, cpu=vm.cpu, memory=vm.memory, storage=vm.storage, vm_type=vm.type ) return {"message": f"Virtual machine '{vm.name}' added successfully."} @router.post("/vm/import-hetzner") def import_hetzner_vms(token: HetznerToken): """ Import virtual machines from Hetzner Cloud. """ hetzner_url = "https://api.hetzner.cloud/v1/servers" headers = { "Authorization": f"Bearer {token.api_token}" } try: response = requests.get(hetzner_url, headers=headers) response.raise_for_status() except requests.RequestException as e: raise HTTPException(status_code=500, detail=f"Failed to fetch data from Hetzner API: {e}") servers = response.json().get("servers", []) if not servers: return {"message": "No servers found on Hetzner Cloud."} for server in servers: try: name = server["name"] location = server["datacenter"]["location"]["name"] cpu = server["server_type"]["cores"] memory = f"{server['server_type']['memory']} GB" storage = f"{server['server_type']['disk']} GB" vm_type = server["server_type"]["name"] created_at = datetime.fromisoformat(server["created"].rstrip("Z")).replace(tzinfo=timezone.utc) now = datetime.now(timezone.utc) time_on_duty = round((now - created_at).total_seconds() / 3600, 2) # Convert to hours insert_virtual_machine( name=name, location=location, cpu=cpu, memory=memory, storage=storage, vm_type=vm_type ) except Exception as e: print(f"Failed to import server {server['name']}: {e}") return {"message": f"Imported {len(servers)} virtual machines from Hetzner."}