# coding:utf-8 import datetime from rest_framework import serializers from utils.supervisord_utils import SupervisordUtils from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes class SystemDetailSerializer(serializers.Serializer): cpu_rate = serializers.IntegerField(help_text='cpu使用率', default=0.0) disk_rate = serializers.IntegerField(help_text='磁盘使用率', default=0.0) memory_rate = serializers.IntegerField(help_text='内存使用率', default=0.0) disk_used = serializers.CharField(help_text="磁盘已使用", default="20G") disk_total = serializers.CharField(help_text=" 磁盘总数", default="100G") memory_used = serializers.CharField(help_text="内存已使用", default="3G") memory_total = serializers.CharField(help_text="内存总数", default="8G") def to_representation(self, instance): return { 'cpu_rate': instance['cpu_rate'], 'disk_rate': instance['disk_rate'], 'memory_rate': instance['memory_rate'], 'disk_used': instance['disk_used'], 'disk_total': instance['disk_total'], 'memory_used': instance['memory_used'], 'memory_total': instance['memory_total'] } class ProcessListSerializer(serializers.Serializer): pid = serializers.IntegerField(help_text='进程id', default=1) name = serializers.CharField(help_text="进程名称", default="nginx") start_time = serializers.DateTimeField(help_text="启动时间", default="2020-03-06 20:54:00") state_name = serializers.CharField(label="运行状态", help_text="当运行状态不等于RUNNING时候,停止按钮设置为不可点击状态", default="RUNNING") description = serializers.CharField(help_text="描述信息", default="Exited too quickly (process log may have details)") def to_representation(self, instance): start_date = datetime.datetime.fromtimestamp(instance['start']) start_time = start_date.strftime('%Y-%m-%d %H:%M:%S') state_name = instance['statename'] description = instance['description'] pid = -1 if state_name == 'RUNNING': pid = instance['pid'] now = datetime.datetime.fromtimestamp(instance['now']) diff_date = now - start_date description = '已运行 ' + str(diff_date).replace('days', '天') return { "pid": pid, "name": instance['name'], "start_time": start_time, "state_name": instance['statename'], "description": description } class ProcessDetailDeleteSerializer(serializers.Serializer): name = serializers.CharField(required=True, help_text="进程名称", error_messages={ 'required': '参数必须存在', 'blank': '进程名称不能为空', }) def validate_name(self, value): if not SupervisordUtils().is_exists(value): raise serializers.ValidationError('{}进程不存在'.format(value)) class ProcessDetailPutSerializer(ProcessDetailDeleteSerializer): action = serializers.CharField(label="操作方式", required=True, help_text="stop 表示停止,restart 表示重启") def validate_action(self, value): if value not in ['stop', 'restart']: raise serializers.ValidationError('仅支持stop或restart')