update(vm): use token ENV and skip dup
This commit is contained in:
@@ -2,9 +2,12 @@ from fastapi import APIRouter, HTTPException
|
|||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from database import insert_virtual_machine, fetch_all
|
from database import insert_virtual_machine, fetch_all
|
||||||
import requests
|
import requests
|
||||||
|
import os
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
import logging
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class VirtualMachine(BaseModel):
|
class VirtualMachine(BaseModel):
|
||||||
name: str
|
name: str
|
||||||
@@ -14,15 +17,16 @@ class VirtualMachine(BaseModel):
|
|||||||
storage: str
|
storage: str
|
||||||
type: str
|
type: str
|
||||||
|
|
||||||
class HetznerToken(BaseModel):
|
|
||||||
api_token: str
|
|
||||||
|
|
||||||
@router.get("/vm/data")
|
@router.get("/vm/data")
|
||||||
def get_vm_data():
|
def get_vm_data():
|
||||||
return {"virtual_machines": fetch_all("virtual_machines")}
|
return {"virtual_machines": fetch_all("virtual_machines")}
|
||||||
|
|
||||||
@router.post("/vm/data")
|
@router.post("/vm/data")
|
||||||
def add_vm_data(vm: VirtualMachine):
|
def add_vm_data(vm: VirtualMachine):
|
||||||
|
existing_vms = fetch_all("virtual_machines")
|
||||||
|
if any(existing_vm[1] == vm.name for existing_vm in existing_vms):
|
||||||
|
return {"message": f"Virtual machine '{vm.name}' already exists."}
|
||||||
|
|
||||||
insert_virtual_machine(
|
insert_virtual_machine(
|
||||||
name=vm.name,
|
name=vm.name,
|
||||||
location=vm.location,
|
location=vm.location,
|
||||||
@@ -34,14 +38,18 @@ def add_vm_data(vm: VirtualMachine):
|
|||||||
return {"message": f"Virtual machine '{vm.name}' added successfully."}
|
return {"message": f"Virtual machine '{vm.name}' added successfully."}
|
||||||
|
|
||||||
@router.post("/vm/import-hetzner")
|
@router.post("/vm/import-hetzner")
|
||||||
def import_hetzner_vms(token: HetznerToken):
|
def import_hetzner_vms(api_token: str = None):
|
||||||
"""
|
"""
|
||||||
Import virtual machines from Hetzner Cloud.
|
Import virtual machines from Hetzner Cloud.
|
||||||
"""
|
"""
|
||||||
|
# Check for Hetzner token
|
||||||
|
api_token = api_token or os.getenv("HETZNER_TOKEN")
|
||||||
|
if not api_token:
|
||||||
|
logger.warning("HETZNER_TOKEN is not set. Unable to fetch Hetzner servers.")
|
||||||
|
return {"message": "HETZNER_TOKEN is not set. Please set it to fetch servers from Hetzner."}
|
||||||
|
|
||||||
hetzner_url = "https://api.hetzner.cloud/v1/servers"
|
hetzner_url = "https://api.hetzner.cloud/v1/servers"
|
||||||
headers = {
|
headers = {"Authorization": f"Bearer {api_token}"}
|
||||||
"Authorization": f"Bearer {token.api_token}"
|
|
||||||
}
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get(hetzner_url, headers=headers)
|
response = requests.get(hetzner_url, headers=headers)
|
||||||
@@ -53,17 +61,22 @@ def import_hetzner_vms(token: HetznerToken):
|
|||||||
if not servers:
|
if not servers:
|
||||||
return {"message": "No servers found on Hetzner Cloud."}
|
return {"message": "No servers found on Hetzner Cloud."}
|
||||||
|
|
||||||
|
# Fetch existing VMs from the database
|
||||||
|
existing_vms = {vm[1] for vm in fetch_all("virtual_machines")}
|
||||||
|
|
||||||
|
imported_count = 0
|
||||||
for server in servers:
|
for server in servers:
|
||||||
try:
|
try:
|
||||||
name = server["name"]
|
name = server["name"]
|
||||||
|
if name in existing_vms:
|
||||||
|
logger.info(f"Skipping existing virtual machine: {name}")
|
||||||
|
continue
|
||||||
|
|
||||||
location = server["datacenter"]["location"]["name"]
|
location = server["datacenter"]["location"]["name"]
|
||||||
cpu = server["server_type"]["cores"]
|
cpu = server["server_type"]["cores"]
|
||||||
memory = f"{server['server_type']['memory']} GB"
|
memory = f"{server['server_type']['memory']} GB"
|
||||||
storage = f"{server['server_type']['disk']} GB"
|
storage = f"{server['server_type']['disk']} GB"
|
||||||
vm_type = server["server_type"]["name"]
|
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(
|
insert_virtual_machine(
|
||||||
name=name,
|
name=name,
|
||||||
@@ -73,7 +86,8 @@ def import_hetzner_vms(token: HetznerToken):
|
|||||||
storage=storage,
|
storage=storage,
|
||||||
vm_type=vm_type
|
vm_type=vm_type
|
||||||
)
|
)
|
||||||
|
imported_count += 1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Failed to import server {server['name']}: {e}")
|
logger.error(f"Failed to import server {server['name']}: {e}")
|
||||||
|
|
||||||
return {"message": f"Imported {len(servers)} virtual machines from Hetzner."}
|
return {"message": f"Imported {imported_count} new virtual machines from Hetzner."}
|
||||||
|
|||||||
Reference in New Issue
Block a user