mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
							parent
							
								
									44397caad4
								
							
						
					
					
						commit
						8ed823d587
					
				| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue