Ejemplo n.º 1
0
    def check_create(self, task):
        using_status = Env.ActiveStatusList

        # 当前题目使用的环境
        using_task_envs = task.envs.filter(env__status__in=using_status)

        # 检查是否已创建环境
        if using_task_envs.filter(**self.group_filter_params).exists():
            raise MsgException(error.TASK_ENV_EXIST)

        # 检查环境数量是否已满
        using_envs = Env.objects.filter(status__in=using_status)
        if using_envs.count(
        ) >= self.base_handler.creater_class.get_all_env_limit():
            raise MsgException(error.FULL_ENV_CAPACITY)
Ejemplo n.º 2
0
    def get_env(self, template_env):
        test_env_map = self.get_test_env_map(template_env)
        if not test_env_map or not test_env_map.test_env or \
            test_env_map.test_env.status not in Env.ActiveStatusList:
            raise MsgException(error.TEST_ENV_NOT_EXIST)

        return test_env_map.test_env
Ejemplo n.º 3
0
    def _run_script(self, client, cmd):
        cmd = cmd.encode('utf-8')

        stdin, stdout, stderr = client.exe(cmd)
        err = stderr.readlines()
        if err:
            raise MsgException("%s %s" % (error.RUN_SCRIPT_ERROR, err))
Ejemplo n.º 4
0
    def _check_task(self, task, envterminal):
        # checker_path = self._get_checker_script_path(task, envterminal)
        # if checker_path is None or not os.path.exists(checker_path):
        #     raise MsgException(error.CHECK_SCRIPT_PATH_NULL)
        #
        # try:
        #     script_module = imp.load_source('xctf_checker_script', checker_path)
        #     result = script_module.checker(envterminal.float_ip, self.get_env_service_port(envterminal))
        # except Exception, e:
        #     raise e
        # return result
        task_env = self.get_task_env(task)
        docker_envterminal = task_env.env.envterminal_set.filter(
            sub_id=envterminal.checker).first()
        if not envterminal:
            raise MsgException(error.ENVTERMINAL_NOT_EXIST)

        try:
            # 上传checker文件到checker机器上
            self._upload_checker_file(task, envterminal, docker_envterminal)

            # rpc调用checker
            result = checker(docker_envterminal.float_ip, "/home/checker.py",
                             envterminal.float_ip,
                             self.get_env_service_port(envterminal))

        except Exception as e:
            logger.info("check error msg[%s]", str(e))
            return None

        return result
Ejemplo n.º 5
0
 def get_task_env(self, task, raise_exception=True):
     using_task_envs = task.envs.filter(
         env__status__in=Env.ActiveStatusList)
     task_env = using_task_envs.filter(**self.group_filter_params).first()
     if raise_exception and not task_env:
         raise MsgException(error.TASK_ENV_NOT_EXIST)
     return task_env
Ejemplo n.º 6
0
    def get_lesson_env(self, lesson):
        template_lesson_env = self.get_template_lesson_env(lesson)
        using_lesson_envs = lesson.envs.filter(
            env__status__in=Env.ActiveStatusList)

        # 由于页面没有配置小组环境,没有小组模板环境,显式查询是否有小组环境
        lesson_env = using_lesson_envs.filter(type=LessonEnv.Type.GROUP,
                                              group_users=self.user).first()
        if lesson_env:
            return lesson_env

        using_lesson_envs = using_lesson_envs.filter(
            type=template_lesson_env.type)

        if template_lesson_env.type == LessonEnv.Type.PRIVATE:
            lesson_env = using_lesson_envs.filter(
                **self.group_filter_params).first()
        else:
            lesson_env = using_lesson_envs.filter(
                shared_users=self.user).first()

        if not lesson_env:
            raise MsgException(error.LESSON_ENV_NOT_EXIST)

        return lesson_env
Ejemplo n.º 7
0
    def check_create(self, template_env):
        using_status = Env.ActiveStatusList

        test_env_map = self.get_test_env_map(template_env)
        # 检查自己环境是否已存在
        if test_env_map and test_env_map.test_env and test_env_map.test_env.status in using_status:
            raise MsgException(error.TEST_ENV_EXIST)

        # 检查环境数量是否已满
        using_envs = Env.objects.filter(status__in=using_status)
        if using_envs.count() >= self.base_handler.creater_class.get_all_env_limit():
            raise MsgException(error.FULL_ENV_CAPACITY)

        # 检查自己环境数量是否已满
        my_using_envs = using_envs.filter(user=self.user)
        if my_using_envs.count() >= self.base_handler.creater_class.get_person_env_limit():
            raise MsgException(error.FULL_PERSONAL_ENV_CAPACITY)

        return test_env_map
