前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动化设备管理平台

自动化设备管理平台

作者头像
zx钟
发布2019-12-11 17:52:41
8930
发布2019-12-11 17:52:41
举报
文章被收录于专栏:测试游记测试游记

需求

  1. 设备信息添加
  • 设备IP
  • 设备名称
  • 设备版本
  • 工装设备IP
  • 工装电脑IP
  • 每日编译状态「只读」

TODO:修改时间大于x天自动释放

  • 设备使用状态「只读」
  • 设备SD卡状态
  • 设备位置
  • 添加时间
  • 修改时间「不可见」
  • 逻辑删除「不可见」
  1. 获取空闲设备
  • 输入 设备IP返回使用状态
代码语言:javascript
复制
{'device_ip': '203.1.4.10'}
  • 输入 设备名称返回使用状态
代码语言:javascript
复制
data = {'device_name': 'abc'}
  • 输入 测试类型「每日编译/正式版本/工装」返回空闲设备列表
代码语言:javascript
复制
data = {'type': 'daily'}
data = {'type': 'tool'}
data = {'type': 'unuse'}
  1. 修改使用状态
  • 使用 设备IP+ 使用状态来进行修改
代码语言:javascript
复制
{
    'device_ip': '203.1.4.10',
    'use_status': 0,
    'daily_status': 0
}

数据库设计

设备ip device_ip唯一

代码语言:javascript
复制
from django.db import models
from utils.base_models import BaseModel

status_choice = ((0, '空闲'), (1, '使用中'))
sd_status_choice = ((0, '无'), (1, '有'))


