Ejemplo n.º 1
0
    def recreate(self, request, project_id, metric_id):
        """重新创建
        1. 有操作权限
        2. 检查状态为pause
        3. 重新下发配置
        """
        ref = self.get_metric_info(project_id, metric_id)
        # 校验权限
        perm = bcs_perm.Metric(request, project_id, bcs_perm.NO_RES)
        perm.can_create(raise_exception=True)
        # 状态校验
        if ref.status != PAUSE:
            raise error_codes.APIError(_('metric不为暂停状态,不允许操作!'))
        else:
            ref.update_status('normal')
        if not request.project['cc_app_id']:
            raise error_codes.APIError(_('项目没有绑定业务,不允许操作!'))

        # 重新下发配置
        tasks.set_metric.delay(
            request.user.token.access_token,
            project_id,
            request.project['kind'],
            metric_id,
            ns_id_list=request.data.get('ns_id_list', []),
        )

        return BKAPIResponse({'metric_id': ref.pk}, message=_('创建metric成功'))
Ejemplo n.º 2
0
    def delete(self, request, project_id, metric_id):
        """删除
        注意: 添加一个暂停的操作,这个暂停的含义包含
        1. 调用接口删除metric
        2. 更新记录状态为pause状态
        """
        ref = self.get_metric_info(project_id, metric_id)

        # 校验权限
        perm = bcs_perm.Metric(request, project_id, metric_id, ref.name)
        perm.can_delete(raise_exception=True)

        data = dict(request.data)
        op_type = data.get('op_type')
        ns_id_list = data.get('ns_id_list') or []
        tasks.delete_metric.delay(
            request.user.token.access_token,
            project_id,
            request.project['kind'],
            metric_id,
            op_type=op_type,
            ns_id_list=ns_id_list,
        )
        # 针对暂停操作,添加 op_type 参数
        if op_type == PAUSE:
            ref.update_status(PAUSE)
        else:
            ref.soft_delete()
            perm.delete()

        return BKAPIResponse({}, message=_('删除metric成功'))
Ejemplo n.º 3
0
    def put(self, request, project_id, metric_id):
        """更新put"""
        serializer = serializers.UpdateMetricSLZ(data=request.data,
                                                 context={
                                                     'request': request,
                                                     'project_id': project_id
                                                 })
        serializer.is_valid(raise_exception=True)

        queryset = MetricModel.objects.filter(project_id=project_id,
                                              pk=metric_id)
        ref = queryset.first()
        if not ref:
            raise error_codes.ResNotFoundError(_('metric不存在'))

        # metric_type 不可变,创建是已经申请了dataid,编辑时不能编辑dataid的属性
        if ref.metric_type != serializer.data.get('metric_type', ''):
            raise error_codes.APIError(_('Metric 类型不可更改'))

        # 校验权限
        perm = bcs_perm.Metric(request, project_id, metric_id, ref.name)
        perm.can_edit(raise_exception=True)

        # 更新version
        queryset.update(updator=request.user.username,
                        version=ref.update_version(),
                        **serializer.data)

        # 异步下发metric
        tasks.set_metric.delay(request.user.token.access_token, project_id,
                               request.project['kind'], metric_id)

        return BKAPIResponse({}, message=_('修改metric成功'))
Ejemplo n.º 4
0
    def get(self, request, project_id, metric_id):
        """获取metric"""
        ref = MetricModel.objects.filter(project_id=project_id, pk=metric_id).first()
        if not ref:
            raise error_codes.ResNotFoundError(_('metric不存在'))

        # 校验权限
        perm = bcs_perm.Metric(request, project_id, metric_id, ref.name)
        perm.can_use(raise_exception=True)

        return BKAPIResponse(ref.to_json(), message=_('获取metric成功'))
Ejemplo n.º 5
0
    def create(self, request, project_id):
        """创建metric
        """
        cc_app_id = request.project.get('cc_app_id')
        if not cc_app_id:
            raise error_codes.APIError(_('必须绑定业务'))

        serializer = serializers.CreateMetricSLZ(data=request.data,
                                                 context={
                                                     'request': request,
                                                     'project_id': project_id
                                                 })
        serializer.is_valid(raise_exception=True)

        # 校验权限
        perm = bcs_perm.Metric(request, project_id, bcs_perm.NO_RES)
        perm.can_create(raise_exception=True)

        dataset = get_metric_data_name(serializer.data['name'], project_id)

        metric_type = serializer.data['metric_type']
        if metric_type == 'prometheus':
            # prometheus 申请dataid的时候同时配置默认的清洗规则
            username = request.user.username
            english_name = request.project.english_name
            is_ok, data_id = create_prometheus_data_flow(
                username, project_id, cc_app_id, english_name, dataset)
            err_msg = data_id
        else:
            is_ok, data_id = apply_dataid_by_metric(cc_app_id, dataset,
                                                    request.user.username)
            err_msg = _('申请data_id失败')

        if not is_ok:
            raise error_codes.APIError(err_msg)

        ref = MetricModel(creator=request.user.username,
                          updator=request.user.username,
                          data_id=data_id,
                          project_id=project_id,
                          **serializer.data)
        ref.save()

        # 创建资源
        perm.register(ref.id, ref.name)

        return BKAPIResponse({'metric_id': ref.pk}, message=_('创建metric成功'))
Ejemplo n.º 6
0
    def list(self, request, project_id):
        """获取metric列表"""
        refs = MetricModel.objects.filter(project_id=project_id).order_by('-updated')
        data = [i.to_json() for i in refs]

        # 过滤有使用权限的命名空间
        perm_can_use = request.GET.get('perm_can_use')
        if perm_can_use == '1':
            perm_can_use = True
        else:
            perm_can_use = False
        perm = bcs_perm.Metric(request, project_id, bcs_perm.NO_RES)
        data = perm.hook_perms(data, perm_can_use)

        # 返回是否有创建权限
        can_create = perm.can_create(raise_exception=False)

        return BKAPIResponse(data, message=_('获取metric列表成功'), permissions={'create': can_create})