feat: 批量不是发布机 (#11150)

Co-authored-by: feng <1304903146@qq.com>
pull/11151/head
fit2bot 2023-08-01 17:42:16 +08:00 committed by GitHub
parent 44397caad4
commit 8ed823d587
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 22 deletions

View File

@ -1,3 +1,4 @@
from rest_framework import status
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
@ -7,8 +8,7 @@ from common.permissions import IsServiceAccount
from orgs.utils import tmp_to_builtin_org
from terminal.models import AppletHost, AppletHostDeployment
from terminal.serializers import (
AppletHostSerializer, AppletHostDeploymentSerializer,
AppletHostStartupSerializer, AppletHostDeployAppletSerializer
AppletHostSerializer, AppletHostDeploymentSerializer, AppletHostStartupSerializer
)
from terminal.tasks import run_applet_host_deployment, run_applet_host_deployment_install_applet
@ -63,12 +63,20 @@ class AppletHostDeploymentViewSet(viewsets.ModelViewSet):
instance.save_task(task.id)
return Response({'task': str(task.id)}, status=201)
@action(methods=['post'], detail=False, serializer_class=AppletHostDeployAppletSerializer)
@action(methods=['post'], detail=False)
def applets(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
applet_id = serializer.validated_data.pop('applet_id', '')
instance = serializer.save()
task = run_applet_host_deployment_install_applet.delay(instance.id, applet_id)
instance.save_task(task.id)
return Response({'task': str(task.id)}, status=201)
hosts = request.data.get('hosts', [])
applet_id = request.data.get('applet_id', '')
model = self.get_queryset().model
hosts_qs = AppletHost.objects.filter(id__in=hosts)
if not hosts_qs.exists():
return Response(status=status.HTTP_404_NOT_FOUND)
objs = [model(host=host) for host in hosts_qs]
applet_host_deployments = model.objects.bulk_create(objs)
applet_host_deployment_ids = [str(obj.id) for obj in applet_host_deployments]
task = run_applet_host_deployment_install_applet.delay(applet_host_deployment_ids, applet_id)
task_id = str(task.id)
model.objects.filter(id__in=applet_host_deployment_ids).update(task=task_id)
return Response({'task': task_id}, status=201)

View File

@ -15,7 +15,7 @@ from ..models import AppletHost, AppletHostDeployment
__all__ = [
'AppletHostSerializer', 'AppletHostDeploymentSerializer',
'AppletHostAccountSerializer', 'AppletHostAppletReportSerializer',
'AppletHostStartupSerializer', 'AppletHostDeployAppletSerializer'
'AppletHostStartupSerializer'
]
@ -124,13 +124,6 @@ class AppletHostDeploymentSerializer(serializers.ModelSerializer):
fields = fields_mini + ['comment'] + read_only_fields
class AppletHostDeployAppletSerializer(AppletHostDeploymentSerializer):
applet_id = serializers.UUIDField(write_only=True, allow_null=True, required=False)
class Meta(AppletHostDeploymentSerializer.Meta):
fields = AppletHostDeploymentSerializer.Meta.fields + ['applet_id']
class AppletHostAccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account

View File

@ -98,12 +98,13 @@ def run_applet_host_deployment(did):
@shared_task(
verbose_name=_('Install applet'),
activity_callback=lambda self, did, applet_id, *args, **kwargs: ([did],)
activity_callback=lambda self, ids, applet_id, *args, **kwargs: (ids,)
)
def run_applet_host_deployment_install_applet(did, applet_id):
def run_applet_host_deployment_install_applet(ids, applet_id):
with tmp_to_builtin_org(system=1):
deployment = AppletHostDeployment.objects.get(id=did)
deployment.install_applet(applet_id)
for did in ids:
deployment = AppletHostDeployment.objects.get(id=did)
deployment.install_applet(applet_id)
@shared_task(