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}})
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}})
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 }, })
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)
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}})
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 }, })
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))
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]})
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}})
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}})