mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 19:26:48 +00:00
- Routers use path converters (use_regex_path=False): computes, instances and flavors take <int:...> ids, so non-numeric ids get 404 and drf-spectacular derives the parameter types itself. - Each method declares what it really returns: detail serializers, a shared StatusSerializer for status-only replies, no request body for actions. Instance properties used by the details serializer get return type hints. - The create-instance API drops the firmware field. Its only accepted value was "" (BIOS), which produced an empty, invalid enum, and the UEFI branch behind it was unreachable. Clients that still send it are unaffected; DRF ignores unknown fields. The schema now passes spectacular --validate --fail-on-warn; a test keeps it that way.
68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
from admin.permissions import IsSuperUser
|
|
from computes.models import Compute
|
|
from drf_spectacular.types import OpenApiTypes
|
|
from drf_spectacular.utils import extend_schema
|
|
from rest_framework import viewsets
|
|
from rest_framework.response import Response
|
|
from vrtManager.create import wvmCreate
|
|
|
|
from .serializers import ComputeSerializer
|
|
|
|
|
|
class ComputeViewSet(viewsets.ModelViewSet):
|
|
"""
|
|
API endpoint that allows computes to be viewed or edited.
|
|
"""
|
|
|
|
queryset = Compute.objects.all().order_by("name")
|
|
lookup_value_converter = "int"
|
|
serializer_class = ComputeSerializer
|
|
permission_classes = [IsSuperUser]
|
|
|
|
|
|
class ComputeArchitecturesView(viewsets.ViewSet):
|
|
permission_classes = [IsSuperUser]
|
|
|
|
# The list is a mapping of architecture -> machine types, not an array,
|
|
# so drf-spectacular would name it "retrieve" and clash with retrieve().
|
|
@extend_schema(operation_id="api_v1_computes_archs_list", responses=OpenApiTypes.OBJECT)
|
|
def list(self, request, compute_pk=None):
|
|
"""
|
|
Return a list of supported host architectures.
|
|
"""
|
|
compute = Compute.objects.get(pk=compute_pk)
|
|
conn = wvmCreate(
|
|
compute.hostname,
|
|
compute.login,
|
|
compute.password,
|
|
compute.type,
|
|
)
|
|
return Response(conn.get_hypervisors_machines())
|
|
|
|
@extend_schema(responses={200: {"type": "array", "items": {"type": "string"}}})
|
|
def retrieve(self, request, compute_pk=None, pk=None):
|
|
compute = Compute.objects.get(pk=compute_pk)
|
|
conn = wvmCreate(
|
|
compute.hostname,
|
|
compute.login,
|
|
compute.password,
|
|
compute.type,
|
|
)
|
|
return Response(conn.get_machine_types(pk))
|
|
|
|
|
|
class ComputeMachinesView(viewsets.ViewSet):
|
|
permission_classes = [IsSuperUser]
|
|
|
|
def list(self, request, compute_pk=None, archs_pk=None):
|
|
"""
|
|
Return a list of supported host architectures.
|
|
"""
|
|
compute = Compute.objects.get(pk=compute_pk)
|
|
conn = wvmCreate(
|
|
compute.hostname,
|
|
compute.login,
|
|
compute.password,
|
|
compute.type,
|
|
)
|
|
return Response(conn.get_machine_types(archs_pk))
|