예제 #1
0
    def edu_desktop_groups(self, data):
        """ 教学桌面组列表 """
        logger.debug(
            "get education desktop info, terminal_id:%s, terminal_ip:%s",
            data.get("terminal_id", 0), data.get("terminal_ip", ""))
        terminal_id = data.get("terminal_id", 0)
        if not terminal_id:
            logger.error("terminal id param error: %s" % terminal_id)
            return build_result("ParamError")

        terminal_ip = data.get("terminal_ip", "")
        if not is_ip_addr(terminal_ip):
            logger.error("terminal edu desktop group info error, %s not ip" %
                         terminal_ip)
            return build_result("IPAddrError", ipaddr=terminal_ip)

        groups = db_api.get_group_with_all(
            {"group_type": constants.EDUCATION_DESKTOP})
        terminal_group = None
        for group in groups:
            if group.start_ip and group.end_ip:
                if terminal_ip in find_ips(group.start_ip, group.end_ip):
                    terminal_group = group
                    break

        _groups = list()
        if not terminal_group:
            logger.error("terminal group not exist: %s" % terminal_ip)
            return build_result("Success", _groups)

        logger.debug(
            "get education desktop terminal ip: %s, terminal_group: %s",
            terminal_ip, terminal_group.uuid)
        terminal_id = int(terminal_id)
        # 查找分组
        desktops = db_api.get_desktop_with_all({
            "group_uuid": terminal_group.uuid,
            "active": True
        })
        logger.debug("get education desktop terminal ip: %s, desktops_len: %s",
                     terminal_ip, len(desktops))
        for desktop in desktops:
            # 判断是否总数大于序号
            if desktop.instance_num < terminal_id:
                continue

            _d = {
                "uuid": desktop.uuid,
                "name": desktop.name,
                "desc": desktop.template.desc,
                "active": desktop.active,
                "order_num": desktop.order_num,
                "os_type": desktop.os_type
            }
            _groups.append(_d)

        _groups = sorted(_groups, key=lambda _groups: _groups['order_num'])
        logger.debug("edu terminal_ip %s desktop group list: %s" %
                     (terminal_ip, _groups))
        return build_result("Success", _groups)
예제 #2
0
    def terminal_instance_match(self, data):
        """ 所有终端ip对应的桌面ip"""
        # ips = data.get("ips", "")
        # ips = ips.split(",")
        # terminal_ips = list()
        # for i in ips:
        #     if not is_ip_addr(i):
        #         continue
        #     terminal_ips.append(i)
        # items = {}
        groups = db_api.get_group_with_all(
            {"group_type": constants.EDUCATION_DESKTOP})
        group_dict = dict()
        for group in groups:
            start_ip = group.start_ip
            end_ip = group.end_ip
            uuid = group.uuid
            group_dict[uuid] = find_ips(start_ip, end_ip)

        desktop_group_dict = {}
        desktops = db_api.get_desktop_with_all_by_groups(
            list(group_dict.keys()))
        for i in desktops:
            desktop_group_dict[i.uuid] = i.group_uuid

        terminals = list()
        for i in data:
            terminal_ip = i["terminal_ip"]
            if not is_ip_addr(terminal_ip):
                continue
            for uuid, ips in group_dict.items():
                # start_ip = group.start_ip
                # end_ip = group.end_ip
                # if find_ips(start_ip, end_ip)
                if terminal_ip in ips:
                    i["group_uuid"] = uuid
                    terminals.append(i)
                    break

        # 找到所有云桌面
        ret = list()
        instances = db_api.get_instance_with_all(
            {"classify": constants.EDUCATION_DESKTOP})
        for terminal in terminals:
            group_uuid = terminal["group_uuid"]
            terminal_id = terminal["terminal_id"]
            for instance in instances:
                desktop_uuid = instance.desktop_uuid
                _group_uuid = desktop_group_dict.get(desktop_uuid)
                _terminal_id = instance.terminal_id
                _instance_ip = instance.ipaddr
                if _group_uuid == group_uuid and terminal_id == _terminal_id and _instance_ip:
                    terminal["desktop_ip"] = _instance_ip
                    ret.append(terminal)
                    break

        return build_result("Success", ret)
