Beispiel #1
0
    def get_exist_showver_name(self, request, project_id, template_id):
        """查询模板集下所有已经实例化过的可见版本名称"""
        validate_template_id(project_id, template_id)
        # 因为没有回滚操作,需要去掉versioninstance中的is_bcs_success为True
        valid_instance = VersionInstance.objects.filter(template_id=template_id, is_deleted=False)
        show_version_names = valid_instance.values('show_version_name', 'show_version_id')

        data = []
        show_version_name_list = []
        for _show in show_version_names:
            _show_name = _show['show_version_name']
            _show_version_id = _show['show_version_id']
            if _show_name not in show_version_name_list:
                show_version_name_list.append(_show_name)
                # 判断版本下是否还有未删除的资源
                _ins_id_list = valid_instance.filter(show_version_name=_show_name).values_list('id', flat=True)
                is_exists = (
                    InstanceConfig.objects.filter(instance_id__in=_ins_id_list, is_deleted=False, is_bcs_success=True)
                    .exclude(ins_state=InsState.NO_INS.value)
                    .exists()
                )
                if is_exists:
                    data.append(
                        {
                            'id': _show_name,
                            'version': _show_name,
                            'template_id': template_id,
                            'show_version_id': _show_version_id,
                        }
                    )
        # 根据 show_version_id(创建时间) 降序排列
        data = sorted(data, key=lambda x: x['show_version_id'], reverse=True)
        return Response({"code": 0, "message": "OK", "data": {"results": data}})
Beispiel #2
0
 def get_resource_by_show_name(self, request, project_id, template_id):
     validate_template_id(project_id, template_id)
     show_version_name = request.GET.get('show_version_name')
     data = get_res_by_show_name(template_id, show_version_name)
     # 传给前端的资源类型统一
     new_data = {CATE_SHOW_NAME.get(x, x): data[x] for x in data}
     return Response({"code": 0, "message": "OK", "data": {"data": new_data}})
Beispiel #3
0
    def put(self, request, project_id, pk):
        """复制模板"""
        self.request = request

        validate_template_id(project_id, pk, is_return_tempalte=True)

        perm_ctx = TemplatesetPermCtx(username=request.user.username,
                                      project_id=project_id,
                                      template_id=pk)
        self.iam_perm.can_copy(perm_ctx)

        self.project_id = project_id
        self.pk = pk
        data = request.data
        data["project_id"] = project_id
        self.slz = TemplateCreateSLZ(data=data)
        self.slz.is_valid(raise_exception=True)
        new_template_name = self.slz.data["name"]
        # 验证模板名是否已经存在
        is_exist = Template.default_objects.filter(
            name=new_template_name, project_id=project_id).exists()
        if is_exist:
            detail = {"field": [_("模板集名称[{}]已经存在").format(new_template_name)]}
            raise ValidationError(detail=detail)
        # 验证 old模板集id 是否正确
        old_tems = self.get_queryset()
        if not old_tems.exists():
            detail = {"field": [_("要复制的模板集不存在")]}
            raise ValidationError(detail=detail)
        old_tem = old_tems.first()

        username = request.user.username
        template_id, version_id, show_version_id = old_tem.copy_tempalte(
            project_id, new_template_name, username)

        self.iam_perm.grant_resource_creator_actions(
            TemplatesetCreatorAction(template_id=template_id,
                                     name=new_template_name,
                                     project_id=project_id,
                                     creator=username), )

        # 记录操作日志
        request.audit_ctx.update_fields(resource=new_template_name,
                                        resource_id=template_id,
                                        description=_("复制模板集"))
        return Response({
            "code": 0,
            "message": "OK",
            "data": {
                "template_id": template_id,
                "version_id": version_id,
                "show_version_id": show_version_id
            },
        })
Beispiel #4
0
    def post(self, request, project_id, pk):
        self.request = request
        self.project_id = project_id
        self.pk = pk
        template = validate_template_id(project_id,
                                        pk,
                                        is_return_tempalte=True)

        # 验证用户是否有编辑权限
        perm = bcs_perm.Templates(request, project_id, pk, template.name)
        perm.can_edit(raise_exception=True)
        self.perm = perm

        # 检查模板集是否可操作(即未被加锁)
        check_tempalte_available(template, request.user.username)

        # 验证模板名是否已经存在
        new_template_name = request.data.get("name")
        is_exist = (Template.default_objects.exclude(id=pk).filter(
            name=new_template_name, project_id=project_id).exists())
        if is_exist:
            detail = {"field": [_("模板集名称[{}]已经存在").format(new_template_name)]}
            raise ValidationError(detail=detail)

        self.slz = serializers_new.UpdateTemplateSLZ(data=request.data)
        self.slz.is_valid(raise_exception=True)

        return super(SingleTemplateView, self).update(self.slz)
Beispiel #5
0
    def get_exist_version(self, request, project_id, template_id):
        validate_template_id(project_id, template_id)
        show_name_ins_dict = get_ins_by_template_id(template_id)

        # 查询每个版本实例化的数量
        exist_version = {}
        for show_name in show_name_ins_dict:
            ins_id_list = show_name_ins_dict.get(show_name)
            _ins_count = (
                InstanceConfig.objects.filter(instance_id__in=ins_id_list, is_deleted=False, is_bcs_success=True)
                .exclude(ins_state=InsState.NO_INS.value)
                .count()
            )
            if _ins_count > 0:
                exist_version[show_name] = _ins_count
        return Response({"code": 0, "message": "OK", "data": {"exist_version": exist_version}})
