def delete_resource_pool(self, uuids):
     logging.info("start delete resource pools: %s" % (uuids))
     ret = get_error_result("Success")
     try:
         for uuid in uuids:
             resource_pool = YzyResourcePools.objects.filter(
                 deleted=False).get(uuid=uuid)
             node_count = YzyNodes.objects.filter(
                 deleted=False, resource_pool=resource_pool).count()
             image_count = YzyBaseImages.objects.filter(
                 deleted=False, resource_pool=resource_pool).count()
             template_count = YzyInstanceTemplate.objects.filter(
                 deleted=False, pool=resource_pool).count()
             if node_count > 0 or image_count > 0:
                 logger.error("delete resource pool fail")
                 return get_error_result("ResourcePoolHaveNodeDeleteFail")
             if template_count > 0:
                 logger.error("delete resource pool fail")
                 return get_error_result(
                     "ResourcePoolHaveTemplateDeleteFail")
             else:
                 ret = server_post("/api/v1/resource_pool/delete",
                                   {"uuid": uuid})
                 if ret.get("code", -1) != 0:
                     return get_error_result("ResourcePoolDeleteFail")
                 else:
                     return get_error_result("Success")
         logging.info("end delete resource pools operate!")
         msg = "删除资源池 %s" % ('/'.join(uuids))
         insert_operation_log(msg, ret['msg'])
         return get_error_result("Success")
     except Exception as e:
         return get_error_result("OtherError")
Example #2
0
 def put(self, request, *args, **kwargs):
     try:
         _data = request.data
         user_id = _data.get("user_id")
         user = self.get_object(user_id)
         if not user:
             logger.error("admin user not exist: %s" % user_id)
             ret = get_error_result("AdminUserNotExist")
             return ret
         # username = _data.get("username") or None
         real_name = _data.get("real_name") or None
         password = _data.get("password") or None
         role_id = _data.get("role") or None
         desc = _data.get("desc", "") or None
         email = _data.get("email", "") or None
         # if username: user.username = username
         if real_name is not None: user.real_name = real_name
         if password: user.password = create_md5(password)
         if role_id: user.role_id = role_id
         if desc is not None: user.desc = desc
         if email is not None: user.email = email
         user.save()
         ret = get_error_result()
         msg = "修改管理员用户信息: %s" % user_id
         insert_operation_log(msg, ret)
         return JSONResponse(ret)
     except Exception as e:
         logger.error("", exc_info=True)
         return JSONResponse(get_error_result("OtherError"))
Example #3
0
    def delete_terminal(self, data):
        """ 删除终端 """
        try:
            mac_list, name_list = self.get_terminal_mac_name_list(data)
        except Exception as e:
            logger.error("", exc_info=True)
            return get_error_result("ParamError")

        mac_list_str = ",".join(mac_list)
        # 提交终端服务接口
        req_data = {
            "handler": "WebTerminalHandler",
            "command": "delete",
            "data": {
                "mac_list": mac_list_str,
            }
        }
        ret = terminal_post("/api/v1/terminal/task", req_data)
        msg = "删除终端 %s" % "/".join(name_list)
        insert_operation_log(msg, ret["msg"])
        if ret.get("code", -1) != 0:
            logger.error("terminal close fail: %s" % mac_list_str)
            return get_error_result("TerminalCloseOperateError")

        logger.info("terminal delete success!!! %s" % mac_list_str)
        return get_error_result("Success")
