From c5a9a85818fe6f24ee29321d5eed99c3d7cbf47a Mon Sep 17 00:00:00 2001 From: xinwen Date: Mon, 15 Jun 2020 19:42:36 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=20=E5=AE=8C=E5=96=84=20=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B8=AD=E5=BF=83/=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8=20(#4105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/api/adhoc.py | 16 ++++++++--- apps/ops/models/adhoc.py | 4 +++ apps/ops/serializers/adhoc.py | 53 ++++++++++++++++++++++++++--------- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/apps/ops/api/adhoc.py b/apps/ops/api/adhoc.py index ee81f869f..aef4c9b06 100644 --- a/apps/ops/api/adhoc.py +++ b/apps/ops/api/adhoc.py @@ -4,14 +4,17 @@ from django.shortcuts import get_object_or_404 from rest_framework import viewsets, generics from rest_framework.views import Response -from django.db.models import Count, Q from common.permissions import IsOrgAdmin from common.serializers import CeleryTaskSerializer -from orgs.utils import current_org from ..models import Task, AdHoc, AdHocExecution -from ..serializers import TaskSerializer, AdHocSerializer, \ - AdHocExecutionSerializer, TaskDetailSerializer +from ..serializers import ( + TaskSerializer, + AdHocSerializer, + AdHocExecutionSerializer, + TaskDetailSerializer, + AdHocDetailSerializer, +) from ..tasks import run_ansible_task __all__ = [ @@ -53,6 +56,11 @@ class AdHocViewSet(viewsets.ModelViewSet): serializer_class = AdHocSerializer permission_classes = (IsOrgAdmin,) + def get_serializer_class(self): + if self.action == 'retrieve': + return AdHocDetailSerializer + return super().get_serializer_class() + def get_queryset(self): task_id = self.request.query_params.get('task') if task_id: diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index 013fdc628..36ebd77e0 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -150,6 +150,10 @@ class AdHoc(OrgModelMixin): created_by = models.CharField(max_length=64, default='', blank=True, null=True, verbose_name=_('Create by')) date_created = models.DateTimeField(auto_now_add=True, db_index=True) + @lazyproperty + def run_times(self): + return self.execution.count() + @property def inventory(self): if self.become: diff --git a/apps/ops/serializers/adhoc.py b/apps/ops/serializers/adhoc.py index d4e67371a..f07c1ca47 100644 --- a/apps/ops/serializers/adhoc.py +++ b/apps/ops/serializers/adhoc.py @@ -8,10 +8,16 @@ from ..models import Task, AdHoc, AdHocExecution, CommandExecution class AdHocExecutionSerializer(serializers.ModelSerializer): stat = serializers.SerializerMethodField() + last_success = serializers.ListField(source='success_hosts') + last_failure = serializers.DictField(source='failed_hosts') class Meta: model = AdHocExecution - fields = '__all__' + fields = [ + 'id', 'task', 'task_display', 'hosts_amount', 'adhoc', 'date_start', 'stat', + 'date_finished', 'timedelta', 'is_finished', 'is_success', 'result', 'summary', + 'short_id', 'adhoc_short_id', 'last_success', 'last_failure' + ] @staticmethod def get_task(obj): @@ -28,17 +34,15 @@ class AdHocExecutionSerializer(serializers.ModelSerializer): "failed": count_failed_hosts } - def get_field_names(self, declared_fields, info): - fields = super().get_field_names(declared_fields, info) - fields.extend(['short_id', 'adhoc_short_id']) - return fields - class AdHocExecutionExcludeResultSerializer(AdHocExecutionSerializer): - def get_field_names(self, declared_fields, info): - fields = super().get_field_names(declared_fields, info) - fields = [i for i in fields if i not in ['result', 'summary']] - return fields + class Meta: + model = AdHocExecution + fields = [ + 'id', 'task', 'task_display', 'hosts_amount', 'adhoc', 'date_start', 'stat', + 'date_finished', 'timedelta', 'is_finished', 'is_success', + 'short_id', 'adhoc_short_id', 'last_success', 'last_failure' + ] class TaskSerializer(serializers.ModelSerializer): @@ -60,15 +64,15 @@ class TaskSerializer(serializers.ModelSerializer): class TaskDetailSerializer(TaskSerializer): - last_success = serializers.ListField(source='latest_execution.success_hosts') - last_failure = serializers.DictField(source='latest_execution.failed_hosts') + contents = serializers.ListField(source='latest_adhoc.tasks') class Meta(TaskSerializer.Meta): - fields = TaskSerializer.Meta.fields + ['last_success', 'last_failure'] + fields = TaskSerializer.Meta.fields + ['contents'] class AdHocSerializer(serializers.ModelSerializer): become_display = serializers.ReadOnlyField() + tasks = serializers.ListField() class Meta: model = AdHoc @@ -86,6 +90,29 @@ class AdHocSerializer(serializers.ModelSerializer): } +class AdHocExecutionNestSerializer(serializers.ModelSerializer): + last_success = serializers.ListField(source='success_hosts') + last_failure = serializers.DictField(source='failed_hosts') + last_run = serializers.CharField(source='short_id') + + class Meta: + model = AdHocExecution + fields = ( + 'last_success', 'last_failure', 'last_run', 'timedelta', 'is_finished', + 'is_success' + ) + + +class AdHocDetailSerializer(AdHocSerializer): + latest_execution = AdHocExecutionNestSerializer(allow_null=True) + task_name = serializers.CharField(source='task.name') + + class Meta(AdHocSerializer.Meta): + fields = AdHocSerializer.Meta.fields + [ + 'latest_execution', 'created_by', 'run_times', 'task_name' + ] + + class CommandExecutionSerializer(serializers.ModelSerializer): result = serializers.JSONField(read_only=True) log_url = serializers.SerializerMethodField()