80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
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."}
|