Example #4
0
 def delete(self, request):
     """
     {
         "groups": [
                 {
                     "uuid": "f38c048e-59fc-11ea-84fd-000c295dd728",
                     "name": "group1"
                 }
             ]
     }
     """
     try:
         data = json.loads(request.body)
         groups = data.get('groups', [])
         names = list()
         for group in groups:
             names.append(group['name'])
         ret = self.delete_groups(groups)
         log_user = {
             "id": request.user.id if request.user.id else 1,
             "user_name": request.user.username,
             "user_ip": request.META.get('HTTP_X_FORWARDED_FOR') if request.META.get('HTTP_X_FORWARDED_FOR')
             else request.META.get("REMOTE_ADDR")
         }
         msg = "删除教学分组'%s'" % ('/'.join(names))
         insert_operation_log(msg, ret['msg'], log_user, module="voi_education_group")
         logger.info("delete voi group end")
     except Exception as e:
         logger.error("delete education group error:%s", e, exc_info=True)
         ret = get_error_result("GroupDeleteError")
         msg = "删除教学分组'%s'" % ('/'.join(names))
         insert_operation_log(msg, ret['msg'], log_user, module="voi_education_group")
         return JsonResponse(ret, status=200,
                             json_dumps_params={'ensure_ascii': False})
     return JsonResponse(ret, json_dumps_params={'ensure_ascii': False})
Example #5
0
    def post(self, request, *args, **kwargs):
        ret = get_error_result("Success")

        _data = request.data
        password = _data.get("password")
        if not password:
            # ex = Exception("not input password!")
            logger.error("create admin user error: not password input")
            ret = get_error_result("NotPasswordInputError")
            # return JSONResponse(ret)
        else:
            _data.update({"password": create_md5(password)})
            ser = YzyAdminUserSerializer(data=_data,
                                         context={'request': request})
            if ser.is_valid():
                ser.save()
                # return Response(ser.data, status=status.HTTP_201_CREATED)

                # return JSONResponse()
            else:
                msg = ser.errors
                ret = get_error_result("ParamError")
                ret["msg"] = msg
        logger.info("create admin user: %s" % ret)
        msg = "创建管理员用户: %s" % _data.get("username")
        insert_operation_log(msg, ret)
        return JSONResponse(ret)
Example #6
0
 def start_check(self, param, log_user=None):
     """
     :param param:
         {
             "desktops": [
                     {
                         "name": "desktop1",
                         "uuid": ""
                     },
                     ...
                 ]
         }
     :return:
     """
     desktops = param.get('desktops', [])
     names = list()
     for desktop in desktops:
         names.append(desktop['name'])
     ret = self.start_dekstops(desktops)
     msg = "教学桌面组'%s'开机" % ('/'.join(names))
     insert_operation_log(msg,
                          ret['msg'],
                          log_user,
                          module="education_desktop")
     return ret
Example #7
0
    def start_sort_terminal(self, data):
        group_uuid = data.get("group_uuid", "")
        start_num = data.get("index_start")

        if not (group_uuid and start_num) or not isinstance(start_num, int):
            logger.error("terminal sort number error: param error")
            return get_error_result("ParamError")

        # 判断组的存在
        group = self.get_object_by_uuid(YzyGroup, group_uuid)
        if not group:
            logger.error("terminal sort number error: %s group not exist" %
                         group_uuid)
            return get_error_result("TerminalWebGroupNotExist")

        req_data = {
            "handler": "WebTerminalHandler",
            "command": "terminal_order",
            "data": {
                "group_uuid": group_uuid,
                "start_num": start_num
            }
        }
        ret = terminal_post("/api/v1/terminal/task", req_data)
        msg = "分组 %s 终端排序" % group.name
        insert_operation_log(msg, ret["msg"])
        if ret.get("code", -1) != 0:
            logger.error("terminal update name fail")
            return ret

        logger.info("terminal sort number success!!! %s" % group.name)
        return ret
 def delete_group_check(self, param, log_user=None):
     """
     :param param:
         {
             "desktop_uuid": "ea2bbe72-593c-11ea-9631-000c295dd728",
             "desktop_name": "desktop1",
             "groups": [
                     {
                         "uuid": "",
                         "group_name": ""
                     }
                 ]
         }
     :return:
     """
     groups = param.get('groups', [])
     names = list()
     for group in groups:
         names.append(group['group_name'])
     ret = self.delete_groups(param)
     msg = '个人桌面组"%s"移除绑定用户组"%s"' % (param['desktop_name'], '、'.join(names))
     insert_operation_log(msg,
                          ret['msg'],
                          log_user,
                          module="personal_desktop")
     return ret