Beispiel #6
0
    def put(self, request, project_id, pk):
        """复制模板"""
        self.request = request
        # 验证用户是否使用权限
        template = validate_template_id(project_id,
                                        pk,
                                        is_return_tempalte=True)
        perm = bcs_perm.Templates(request, project_id, pk, template.name)
        perm.can_edit(raise_exception=True)

        self.project_id = project_id
        self.pk = pk
        data = request.data
        data["project_id"] = project_id
        self.slz = TemplateCreateSLZ(data=data)
        self.slz.is_valid(raise_exception=True)
        new_template_name = self.slz.data["name"]
        # 验证模板名是否已经存在
        is_exist = Template.default_objects.filter(
            name=new_template_name, project_id=project_id).exists()
        if is_exist:
            detail = {"field": [_("模板集名称[{}]已经存在").format(new_template_name)]}
            raise ValidationError(detail=detail)
        # 验证 old模板集id 是否正确
        old_tems = self.get_queryset()
        if not old_tems.exists():
            detail = {"field": [_("要复制的模板集不存在")]}
            raise ValidationError(detail=detail)
        old_tem = old_tems.first()

        username = request.user.username
        template_id, version_id, show_version_id = old_tem.copy_tempalte(
            project_id, new_template_name, username)
        # 注册资源到权限中心
        perm.register(template_id, new_template_name)
        # 记录操作日志
        client.ContextActivityLogClient(
            project_id=project_id,
            user=request.user.username,
            resource_type="template",
            resource=new_template_name,
            resource_id=template_id,
            description=_("复制模板集"),
        ).log_add()
        return Response({
            "code": 0,
            "message": "OK",
            "data": {
                "template_id": template_id,
                "version_id": version_id,
                "show_version_id": show_version_id
            },
        })
Beispiel #7
0
    def get(self, request, project_id, pk):
        self.request = request
        self.project_id = project_id
        self.pk = pk

        validate_template_id(project_id, pk, is_return_tempalte=True)

        perm_ctx = TemplatesetPermCtx(username=request.user.username,
                                      project_id=project_id,
                                      template_id=pk)
        self.iam_perm.can_view(perm_ctx)

        # 获取项目类型
        kind = request.project.kind

        tems = self.get_queryset()
        if tems:
            tem = tems.first()
            data = get_template_info(tem, kind)
        else:
            data = {}

        return PermsResponse(data, TemplatesetRequest(project_id=project_id))
Beispiel #8
0
    def get(self, request, project_id, pk):
        self.request = request
        self.project_id = project_id
        self.pk = pk
        template = validate_template_id(project_id,
                                        pk,
                                        is_return_tempalte=True)

        # 获取项目类型
        kind = request.project.kind

        tems = self.get_queryset()
        if tems:
            tem = tems.first()
            data = get_template_info(tem, kind)
        else:
            data = {}
        perm = bcs_perm.Templates(request, project_id, pk, template.name)
        data_list = perm.hook_perms([data])
        return Response({"code": 0, "message": "OK", "data": data_list[0]})
Beispiel #9
0
    def delete(self, request, project_id, pk):
        self.request = request
        self.project_id = project_id
        self.pk = pk
        # 验证用户是否删除权限
        template = validate_template_id(project_id,
                                        pk,
                                        is_return_tempalte=True)
        perm = bcs_perm.Templates(request, project_id, pk, template.name)
        perm.can_delete(raise_exception=True)

        # 检查模板集是否可操作(即未被加锁)
        check_tempalte_available(template, request.user.username)

        # 已经实例化过的版本,不能被删除
        exist_version = is_tempalte_instance(pk)
        if exist_version:
            return Response({
                "code": 400,
                "message": _("模板集已经被实例化过,不能被删除"),
                "data": {}
            })
        instance = self.get_queryset().first()
        with client.ContextActivityLogClient(
                project_id=project_id,
                user=request.user.username,
                resource_type="template",
                resource=instance.name,
                resource_id=instance.id,
                description=_("删除模板集"),
        ).log_delete():
            # 删除后名称添加 [deleted]前缀
            _del_prefix = "[deleted_%s]" % int(time.time())
            del_tem_name = "%s%s" % (_del_prefix, instance.name)
            self.get_queryset().update(name=del_tem_name,
                                       is_deleted=True,
                                       deleted_time=timezone.now())
            # 直接调用delete删除权限中心的资源
            perm.delete()

        return Response({"code": 0, "message": "OK", "data": {"id": pk}})
Beispiel #10
0
    def delete(self, request, project_id, pk):
        self.request = request
        self.project_id = project_id
        self.pk = pk
        # 验证用户是否删除权限
        template = validate_template_id(project_id,
                                        pk,
                                        is_return_tempalte=True)

        perm_ctx = TemplatesetPermCtx(username=request.user.username,
                                      project_id=project_id,
                                      template_id=pk)
        self.iam_perm.can_delete(perm_ctx)

        # 检查模板集是否可操作(即未被加锁)
        check_template_available(template, request.user.username)

        # 已经实例化过的版本,不能被删除
        exist_version = is_tempalte_instance(pk)
        if exist_version:
            return Response({
                "code": 400,
                "message": _("模板集已经被实例化过,不能被删除"),
                "data": {}
            })
        instance = self.get_queryset().first()

        request.audit_ctx.update_fields(resource=instance.name,
                                        resource_id=instance.id,
                                        description=_("删除模板集"))

        # 删除后名称添加 [deleted]前缀
        _del_prefix = f"[deleted_{int(time.time())}]"
        del_tem_name = f"{_del_prefix}{instance.name}"
        self.get_queryset().update(name=del_tem_name,
                                   is_deleted=True,
                                   deleted_time=timezone.now())

        return Response({"code": 0, "message": "OK", "data": {"id": pk}})