Make more configurable

This commit is contained in:
PapaTutuWawa 2025-03-30 01:59:23 +01:00
parent a210b47e36
commit 6ee5778878
5 changed files with 75 additions and 16 deletions

View File

@ -1,14 +1,36 @@
import uuid
from fastapi import Response
from fastapi.datastructures import QueryParams
from sqlmodel import select
from openec2.config import OpenEC2Config
from openec2.db import DatabaseDep
from openec2.db.image import AMI
from openec2.api.describe_images import DescribeImagesResponse, ImagesSet, Image
def describe_images(
params: QueryParams,
config: OpenEC2Config,
db: DatabaseDep,
):
amis = db.exec(select(AMI)).all()
return ", ".join(ami.id for ami in amis)
images: list[Image] = []
for ami in db.exec(select(AMI)).all():
images.append(
Image(
imageId=ami.id,
imageState="available",
name=ami.originalFilename,
),
)
return Response(
DescribeImagesResponse(
requestId=uuid.uuid4().hex,
imagesSet=ImagesSet(
items=images,
)
).to_xml(),
media_type="application/xml",
)

View File

@ -1,15 +1,13 @@
import shutil
import base64
from typing import cast
import uuid
import os
from fastapi import HTTPException
from fastapi.datastructures import QueryParams
from sqlmodel import select
from openec2.libvirt import LibvirtSingleton
from openec2.config import OpenEC2Config
from openec2.config import OpenEC2Config, ConfigSingleton
from openec2.utils.qemu import create_cow_copy
from openec2.db import DatabaseDep
from openec2.db.instance import Instance
@ -26,8 +24,18 @@ def create_libvirt_domain(
vcpu: int,
ami_path: str,
mac: str,
user_data: str | None,
) -> str:
extra_devices = ""
if ConfigSingleton.of().config.debug:
extra_devices += """
<video>
<model type='qxl' />
</video>
<graphics type="spice" port="-1" tlsPort="-1" autoport="yes">
<image compression="off"/>
</graphics>
"""
return f"""
<domain type='kvm'>
<name>{name}</name>
@ -58,18 +66,12 @@ def create_libvirt_domain(
<suspend-to-disk enabled='no'/>
</pm>
<devices>
{user_data or ''}
{extra_devices}
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='{ami_path}'/>
<target dev='vda' bus='virtio'/>
</disk>
<video>
<model type='qxl' />
</video>
<graphics type="spice" port="-1" tlsPort="-1" autoport="yes">
<image compression="off"/>
</graphics>
<rng model="virtio">
<backend model="random">/dev/urandom</backend>
</rng>
@ -153,7 +155,6 @@ def run_instances(
int(instance_type.vcpu),
str(config.instances.location / instance_id),
mac,
None,
),
)
domain.create()

View File

@ -0,0 +1,20 @@
from pydantic_xml import BaseXmlModel, element
class Image(BaseXmlModel):
imageId: str = element()
imageState: str = element()
name: str = element()
class ImagesSet(BaseXmlModel, tag="imagesSet"):
items: list[Image] = element(tag="item")
class DescribeImagesResponse(
BaseXmlModel,
tag="DescribeImagesResponse",
nsmap={"": "http://ec2.amazonaws.com/doc/2016-11-15/"}
):
requestId: str = element()
imagesSet: ImagesSet = element()

View File

@ -16,11 +16,20 @@ class _OpenEC2InstanceConfig(BaseModel):
class _OpenEC2LibvirtConfig(BaseModel):
connection: str
class _OpenEC2DatabaseConfig(BaseModel):
# DB URL for sqlmodel
url: str
# Print SQL statements
debug: bool
class _OpenEC2Config(BaseModel):
images: Path
seed: Path
instances: _OpenEC2InstanceConfig
libvirt: _OpenEC2LibvirtConfig
database: _OpenEC2DatabaseConfig
debug: bool
def _get_config() -> _OpenEC2Config:
# TODO: Read from disk
@ -40,6 +49,11 @@ def _get_config() -> _OpenEC2Config:
libvirt=_OpenEC2LibvirtConfig(
connection="qemu:///system"
),
debug=True,
database=_OpenEC2DatabaseConfig(
url="sqlite:////home/alexander/openec2/db2.sqlite3",
debug=True,
),
)
class ConfigSingleton:

View File

@ -2,12 +2,14 @@ from typing import Generator, Annotated
from fastapi import Depends
from sqlmodel import Session, create_engine
from openec2.config import ConfigSingleton
engine = create_engine(
"sqlite:////home/alexander/openec2/db2.sqlite3",
ConfigSingleton.of().config.database.url,
connect_args={
"check_same_thread": False,
},
echo=True,
echo=ConfigSingleton.of().config.database.debug,
)
def get_session() -> Generator[Session]: