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成功'))
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成功'))
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成功'))
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成功'))
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成功'))
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})