Ejemplo n.º 1
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
         }
     })
Ejemplo n.º 2
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(SingleTempalteView, self).update(self.slz)
Ejemplo n.º 3
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': ['{prefix_msg}[{tmpl_name}]{suffix_msg}'.format(
                    prefix_msg=_("模板集名称"),
                    tmpl_name=new_template_name,
                    suffix_msg=_("已经存在")
                )]
            }
            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,
            }
        })
Ejemplo n.º 4
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
            }
        })
Ejemplo n.º 5
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
            }
        })
Ejemplo n.º 6
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=u"删除模板集"
        ).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
            }
        })
Ejemplo n.º 7
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_tempate_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]})