Ejemplo n.º 8
0
    def execute_script(self, task, envterminal_sub_id, mode):
        if not self.base_handler.is_admin:
            raise MsgException(error.NO_PERMISSION)

        mode_exec = {
            2: self._init_task,
            3: self._clean_task,
            4: self._push_flag,
            5: self._check_task,
        }

        if mode not in mode_exec:
            raise MsgException(error.NO_PERMISSION)

        task_env = self.get_task_env(task)
        envterminal = task_env.env.envterminal_set.filter(
            sub_id=envterminal_sub_id).first()
        if not envterminal:
            raise MsgException(error.ENVTERMINAL_NOT_EXIST)
        return mode_exec[mode](task, envterminal)
Ejemplo n.º 9
0
    def delay(self, task):
        task_env = self.get_task_env(task)

        if task_env.env.status not in Env.UsingStatusList or not task_env.destroy_time:
            raise MsgException(error.NO_PERMISSION)

        left_time = datetime.timedelta(minutes=15)
        delay_time = datetime.timedelta(hours=1)
        # only fewer than 15 minites can delay
        if task_env.destroy_time < timezone.now() or task_env.destroy_time > timezone.now() + left_time:
            raise MsgException(error.NO_PERMISSION)

        task_env.destroy_time = task_env.destroy_time + delay_time
        try:
            task_env.save()
        except Exception as e:
            logger.error('delay taskenv[env_id=%s] error: %s', task_env.id, e)
            raise e

        return task_env
Ejemplo n.º 10
0
    def get_task_env(self, task):
        template_task_env = self.get_template_task_env(task)
        using_task_envs = task.envs.filter(type=template_task_env.type, env__status__in=Env.ActiveStatusList)
        if template_task_env.type == TaskEnv.Type.PRIVATE:
            task_env = using_task_envs.filter(**self.group_filter_params).first()
        else:
            task_env = using_task_envs.filter(shared_users=self.user).first()

        if not task_env:
            raise MsgException(error.TASK_ENV_NOT_EXIST)

        return task_env
Ejemplo n.º 11
0
    def check_create(self, task):
        template_task_env = self.get_template_task_env(task)

        using_status = Env.ActiveStatusList

        # 当前环境类型使用的环境
        using_type_task_envs = task.envs.filter(type=template_task_env.type, env__status__in=using_status)
        # 所有正在使用的场景
        using_envs = Env.objects.filter(status__in=using_status)

        if template_task_env.type == TaskEnv.Type.PRIVATE:
            # 检查是否已存在私有环境
            if using_type_task_envs.filter(**self.group_filter_params).exists():
                raise MsgException(error.TASK_ENV_EXIST)
            # 检查总体环境数量是否已满
            if using_envs.count() >= self.base_handler.creater_class.get_all_env_limit():
                raise MsgException(error.FULL_ENV_CAPACITY)
            if not self.team:
                # 检查个人环境数量是否已满
                my_using_envs = using_envs.filter(user=self.user)
                # 由于共享环境/队伍环境存在,需排除所有共享环境/队伍环境
                if my_using_envs.count() - self.base_handler.creater_class.get_ignored_using_env_count(self.user) >= self.base_handler.creater_class.get_person_env_limit():
                    raise MsgException(error.FULL_PERSONAL_ENV_CAPACITY)
        elif template_task_env.type == TaskEnv.Type.SHARED:
            # 检查是否已存在共享给自己的环境
            if using_type_task_envs.filter(shared_users=self.user).exists():
                raise MsgException(error.TASK_ENV_EXIST)

            # 如果已存在未共享给自己的共享环境, 由于只会添加共享引用不会创建场景, 所以不需要检查数量限制
            task_env = using_type_task_envs.first()
            if task_env:
                # 直接返回无需创建的存在的共享环境
                return template_task_env, task_env
            else:
                # 检查环境数量是否已满
                if using_envs.count() >= self.base_handler.creater_class.get_all_env_limit():
                    raise MsgException(error.FULL_ENV_CAPACITY)
                    # 共享环境不检查个人环境数量是否已满
        else:
            raise MsgException(error.NO_PERMISSION)

        return template_task_env, None
Ejemplo n.º 12
0
 def get_template_task_env(self, task):
     template_task_env = task.envs.filter(
         env__status=Env.Status.TEMPLATE).first()
     if not template_task_env:
         raise MsgException(error.TASK_ENV_NOT_CONFIGURED)
     return template_task_env
Ejemplo n.º 13
0
 def get_template_lesson_env(self, lesson):
     template_lesson_env = lesson.envs.filter(
         env__status=Env.Status.TEMPLATE).first()
     if not template_lesson_env:
         raise MsgException(error.LESSON_ENV_NOT_CONFIGURED)
     return template_lesson_env
Ejemplo n.º 14
0
 def _check_team(self):
     # 不检查管理员
     if self.team and not self.base_handler.is_admin:
         if self.user.team != self.team:
             raise MsgException(error.NO_PERMISSION)