class Device_info(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    device_ip = models.CharField('设备IP', max_length=200, unique=True, help_text='设备IP')
    device_name = models.CharField('设备名称', max_length=200, help_text='设备名称')
    device_version = models.CharField('设备版本', max_length=200, help_text='版本信息')
    tool_ip = models.CharField('工装设备IP', max_length=200, null=True, blank=True, default='', help_text='工装设备IP')
    tool_pc_ip = models.CharField('工装电脑IP', max_length=200, null=True, blank=True, default='', help_text='工装电脑IP')
    daily_status = models.IntegerField('每日编译状态', choices=status_choice, default=0, help_text='每日编译状态')
    use_status = models.IntegerField('设备使用状态', choices=status_choice, default=0, help_text='设备使用状态')
    sd_status = models.IntegerField('SD卡状态', choices=sd_status_choice, default=0, help_text='SD卡状态')
    address = models.CharField('设备位置', max_length=200, null=True, blank=True, default='', help_text='设备位置')

    class Meta:
        db_table = 'u_device_info'
        verbose_name = '设备信息'
        verbose_name_plural = verbose_name

    def __str__(self):
        return f"{self.device_ip}-{self.device_name}"

获取空闲设备

使用 request.data从post请求中拿到数据

代码语言:javascript
复制
data = request.data
device_ip = data.get('device_ip')
device_name = data.get('device_name')
type = data.get('type')

情况1:根据设备IP

由于 device_ip唯一,直接返回找到的设备信息

代码语言:javascript
复制
device_info_objs = self.queryset.filter(device_ip=device_ip).first()

情况2:根据设备名称

返回全部该设备名称的内容

代码语言:javascript
复制
device_info_objs = self.queryset.filter(device_name=device_name).all()

情况3:根据类型

每日编译

daily_statususe_status都为0的第一个内容

代码语言:javascript
复制
device_info_objs = self.queryset.filter(daily_status=0, use_status=0).first()
工装

获取 use_status=1的工装电脑ip列表

代码语言:javascript
复制
working = self.queryset.values('tool_pc_ip').annotate(use=Count('use_status')).filter(
                    use_status=1).filter(tool_pc_ip__contains='.').all()
working_list = list(working)

挑选出不包含上述工装电脑IP的设备

代码语言:javascript
复制
if working_list:
  print([f"跳过的工装PC:{i.get('tool_pc_ip')}" for i in working_list])
  device_info_objs = self.queryset.filter(~Q(tool_pc_ip=working_list[0].get('tool_pc_ip')))
  device_info_objs = device_info_objs.filter(tool_pc_ip__contains='.')
  for i in working_list[1:]:
    a = ~Q(tool_pc_ip=i.get('tool_pc_ip'))
    device_info_objs = device_info_objs.filter(a)
普通未使用设备

use_status=0且不是工装的设备

代码语言:javascript
复制
device_info_objs = self.queryset.filter(is_delete=False,use_status=0).filter(tool_pc_ip='').filter(tool_ip='').all()

全部代码

代码语言:javascript
复制
@action(methods=['post'], detail=False)
def status(self, request):
    """
    获取设备状态
    {
        "device_ip":"",
        "device_name":"",
        "type":"daily/tool/unuse"
    }
    """
    data = request.data
    device_ip = data.get('device_ip')
    device_name = data.get('device_name')
    type = data.get('type')
    device_info_objs = self.queryset
    if device_ip:
        # 根据设备IP查找,返回一个
        device_info_objs = self.queryset.filter(device_ip=device_ip).first()
    elif device_name:
        # 根据设备名称查找,返回全部
        device_info_objs = self.queryset.filter(device_name=device_name).all()
    elif type:
        if type == 'daily':
            # 每日编译状态为0 且设备使用状态为0,返回一个
            device_info_objs = self.queryset.filter(daily_status=0, use_status=0).first()
        elif type == 'tool':
            # 有工装IP 同一工装电脑下设备使用状态为0,返回全部
            # 查找 tool_pc_ip有「.」内容且 use_status为1的全部电脑IP
            working = self.queryset.values('tool_pc_ip').annotate(use=Count('use_status')).filter(
                use_status=1).filter(tool_pc_ip__contains='.').all()
            working_list = list(working)
            if working_list:
                print([f"跳过的工装PC:{i.get('tool_pc_ip')}" for i in working_list])
                device_info_objs = self.queryset.filter(~Q(tool_pc_ip=working_list[0].get('tool_pc_ip')))
                device_info_objs = device_info_objs.filter(tool_pc_ip__contains='.')
                for i in working_list[1:]:
                    a = ~Q(tool_pc_ip=i.get('tool_pc_ip'))
                    device_info_objs = device_info_objs.filter(a)
            else:
                return Response({'status': -1, 'error': '没有空闲的工装设备'})
        elif type == 'unuse':
            # 任意非使用状态的普通设备,返回全部
            device_info_objs = self.queryset.filter(is_delete=False, use_status=0).filter(tool_pc_ip='').filter(
                tool_ip='').all()
    else:
        return Response({'status': -1, 'error': '请使用正确的查询方式'})
    if device_ip or type == 'daily':
        serializer = self.get_serializer(device_info_objs, many=False)
    else:
        serializer = self.get_serializer(device_info_objs, many=True)
    new_data = get_count_by_device_info(serializer.data)
    return Response(new_data)

修改设备状态

从数据库中检索 device_ip=device_ip的内容

代码语言:javascript
复制
device_info = self.queryset.filter(device_ip=device_ip).first()
device_info.use_status = use_status
device_info.daily_status = daily_status
代码语言:javascript
复制
@action(methods=['post'], detail=False)
def use(self, request, *args, **kwargs):
   """
   修改设备使用状态
        {
            "device_ip":'',
            "use_status":0或1,
            "daily_status":0或1
        }
    """
    data = request.data
    device_ip = data.get('device_ip')
    use_status = data.get('use_status')
    daily_status = data.get('daily_status')
    device_info = self.queryset.filter(device_ip=device_ip).first()
    if use_status in [0, 1] and daily_status in [0, 1] and device_info:
      device_info.use_status = use_status
      device_info.save()
      serializer = serializers.DeviceModelSerializer(instance=device_info)
      return Response(serializer.data)
    else:
      return Response({'status': -1, 'error': 'use_status和daily_status只能为0或1'})

部署

Deploydevice_manage路径下

代码语言:javascript
复制
$ docker-compose up

代码地址:https://github.com/zx490336534/UTest_device_manage

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 数据库设计
  • 获取空闲设备
    • 情况1:根据设备IP
      • 情况2:根据设备名称
        • 情况3:根据类型
          • 每日编译
          • 工装
          • 普通未使用设备
        • 全部代码
        • 修改设备状态
        • 部署
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档