Example #9
0
 def shutdown_node(self, data):
     """
     data : [
         {"uuid": "xxxxxxx", "hostname": "xxxxxx"},
         {"uuid": "xxxxxxx", "hostname": "xxxxxx"},
         {"uuid": "xxxxxxx", "hostname": "xxxxxx"}
     ]
     :param data:
     :return:
     """
     names = []
     ret = get_error_result("Success")
     for node in data:
         uuid = node.get("uuid")
         hostname = node.get("hostname")
         names.append(hostname)
         obj = self.get_object_by_uuid(YzyNodes, uuid)
         if obj:
             ret = server_post("/node/shutdown", node)
             if ret.get("code", -1) != 0:
                 logger.error("shutdown node[%s] error: %s" %
                              (hostname, ret))
                 break
         else:
             logger.error("shutdown node[%s] info not exist!" % hostname)
             ret = get_error_result("NodeNotExistMsg", hostname=hostname)
     msg = "关机节点 %s" % ('/'.join(names))
     insert_operation_log(msg, ret["msg"])
     return ret
Example #10
0
 def start_check(self, param, log_user=None):
     """
     :param param:
         {
             "desktop_uuid": "ea2bbe72-593c-11ea-9631-000c295dd728",
             "desktop_name": "desktop1",
             "desktop_type": 1,
             "instances": [
                     {
                         "uuid": "",
                         "name": ""
                     }
                 ]
         }
     :return:
     """
     instances = param.get('instances', [])
     names = list()
     for instance in instances:
         names.append(instance['name'])
     ret = self.start_instances(param)
     msg = "个人桌面组'%s'中的桌面'%s'开机" % (param['desktop_name'], '/'.join(names))
     insert_operation_log(msg,
                          ret['msg'],
                          log_user,
                          module="personal_desktop")
     return ret
Example #11
0
    def delete(self, resource_pool_uuid, uuids):
        # pass
        resource_pool = self.get_object_by_uuid(YzyResourcePools,
                                                resource_pool_uuid)
        if not resource_pool:
            logger.error(
                "delete resource pool base image error: not resource pool[%s]"
                % resource_pool_uuid)
            return get_error_result("ResourcePoolNotExist")

        # ret = get_error_result("Success")
        # for uuid in uuids:
        #     try:
        #         base_image = self.get_object_by_uuid(YzyBaseImages, uuid)
        #     except Exception as e:
        #         ret = get_error_result("ResourceImageNotExist")
        #         logger.error("delete base image: %s error!" % (uuid))
        #         break
        #     # path = ""
        #     try:
        #         path = base_image.path
        #         if os.path.exists(path):
        #             os.remove(path)
        #         base_image.delete()
        #     except:
        #         ret = get_error_result("ResourceImageDelFail")
        #         logger.error("delete base image file: %s fail"%(uuid))
        #         break
        data = {"pool_uuid": resource_pool_uuid, "uuids": uuids}
        ret = server_post("/resource_pool/images/delete", data)
        msg = "删除基础镜像 %s" % ('/'.join(uuids))
        insert_operation_log(msg, ret["msg"])
        return ret