예제 #3
0
    def create_group(self, data):
        """
        创建分组,包括教学分组和用户分组
        """
        if not self._check_params(data):
            return get_error_result("ParamError")

        if constants.EDUCATION_DESKTOP == data.get(
                'group_type', constants.EDUCATION_DESKTOP):
            subnet = db_api.get_subnet_by_uuid(data['subnet_uuid'])
            if not subnet:
                logger.error("subnet: %s not exist", data['subnet_uuid'])
                return get_error_result("SubnetNotExist")

        groups = db_api.get_group_with_all({
            'name': data['name'],
            'group_type': data['group_type']
        })
        if groups:
            return get_error_result("GroupAlreadyExists", name=data['name'])
        # add education group
        group_uuid = create_uuid()
        group_value = {
            "uuid": group_uuid,
            "group_type": data['group_type'],
            "name": data['name'],
            "desc": data['desc'],
            "network_uuid": data.get('network_uuid', ''),
            "subnet_uuid": data.get('subnet_uuid', ''),
            "start_ip": data.get('start_ip', ''),
            "end_ip": data.get('end_ip', '')
        }
        try:
            db_api.create_group(group_value)
            logger.info("create group %s success", data['name'])
        except Exception as e:
            logging.info("insert group info to db failed:%s", e)
            return get_error_result("GroupCreateError", name=data['name'])
        if data['group_type'] == constants.EDUCATION_DESKTOP:
            terminals = db_api.get_terminal_with_all({'group_uuid': None})
            self.change_group_uuid(terminals, data.get('start_ip', ''),
                                   data.get('end_ip', ''), group_uuid)
        return get_error_result("Success", group_value)
예제 #4
0
 def education_group(self, data):
     terminal_ip = data.get("terminal_ip", "")
     if not is_ip_addr(terminal_ip):
         return build_result("ParamError")
     _group = None
     edu_groups = db_api.get_group_with_all(
         {"group_type": constants.EDUCATION_DESKTOP})
     for group in edu_groups:
         start_ip = group.start_ip
         end_ip = group.end_ip
         if terminal_ip in find_ips(start_ip, end_ip):
             _group = group
             break
     if not _group:
         return build_result("Success")
     ret = {
         "name": _group.name,
         "uuid": _group.uuid,
     }
     return build_result("Success", ret)
예제 #5
0
    def terminal_group_list(self, data):
        """
        终端分组
        获取所有分组
        :param data:
        :return:
        """
        items = dict()
        ret = list()
        groups = db_api.get_group_with_all(items)
        for group in groups:
            _d = dict()
            _d["uuid"] = group.uuid
            _d["name"] = group.name
            _d["start_ip"] = group.start_ip
            _d["end_ip"] = group.end_ip
            _d["group_type"] = group.group_type
            ret.append(_d)

        return build_result("Success", ret)
예제 #6
0
 def delete_subnet(self, subnet_uuids):
     """
     删除子网, 批量操作
     :param subnet_uuids:
     :return:
     """
     prompt_info = []
     try:
         for subnet_uuid in subnet_uuids:
             ### 判断子网是否已被占用
             subnet = db_api.get_subnet_by_uuid(subnet_uuid)
             if not subnet:
                 logger.error("subnet: %s not exist", subnet_uuid)
                 return build_result("SubnetNotExist")
             templates = db_api.get_template_with_all({
                 'deleted':
                 False,
                 'subnet_uuid':
                 subnet_uuid
             })
             template_names = list(
                 map(lambda template: template.name, templates))
             if len(template_names) > 0:
                 prompt_info.append("子网 %s 被模板 %s 所引用" %
                                    (subnet.name, ','.join(template_names)))
                 continue
             groups = db_api.get_group_with_all({
                 'deleted': False,
                 'subnet_uuid': subnet_uuid
             })
             groups_names = list(map(lambda group: group.name, groups))
             if len(groups_names) > 0:
                 prompt_info.append("子网 %s 被分组 %s 所引用" %
                                    (subnet.name, ','.join(groups_names)))
                 continue
             desktops = db_api.get_desktop_with_all({
                 'deleted':
                 False,
                 'subnet_uuid':
                 subnet_uuid
             })
             desktop_names = list(
                 map(lambda desktop: desktop.name, desktops))
             if len(desktop_names) > 0:
                 prompt_info.append("子网 %s 被桌面 %s 所引用" %
                                    (subnet.name, ','.join(desktop_names)))
                 continue
             personal_desktops = db_api.get_personal_desktop_with_all({
                 'deleted':
                 False,
                 'subnet_uuid':
                 subnet_uuid
             })
             personal_desktops_names = list(
                 map(lambda personal_desktop: personal_desktop.name,
                     personal_desktops))
             if len(personal_desktops_names) > 0:
                 prompt_info.append(
                     "子网 %s 被桌面 %s 所引用" %
                     (subnet.name, ','.join(personal_desktops_names)))
                 continue
             # 判断子网是否被VOI使用
             voi_templates = db_api.get_voi_template_with_all({
                 'deleted':
                 False,
                 'subnet_uuid':
                 subnet_uuid
             })
             voi_template_names = list(
                 map(lambda template: template.name, voi_templates))
             if len(voi_template_names) > 0:
                 prompt_info.append(
                     "子网 %s 被VOI模板 %s 所引用" %
                     (subnet.name, ','.join(voi_template_names)))
                 continue
             subnet.soft_delete()
         if len(prompt_info) > 0:
             return build_result("SubnetDeleteInfo")
     except Exception as e:
         return build_result("SubnetDeleteFail")
     return build_result("Success")
