Skip to content

Commit 0a440a2

Browse files
authored
Merge pull request #6 from PoCInnovation/feat/api-integration
Feat/api integration
2 parents 50247d7 + ede01e8 commit 0a440a2

28 files changed

+607
-138
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@
99
/backend/venv
1010

1111
__pycache__/
12+
13+
.vscode/

backend/app/core/config.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from dotenv import load_dotenv
55
from os import getenv
66
from sqlmodel import create_engine, SQLModel
7+
from app.telemetry.monitor import SystemMonitor
78

89
load_dotenv()
910

@@ -12,7 +13,8 @@
1213
db_pass = getenv("POSTGRES_PASSWORD", "distribox_password")
1314
db_port = getenv("POSTGRES_PORT", "5432")
1415

15-
database_url = f"postgresql+psycopg2://{db_user}:{db_pass}@localhost:{db_port}/{db_name}"
16+
database_url = f"postgresql+psycopg2://{db_user}:{
17+
db_pass}@localhost:{db_port}/{db_name}"
1618
engine = create_engine(database_url, echo=True)
1719
SQLModel.metadata.create_all(engine)
1820

@@ -24,7 +26,11 @@ class QEMUConfig:
2426
def get_connection(cls):
2527
if cls.qemu_conn is None or cls.qemu_conn.isAlive() == 0:
2628
try:
27-
qemu_conn = libvirt.open("qemu:///system")
29+
cls.qemu_conn = libvirt.open("qemu:///system")
2830
except libvirt.libvirtError:
2931
raise
30-
return qemu_conn
32+
return cls.qemu_conn
33+
34+
35+
system_monitor = SystemMonitor(interval=3,
36+
get_connection=QEMUConfig.get_connection)

backend/app/core/xml_builder.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@ def build_xml(vm_read: VmRead):
4141
etree.SubElement(channel, "target", type="virtio",
4242
name="org.qemu.guest_agent.0")
4343

44-
# disk_seed = etree.SubElement(devices, "disk", type="file", device="cdrom")
45-
# etree.SubElement(disk_seed, "driver", name="qemu", type="raw")
46-
# etree.SubElement(disk_seed, "source", file="/var/lib/distribox/images/seed.iso")
47-
# etree.SubElement(disk_seed, "target", dev="hdb", bus="ide")
48-
# etree.SubElement(disk_seed, "readonly")
44+
disk_seed = etree.SubElement(devices, "disk", type="file", device="cdrom")
45+
etree.SubElement(disk_seed, "driver", name="qemu", type="raw")
46+
etree.SubElement(
47+
disk_seed,
48+
"source",
49+
file="/var/lib/distribox/images/seed.iso")
50+
etree.SubElement(disk_seed, "target", dev="hdb", bus="ide")
51+
etree.SubElement(disk_seed, "readonly")
4952

5053
iface = etree.SubElement(devices, "interface", type="network")
5154
etree.SubElement(iface, "source", network="default")

backend/app/main.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from fastapi.responses import JSONResponse
33
from fastapi.middleware.cors import CORSMiddleware
44
from sqlmodel import Session, select
5-
from app.routes import vm, auth
5+
from app.routes import vm, image, host, auth
66
from app.orm.user import UserORM
77
from app.utils.auth import hash_password
88
from app.core.config import engine
@@ -63,3 +63,5 @@ async def general_exception_handler(_, exc: Exception):
6363

6464
app.include_router(auth.router, prefix="/auth", tags=["auth"])
6565
app.include_router(vm.router, prefix="/vms", tags=["vms"])
66+
app.include_router(image.router, prefix="/images", tags=["images"])
67+
app.include_router(host.router, prefix="/host", tags=["host"])

backend/app/models/host.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from pydantic import BaseModel
2+
from app.models.resources import MemoryInfoBase, DiskInfoBase, CPUInfoBase
3+
4+
5+
class DiskInfoHost(DiskInfoBase):
6+
distribox_used: float
7+
8+
9+
class MemoryInfoHost(MemoryInfoBase):
10+
pass
11+
12+
13+
class CPUInfoHost(CPUInfoBase):
14+
pass
15+
16+
17+
class HostInfoBase(BaseModel):
18+
disk: DiskInfoHost
19+
mem: MemoryInfoHost
20+
cpu: CPUInfoHost

backend/app/models/image.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from pydantic import BaseModel
2+
3+
4+
class ImageBase(BaseModel):
5+
name: str
6+
virtual_size: float
7+
actual_size: float
8+
9+
10+
class ImageRead(ImageBase):
11+
pass

backend/app/models/resources.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from pydantic import BaseModel
2+
3+
4+
class ResourceStatsBase(BaseModel):
5+
total: float
6+
used: float
7+
available: float
8+
percent_used: float
9+
10+
11+
class DiskInfoBase(ResourceStatsBase):
12+
pass
13+
14+
15+
class MemoryInfoBase(ResourceStatsBase):
16+
pass
17+
18+
19+
class CPUInfoBase(BaseModel):
20+
percent_used_total: float
21+
percent_used_per_cpu: list[float]
22+
percent_used_per_vm: list
23+
percent_used_total_vms: float
24+
cpu_count: int

backend/app/models/vm.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from pydantic import BaseModel
2-
from typing import Optional
2+
from uuid import UUID
33

44

55
class VmBase(BaseModel):
@@ -10,9 +10,13 @@ class VmBase(BaseModel):
1010

1111

1212
class VmRead(VmBase):
13-
id: str
13+
id: UUID
1414
state: str
1515

1616

1717
class VmCreate(VmBase):
1818
pass
19+
20+
21+
class PasswordCreated(BaseModel):
22+
password: str

backend/app/routes/host.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from fastapi import APIRouter, status
2+
from app.services.host_service import HostService
3+
from app.models.host import HostInfoBase
4+
5+
6+
router = APIRouter()
7+
8+
9+
@router.get("/info", status_code=status.HTTP_200_OK,
10+
response_model=HostInfoBase)
11+
def get_host_info():
12+
return HostService.get_host_info()

backend/app/routes/image.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from fastapi import APIRouter, status
2+
from app.services.image_service import ImageService
3+
from app.models.image import ImageRead
4+
5+
6+
router = APIRouter()
7+
8+
9+
@router.get("/", status_code=status.HTTP_200_OK,
10+
response_model=list[ImageRead])
11+
def get_distribox_image_list():
12+
try:
13+
return ImageService.get_distribox_image_list()
14+
except Exception:
15+
raise

0 commit comments

Comments
 (0)