Example #12
0
    def delete_subnet(self, uuids):
        """
        data [
                {"uuid": "1a870202-3732-11ea-8a2d-000c295dd728","name": "xxxxx"},
                {"uuid": "1a870202-3732-11ea-8a2d-000c295dd728","name": "xxxxx"},
                {"uuid": "1a870202-3732-11ea-8a2d-000c295dd728","name": "xxxxx"}
            ]
        :param data:
        :return:
        """
        ret = get_error_result("Success")
        # for uuid in uuids:
        #     obj = self.get_object_by_uuid(YzySubnets, uuid)
        #     if obj:
        #         # 判断是否被占用
        #         templates = YzyInstanceTemplate.objects.filter(subnet_uuid=uuid, deleted=False).all()
        #         if templates:
        #             logger.error("delete subnet[%s] error, is be used"% uuid)

        ret = server_post("/subnet/delete", {'uuids': uuids})
        # if ret.get("code", -1) != 0:
        #     logger.error("delete subnet[%s] error: %s" % (uuid, ret))
        #     break
        # else:
        #     logger.error("delete subnet[%s] info not exist!" % uuid)
        #     ret = get_error_result("SubnetNotExist")
        msg = "删除子网 %s" % ('/'.join(uuids))
        insert_operation_log(msg, ret["msg"])
        return ret
Example #13
0
 def hard_stop_check(self, param, log_user=None):
     desktops = param.get('desktops', [])
     names = list()
     for desktop in desktops:
         names.append(desktop['name'])
     ret = self.stop_desktops(desktops, hard=True)
     msg = "个人桌面组'%s'强制关机" % ('/'.join(names))
     insert_operation_log(msg, ret['msg'], log_user, module="personal_desktop")
     return ret
Example #14
0
 def delete_check(self, param, log_user=None):
     desktops = param.get('desktops', [])
     names = list()
     for desktop in desktops:
         names.append(desktop['name'])
     ret = self.delete_desktops(desktops)
     msg = "删除个人桌面组'%s'" % ('/'.join(names))
     insert_operation_log(msg, ret['msg'], log_user, module="personal_desktop")
     return ret
Example #15
0
 def exit_maintenance_check(self, param, log_user=None):
     desktops = param.get('desktops', [])
     names = list()
     for desktop in desktops:
         names.append(desktop['name'])
     ret = self.exit_maintenance(desktops)
     msg = "个人桌面组'%s'关闭维护模式" % ('/'.join(names))
     insert_operation_log(msg, ret['msg'], log_user, module="personal_desktop")
     return ret
Example #16
0
 def reset_check(self, param, log_user=None):
     templates = param.get('templates', [])
     names = list()
     for template in templates:
         names.append(template['name'])
     ret = self.reset_templates(templates)
     msg = "模板'%s'重置" % ('/'.join(names))
     insert_operation_log(msg, ret['msg'], log_user, module="template")
     return ret
Example #17
0
 def delete_check(self, param, log_user=None):
     users = param.get('users', [])
     names = list()
     for user in users:
         names.append(user['user_name'])
     ret = self.delete_users(users)
     msg = "删除用户 %s" % ('/'.join(names))
     insert_operation_log(msg, ret['msg'], log_user, module="user_group")
     return ret
Example #18
0
    def update_setup_terminal(self, data):
        """更新终端配置
        {
            "handler": "WebTerminalHandler",
            "command": "set_terminal",
            "data": {
                "mac_list": "00-50-56-C0-00-08,00-50-56-C0-00-07,00-50-56-C0-00-06",
                "mode": {
                    "show_desktop_type": 0,
                    "auto_desktop": 1,
                    "open_strategy": true,
                    "close_desktop_strategy": false,
                    "close_terminal_strategy": true
                },
                "program": {
                    "screen_resolution": "1024*768",
                    "server_ip": "172.16.1.33",
                    "show_modify_user_passwd": true,
                    "terminal_setup_passwd": "111111"
                },
                "windows": {
                    "window_mode": 2,
                    "goto_local_desktop": 5,
                    "goto_local_auth": true,
                    "show_local_button": false,
                    "goto_local_passwd": "123456"
                }
            }
        }
        """
        try:
            mac_list, name_list = self.get_terminal_mac_name_list(data)
        except Exception as e:
            logger.error("", exc_info=True)
            return get_error_result("ParamError")

        setup_info = data.get("setup_info", {})
        if not self.check_setup_info(setup_info):
            return get_error_result("TerminalSetupInfoParamError")
        data = {"mac_list": ",".join(mac_list)}
        data.update(setup_info)
        req_data = {
            "handler": "WebTerminalHandler",
            "command": "set_terminal",
            "data": data
        }
        ret = terminal_post("/api/v1/terminal/task", req_data)
        msg = "更新终端配置 %s" % "/".join(name_list)
        insert_operation_log(msg, ret["msg"])
        if ret.get("code", -1) != 0:
            logger.error("terminal update setup info fail")
            return ret

        logger.info("terminal update setup info success!!!")
        return get_error_result("Success")
