Пример #1
0
    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)
Пример #2
0
 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)
Пример #3
0
 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)
Пример #4
0
    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))
Пример #5
0
    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)
Пример #6
0
    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()
Пример #7
0
    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)
Пример #8
0
    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()
Пример #9
0
 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)
Пример #10
0
    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()
Пример #11
0
 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)
Пример #12
0
 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()
Пример #13
0
 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)
Пример #14
0
 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)