def update(self, request, project_id, cluster_id, crd_name, custom_obj_name): """更新自定义资源""" params = self.params_validate(slzs.UpdateCustomObjectSLZ, context={ 'crd_name': crd_name, 'ctx_cluster': request.ctx_cluster }) namespace = params.get('namespace') self._validate_perm(request.user.username, project_id, cluster_id, namespace, DashboardAction.Update) self._update_audit_ctx(request, namespace, crd_name, custom_obj_name) client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) manifest = params['manifest'] # 自定义资源 Replace 也需要指定 resourceVersion # 这里先 pop,通过在 replace 指定 auto_add_version=True 添加 manifest['metadata'].pop('resourceVersion', None) try: response_data = client.replace( body=manifest, namespace=namespace, name=custom_obj_name, is_format=False, auto_add_version=True).data.to_dict() except DynamicApiError as e: raise UpdateResourceError(_('更新资源失败: {}').format(e.summary())) except ValueError as e: raise UpdateResourceError(_('更新资源失败: {}').format(str(e))) return Response(response_data)
def get_custom_object(self, request, project_id, cluster_id, crd_name, name): cobj_client = get_cobj_client_by_crd( ClusterAuth(request.user.token.access_token, project_id, cluster_id), crd_name) cobj_dict = cobj_client.get( namespace=request.query_params.get("namespace"), name=name) return Response(cobj_dict)
def retrieve(self, request, project_id, cluster_id, crd_name, custom_obj_name): """ 获取单个自定义对象 """ params = self.params_validate(slzs.FetchCustomObjectSLZ) client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) response_data = RetrieveApiRespBuilder( client, namespace=params.get('namespace'), name=custom_obj_name, formatter=CustomObjectCommonFormatter() ).build() web_annotations = gen_base_web_annotations(request, project_id, cluster_id) return BKAPIResponse(response_data, web_annotations=web_annotations)
def list_custom_objects(self, request, project_id, cluster_id, crd_name): cluster_auth = ClusterAuth(request.user.token.access_token, project_id, cluster_id) crd_client = CustomResourceDefinition(cluster_auth) crd = crd_client.get(name=crd_name, is_format=False) if not crd: raise error_codes.ResNotFoundError(_("集群({})中未注册自定义资源({})").format(cluster_id, crd_name)) cobj_client = get_cobj_client_by_crd(cluster_auth, crd_name) cobj_list = cobj_client.list(namespace=request.query_params.get("namespace")) return Response(to_table_format(crd.to_dict(), cobj_list, cluster_id=cluster_id))
def destroy(self, request, project_id, cluster_id, crd_name, custom_obj_name): """ 删除自定义资源 """ validate_cluster_perm(request, project_id, cluster_id) params = self.params_validate(slzs.DestroyCustomObjectSLZ) namespace = params.get('namespace') or None self._update_audit_ctx(request, namespace, crd_name, custom_obj_name) client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) try: response_data = client.delete(name=custom_obj_name, namespace=namespace).to_dict() except DynamicApiError as e: raise DeleteResourceError(_('删除资源失败: {}').format(e.summary())) return Response(response_data)
def patch_custom_object(self, request, project_id, cluster_id, crd_name, name): serializer = PatchCustomObjectSLZ(data=request.data) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data cobj_client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) cobj_client.patch( name=name, namespace=validated_data.get("namespace"), body=validated_data["body"], content_type=validated_data["patch_type"], ) return Response()
def create(self, request, project_id, cluster_id, crd_name): """ 创建自定义资源 """ validate_cluster_perm(request, project_id, cluster_id) params = self.params_validate(slzs.CreateCustomObjectSLZ) namespace = getitems(params, 'manifest.metadata.namespace') cus_obj_name = getitems(params, 'manifest.metadata.name') self._update_audit_ctx(request, namespace, crd_name, cus_obj_name) client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) try: response_data = client.create(namespace=namespace, body=params['manifest'], is_format=False).data.to_dict() except DynamicApiError as e: raise CreateResourceError(_('创建资源失败: {}').format(e.summary())) except ValueError as e: raise CreateResourceError(_('创建资源失败: {}').format(str(e))) return Response(response_data)
def patch_custom_object_scale(self, request, project_id, cluster_id, crd_name, name): req_data = request.data.copy() req_data["crd_name"] = crd_name serializer = PatchCustomObjectScaleSLZ(data=req_data) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data cobj_client = get_cobj_client_by_crd( ClusterAuth(request.user.token.access_token, project_id, cluster_id), crd_name ) cobj_client.patch( name=name, namespace=validated_data.get("namespace"), body=validated_data["body"], content_type=validated_data["patch_type"], ) return Response()
def list(self, request, project_id, cluster_id, crd_name): """获取某类自定义资源列表""" params = self.params_validate(slzs.ListCustomObjectSLZ, context={ 'crd_name': crd_name, 'ctx_cluster': request.ctx_cluster }) client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) namespace = params.get('namespace') self._validate_perm(request.user.username, project_id, cluster_id, namespace, DashboardAction.View) response_data = ListApiRespBuilder( client, formatter=CustomObjectCommonFormatter(), namespace=namespace).build() web_annotations = gen_cobj_web_annotations(request, project_id, cluster_id, namespace, crd_name) return BKAPIResponse(response_data, web_annotations=web_annotations)
def batch_delete_custom_objects(self, request, project_id, cluster_id, crd_name): serializer = BatchDeleteCustomObjectsSLZ(data=request.data) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data cobj_client = get_cobj_client_by_crd( ClusterAuth(request.user.token.access_token, project_id, cluster_id), crd_name ) failed_list = [] namespace = validated_data["namespace"] for name in validated_data["cobj_name_list"]: try: cobj_client.delete_ignore_nonexistent(namespace=namespace, name=name) except Exception: failed_list.append(name) if failed_list: raise error_codes.APIError(_("部分资源删除失败,失败列表: {}").format(",".join(failed_list))) return Response()
def retrieve(self, request, project_id, cluster_id, crd_name, custom_obj_name): """获取单个自定义对象""" params = self.params_validate(slzs.FetchCustomObjectSLZ, context={ 'crd_name': crd_name, 'ctx_cluster': request.ctx_cluster }) client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) namespace = params.get('namespace') self._validate_perm(request.user.username, project_id, cluster_id, namespace, DashboardAction.View) response_data = RetrieveApiRespBuilder( client, namespace=namespace, name=custom_obj_name, formatter=CustomObjectCommonFormatter()).build() web_annotations = gen_base_web_annotations(request.user.username, project_id, cluster_id, namespace) return BKAPIResponse(response_data, web_annotations=web_annotations)
def delete_custom_object(self, request, project_id, cluster_id, crd_name, name): cobj_client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) cobj_client.delete_ignore_nonexistent( namespace=request.query_params.get("namespace"), name=name) return Response()
def get_custom_object(self, request, project_id, cluster_id, crd_name, name): cobj_client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) cobj_dict = cobj_client.get( namespace=request.query_params.get("namespace"), name=name) return Response(cobj_dict)
def list(self, request, project_id, cluster_id, crd_name): """ 获取某类自定义资源列表 """ client = get_cobj_client_by_crd(request.ctx_cluster, crd_name) response_data = ListApiRespBuilder(client, formatter=CustomObjectCommonFormatter()).build() web_annotations = gen_cobj_web_annotations(request, project_id, cluster_id, crd_name) return BKAPIResponse(response_data, web_annotations=web_annotations)