Example #19
0
 def reboot_check(self, param, log_user=None):
     """
     桌面很多时,重启时间很长,考虑用多线程
     """
     desktops = param.get('desktops', [])
     names = list()
     for desktop in desktops:
         names.append(desktop['name'])
     ret = self.reboot_desktops(desktops)
     msg = "个人桌面组'%s'重启" % ('/'.join(names))
     insert_operation_log(msg, ret['msg'], log_user, module="personal_desktop")
     return ret
Example #20
0
 def delete_check(self, param, log_user=None):
     instances = param.get('instances', [])
     names = list()
     for instance in instances:
         names.append(instance['name'])
     ret = self.delete_instances(param)
     msg = "删除教学桌面组'%s'中的桌面'%s'" % (param['desktop_name'], '/'.join(names))
     insert_operation_log(msg,
                          ret['msg'],
                          log_user,
                          module="education_desktop")
     return ret
Example #21
0
 def stop_check(self, param, log_user=None):
     desktops = param.get('desktops', [])
     names = list()
     for desktop in desktops:
         names.append(desktop['name'])
     ret = self.stop_desktops(desktops)
     msg = "教学桌面组'%s'关机" % ('/'.join(names))
     insert_operation_log(msg,
                          ret['msg'],
                          log_user,
                          module="education_desktop")
     return ret
Example #22
0
 def reboot_check(self, param, log_user=None):
     instances = param.get('instances', [])
     names = list()
     for instance in instances:
         names.append(instance['name'])
     ret = self.reboot_instances(param)
     msg = "个人桌面组'%s'中的桌面'%s'重启" % (param['desktop_name'], '/'.join(names))
     insert_operation_log(msg,
                          ret['msg'],
                          log_user,
                          module="personal_desktop")
     return ret
Example #23
0
    def delete_network(self, uuids):
        """
        :param data:
        :return:
        """
        ret = get_error_result("Success")
        success_num = 0
        failed_num = 0
        try:
            for uuid in uuids:
                obj = self.get_object_by_uuid(YzyNetworks, uuid)
                if obj:
                    templates = education_model.YzyInstanceTemplate.objects.filter(
                        deleted=False, network=obj).count()
                    if templates > 0:
                        failed_num += 1
                        continue
                    groups = education_model.YzyGroup.objects.filter(
                        deleted=False, network=obj).count()
                    if groups > 0:
                        failed_num += 1
                        continue
                    desktops = education_model.YzyDesktop.objects.filter(
                        deleted=False, network=obj).count()
                    if desktops > 0:
                        failed_num += 1
                        continue
                    personal_desktops = personal_model.YzyPersonalDesktop.objects.filter(
                        deleted=False, network=obj).count()
                    if personal_desktops > 0:
                        failed_num += 1
                        continue
                    ret = server_post("/network/delete", {'uuid': uuid})
                    if ret.get("code", -1) != 0:
                        failed_num += 1
                    else:
                        success_num += 1
                else:
                    failed_num += 1
        except Exception as e:
            logger.error("delete network failed:%s", e, exc_info=True)
            return get_error_result("DataNetworkDeleteFail")

        msg = "删除数据网络 %s" % ('/'.join(uuids))
        insert_operation_log(msg, ret["msg"])
        return get_error_result("Success",
                                data={
                                    "failed_num": failed_num,
                                    "success_num": success_num
                                })
