1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-11 04:36:48 +00:00

feat(instances): migration runs as a job

This commit is contained in:
catborise 2026-10-15 20:20:16 +03:00
parent 149c14f1bb
commit 31cbe60aa4
12 changed files with 283 additions and 282 deletions

View file

@ -96,6 +96,7 @@ class MigrateSerializer(serializers.ModelSerializer):
autoconverge = serializers.BooleanField(default=True)
compress = serializers.BooleanField(default=False)
unsafe = serializers.BooleanField(default=False)
submission_key = serializers.CharField(write_only=True)
class Meta:
model = MigrateInstance
@ -107,4 +108,5 @@ class MigrateSerializer(serializers.ModelSerializer):
"autoconverge",
"compress",
"unsafe",
"submission_key",
]

View file

@ -5,7 +5,6 @@ from django.http import Http404
from django.shortcuts import get_object_or_404
from django.urls import reverse
from instances.models import Flavor, Instance
from instances.utils import migrate_instance
from instances.views import destroy as instance_destroy
from instances.views import (
force_off,
@ -184,22 +183,17 @@ class MigrateViewSet(viewsets.ViewSet):
serializer_class = MigrateSerializer
queryset = ""
@extend_schema(responses=StatusSerializer)
@extend_schema(responses={202: OperationSerializer, 400: dict})
def create(self, request):
serializer = MigrateSerializer(data=request.data)
if serializer.is_valid():
instance = serializer.validated_data["instance"]
target_host = serializer.validated_data["target_compute"]
options = {
name: serializer.validated_data.get(name, False)
for name in ("live", "unsafe", "offline", "autoconverge", "compress")
}
# migrate_instance logs the outcome; it returns when it is done
mode = migrate_instance(target_host, instance, request.user, **options)
return Response({"status": f"instance is migrated ({mode})"})
else:
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
data = serializer.validated_data
raw = {"instance": data["instance"].pk, "target": data["target_compute"].pk,
**{name: data.get(name, False) for name in ("live", "unsafe", "offline", "autoconverge", "compress")}}
op = jobs.submit("instance.migrate", request.user, raw, data["submission_key"])
return Response(OperationSerializer(op, context={"request": request}).data, status=status.HTTP_202_ACCEPTED,
headers={"Location": reverse("operation-detail", args=[op.pk])})
class FlavorViewSet(viewsets.ModelViewSet):