예제 #7
0
 def person_group(self):
     person_groups = db_api.get_group_with_all(
         {"group_type": constants.PERSONAL_DEKSTOP})
     ret = {"groups": [x.uuid for x in person_groups]}
     return build_result("Success", ret)
예제 #8
0
    def create(self, data):
        """
        创建新学期
        :param data:
        {
           "name": "2020年上学期",
           "start": "2020/09/01",
           "end": "2021/02/01",
           "duration": 45,
           "break_time": 10,
           "morning": "08:00",
           "afternoon": "14:00",
           "evening": "19:00",
           "morning_count": 4,
           "afternoon_count": 4,
           "evening_count": 2,
           "course_num_map": {
               "1": "08:00-08:45",
               "2": "09:00-09:45",
               "3": "10:00-10:45",
               "4": "11:00-11:45",
               "5": "14:00-14:45",
               "6": "15:00-15:45",
               "7": "16:00-16:45",
               "8": "17:00-17:45",
               "9": "19:00-19:45",
               "10": "20:00-20:45"
           }
        }
        :return:
        """
        try:
            logger.info("data: %s" % data)

            check_ret = self._check_course_num_map(data["course_num_map"])
            if check_ret:
                return check_ret

            check_ret = self._check_term_time_detail(data)
            if check_ret:
                return check_ret

            if db_api.get_term_with_first({"name": data["name"]}):
                return get_error_result("TermNameExist")

            # 校验新学期期间是否与已有学期重叠
            check_ret = self._check_term_duplicate(data["start"], data["end"])
            if check_ret:
                return check_ret

            data["uuid"] = create_uuid()
            data["weeks_num_map"] = self._generate_weeks_num_map(
                data["start"], data["end"])

            # 添加学期的定时任务
            task_uuid = self._add_crontab_task(
                term_uuid=data["uuid"],
                name=data["name"],
                start_date=data["start"],
                end_date=data["end"],
                course_num_map=data["course_num_map"],
                weeks_num_map=data["weeks_num_map"])

            if task_uuid:
                data["crontab_task_uuid"] = task_uuid
                data["course_num_map"] = json.dumps(data["course_num_map"])
                data["weeks_num_map"] = json.dumps(data["weeks_num_map"])

                # 新创建学期时,所有教学分组的状态默认为已启用
                group_status_map = dict()
                group_obj_list = db_api.get_group_with_all(
                    {"group_type": constants.EDUCATION_GROUP})
                for group_obj in group_obj_list:
                    group_status_map[
                        group_obj.uuid] = constants.COURSE_SCHEDULE_ENABLED
                data["group_status_map"] = json.dumps(group_status_map)

                db_api.create_term(data)
                logger.info("insert in yzy_term success: %s" % data)
                return get_error_result()
            else:
                logger.info("add course crontab task failed")
                return get_error_result("OtherError")

        except Exception as e:
            logger.exception("create term failed: %s" % str(e), exc_info=True)
            return get_error_result("OtherError")