Example #24
0
 def put(self, request):
     """
     {
         "uuid": "00d4e728-59f8-11ea-972d-000c295dd728",
         "name": "group1",
         "value": {
             "name": "group1",
             "desc": "this is group",
             "start_ip": "172.16.1.20",
             "end_ip": "172.16.1.60"
         }
     }
     """
     try:
         logger.info("update education group")
         data = json.loads(request.body)
     except Exception as e:
         logger.error("get request data error:%s", e)
         return JsonResponse(get_error_result("MessageError"),
                             status=200,
                             json_dumps_params={'ensure_ascii': False})
     try:
         msg = "更新用户分组 %s" % data['name']
         ret = self.update_group(data)
         log_user = {
             "id":
             request.user.id if request.user.id else 1,
             "user_name":
             request.user.username,
             "user_ip":
             request.META.get('HTTP_X_FORWARDED_FOR')
             if request.META.get('HTTP_X_FORWARDED_FOR') else
             request.META.get("REMOTE_ADDR")
         }
         insert_operation_log(msg,
                              ret['msg'],
                              log_user,
                              module="user_group")
     except Exception as e:
         logger.error("update personal group error:%s", e, exc_info=True)
         ret = get_error_result("GroupUpdateError",
                                name=data.get('name', ''))
         insert_operation_log(msg,
                              ret['msg'],
                              log_user,
                              module="user_group")
         return JsonResponse(ret,
                             status=200,
                             json_dumps_params={'ensure_ascii': False})
     return JsonResponse(ret, json_dumps_params={'ensure_ascii': False})
Example #25
0
 def post(self, request):
     ret = get_error_result()
     _data = request.data
     _data.update({"enable": 1})
     ser = YzyRoleSerializer(data=_data, context={'request': request})
     if ser.is_valid():
         ser.save()
     else:
         msg = ser.errors
         ret = get_error_result("ParameterError")
         ret["msg"] = msg
     logger.info("create admin user: %s" % ret)
     msg = "创建角色信息: %s" % _data.get("role")
     insert_operation_log(msg, ret)
     return JSONResponse(ret)
Example #26
0
    def update_name_terminal(self, data):
        """ 修改终端名称 """
        terminals = data.get("terminals", [])
        perfix = data.get("prefix", "")
        postfix = data.get("postfix", "")
        postfix_start = data.get("postfix_start", "")
        use_terminal_id = data.get("use_terminal_id", False)
        if not (terminals and perfix and postfix and postfix_start):
            logger.error("update terminals name param error")
            return get_error_result("ParamError")

        name_list = list()
        _data = dict()
        if use_terminal_id:
            for terminal in terminals:
                mac = terminal["mac"]
                name = terminal["name"]
                terminal_id = terminal["terminal_id"]
                _s = "%" + "0%sd" % postfix
                _n = perfix.upper() + "-" + _s % int(terminal_id)
                _data[mac] = _n
                if name not in name_list:
                    name_list.append(name)
        else:
            for terminal in terminals:
                mac = terminal["mac"]
                name = terminal["name"]
                _s = "%" + "0%sd" % postfix
                _n = perfix.upper() + "-" + _s % postfix_start
                _data[mac] = _n
                postfix_start += 1
                if name not in name_list:
                    name_list.append(name)

        req_data = {
            "handler": "WebTerminalHandler",
            "command": "modify_terminal_name",
            "data": _data
        }
        ret = terminal_post("/api/v1/terminal/task", req_data)
        msg = "修改终端名称 %s" % "/".join(name_list)
        insert_operation_log(msg, ret["msg"])
        if ret.get("code", -1) != 0:
            logger.error("terminal update name fail")
            return ret

        logger.info("terminal update name success!!!")
        return get_error_result("Success")
Example #27
0
 def change_group_check(self, param, log_user=None):
     """
     :param param:
         {
             "desktop_uuid": "",
             "desktop_name": "",
             "group_uuid": "7380f97e-74d3-11ea-b50b-000c29e84b9c"
             "group_name": "group1"
         }
     :return:
     """
     ret = self.change_group(param)
     msg = '桌面组"%s"更换用户组"%s"' % (param['desktop_name'], param['group_name'])
     insert_operation_log(msg,
                          ret['msg'],
                          log_user,
                          module="personal_desktop")
     return ret
Example #28
0
 def delete(self, request):
     _id = request.data.get("id", "")
     role = YzyRole.objects.filter(deleted=False, id=_id).first()
     user = YzyAdminUser.objects.filter(deleted=False, role=_id).first()
     if not role:
         logger.error("role not exist: %s", _id)
         return JSONResponse(get_error_result("UserNotExistError"))
     if user:
         logger.error("the role is already referenced")
         return JSONResponse(get_error_result("RoleAlreadyReferencedError"))
     if user and user.is_superuser:
         logger.error("Super administrator does not allow deletion:%s",
                      role.role)
         return JSONResponse(get_error_result("SuperAdminNotDeleteError"))
     role.delete()
     ret = get_error_result("Success")
     msg = "删除角色信息:%s" % role.role
     insert_operation_log(msg, ret)
     return JSONResponse(ret)
Example #29
0
 def put(self, request):
     _id = request.data.get("id")
     desc = request.data.get("desc", '')
     name = request.data.get("role", '')
     role = YzyRole.objects.filter(deleted=False, id=_id).first()
     if not role:
         logger.error("update role fail: role not exits")
         return JSONResponse(get_error_result("RoleNotExistError"))
     if role.role != name and YzyRole.objects.filter(deleted=False,
                                                     role=name).all():
         logger.error("update role fail: name exits")
         return JSONResponse(get_error_result("NameAlreadyUseError"))
     role.role = name
     role.desc = desc
     role.save()
     ret = get_error_result("Success")
     msg = "更新角色信息:%s" % role.role
     insert_operation_log(msg, ret)
     return JSONResponse(ret)
Example #30
0
    def move_terminal(self, data):
        """ 移动终端
        "data": {
              "terminals": [
                  {"id":  1, "name":  "yzy-01"},
                  {"id":  2, "name":  "yzy-02"},
                  {"id":  3, "name":  "yzy-03"}
              ],
              "group_name": "503办公室",
              "group_uuid": "xxxx-xxx-xxx"
           }
        """
        # terminals = data.get("terminals", "")
        group_uuid = data.get("group_uuid", "")
        if not group_uuid:
            group_uuid = None
        try:
            mac_list, name_list = self.get_terminal_mac_name_list(data)
        except Exception as e:
            logger.error("", exc_info=True)
            return get_error_result("ParamError")

        group = self.get_object_by_uuid(YzyGroup, group_uuid)
        # if not group:
        #     logger.error("terminal move error : %s group not exist"% group_uuid)
        #     return get_error_result("TerminalWebGroupNotExist")
        if group and group.group_type != constants.PERSONAL_TYPE:
            logger.error("terminal move error : %s group not peronal group" %
                         group_uuid)
            return get_error_result("TerminalNotPersonalGroupError")

        terminal_objs = self.get_all_object(YzyTerminal, {"mac": mac_list})
        for terminal in terminal_objs:
            terminal.group_uuid = group_uuid
            terminal.save()
        ret = get_error_result("Success")
        msg = "移动终端: %s 到 %s 分组" % ("/".join(name_list),
                                    group.name if group else "未分组")
        insert_operation_log(msg, ret["msg"])
        logger.error("terminal move success !!!!")
        return ret