Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
dc03ec8
fix: 调整蓝鲸插件接口信息同步到网关的逻辑 && 蓝鲸插件部署优化 --story=130029401
Jan 19, 2026
1d88622
fix: 修改bk_plugin_framework的pyproject.toml文件 --story=130029401
Jan 19, 2026
c165619
fix: 修改bk_plugin_runtime的 pyproject.toml相关依赖 --story=130029401
Jan 19, 2026
d5499bf
fix: 增加drf_spectacular第三方依赖包支持可编程网关 --story=130029401
Jan 19, 2026
2fa87ae
fix: 修改bk-plugin-framework 的 tag 版本 --story=130029401
Jan 19, 2026
f562014
fix: 移除django-environ 导入
Jan 19, 2026
921a12b
fix: 修改 runtime 的pyproject.toml文件 --story=130029401
Jan 19, 2026
0fda61d
minor: framework release 2.3.4rc3
Jan 19, 2026
d875aaa
fix: 修改插件框架中的bk-plugin-framework版本 --story=130029401
Jan 19, 2026
bbfd28a
fix: pre-commit 调试代码格式规范 --story=130029401
Jan 19, 2026
c8fef64
minor: runtime release 2.1.3rc3
Jan 19, 2026
b323bbd
minor: framework release 2.1.4rc4
Jan 19, 2026
9ee447b
fix: 移除脚手架中多余的 celery 版本指定 --story=130029401
Jan 19, 2026
74e3c9f
fix: 修改脚手架中的 app_desc.yaml脚本 --story=130029401
Jan 19, 2026
53506e9
fix: 调整脚手架的app_desc文件配置 --story=130029401
Jan 20, 2026
a7dbe78
fix: 调整网关环境变量配置根据部署环境动态引入 --story=130029401
Jan 20, 2026
5374d2e
minor: framework release V2.3.4rc5
Jan 20, 2026
03a80b9
fix: 修改当前的视图接口同步到网关的逻辑 --story=130029514
Jan 20, 2026
f1eef0c
minor: framework release V2.3.4rc6
Jan 20, 2026
91e07ab
fix: 修改 runtime 中的 pyproject.toml文件 --story=130029514
Jan 20, 2026
10fc9de
fix: pre-commit 调整文件格式 --story=130029514
Jan 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bk-plugin-framework/bk_plugin_framework/kit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
except ImportError:
from pydantic import Field # noqa

from bk_plugin_framework.kit.plugin import Context # noqa
from bk_plugin_framework.kit.plugin import ( # noqa
Callback,
Context,
ContextRequire,
FormModel,
InputsModel,
Expand Down
5 changes: 4 additions & 1 deletion bk-plugin-framework/bk_plugin_framework/kit/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@

from bk_plugin_framework.constants import State
from bk_plugin_framework.hub import VersionHub
from bk_plugin_framework.runtime.callback.api import CallbackPreparation, prepare_callback
from bk_plugin_framework.runtime.callback.api import (
CallbackPreparation,
prepare_callback,
)

VALID_VERSION_PATTERN = re.compile(r"^[0-9]+\.[0-9]+\.[0-9][a-z0-9]*$")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@
from bk_plugin_framework.envs import settings
from bk_plugin_framework.hub import VersionHub
from bk_plugin_framework.kit import State
from bk_plugin_framework.metrics import BK_PLUGIN_CALLBACK_EXCEPTION_COUNT, BK_PLUGIN_CALLBACK_TIME, HOSTNAME
from bk_plugin_framework.metrics import (
BK_PLUGIN_CALLBACK_EXCEPTION_COUNT,
BK_PLUGIN_CALLBACK_TIME,
HOSTNAME,
)
from bk_plugin_framework.runtime.executor import BKPluginExecutor
from bk_plugin_framework.runtime.schedule.models import Schedule
from bk_plugin_framework.runtime.schedule.utils import get_schedule_lock
Expand Down
9 changes: 8 additions & 1 deletion bk-plugin-framework/bk_plugin_framework/runtime/executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,14 @@

from django.utils.timezone import now

from bk_plugin_framework.kit import Callback, Context, ContextRequire, InputsModel, Plugin, State
from bk_plugin_framework.kit import (
Callback,
Context,
ContextRequire,
InputsModel,
Plugin,
State,
)
from bk_plugin_framework.kit.plugin import PluginCallbackModel
from bk_plugin_framework.metrics import (
BK_PLUGIN_EXECUTE_EXCEPTION_COUNT,
Expand Down
19 changes: 19 additions & 0 deletions bk-plugin-framework/bk_plugin_framework/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from drf_spectacular.utils import extend_schema_serializer
from rest_framework import serializers


def standard_response_enveloper(serializer_class, many: bool = False):
"""统一响应包装器"""
component_name = "Enveloped{}{}".format(
serializer_class.__name__.replace("Serializer", ""),
"List" if many else "",
)

@extend_schema_serializer(many=False, component_name=component_name)
class EnvelopeSerializer(serializers.Serializer):
code = serializers.IntegerField(help_text="状态码,0表示成功")
data = serializer_class(many=many)
message = serializers.CharField(help_text="响应消息")
result = serializers.BooleanField(help_text="操作结果")

return EnvelopeSerializer
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,50 @@
import traceback

from apigw_manager.apigw.decorators import apigw_require
from apigw_manager.drf.utils import gen_apigateway_resource_config
from blueapps.account.decorators import login_exempt
from django.utils.decorators import method_decorator
from drf_yasg.utils import swagger_auto_schema
from drf_spectacular.utils import extend_schema
from rest_framework import serializers
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.views import APIView

from bk_plugin_framework.runtime.callback.api import callback, parse_callback_token
from bk_plugin_framework.serializers import standard_response_enveloper

logger = logging.getLogger("bk_plugin")


class PluginCallbackParamsSerializer(serializers.Serializer):
token = serializers.CharField(help_text="插件回调token", required=True)


class PluginCallbackResponseSerializer(serializers.Serializer):
result = serializers.BooleanField(help_text="回调结果,True表示成功,False表示失败")
message = serializers.CharField(help_text="回调结果信息", required=False)


@method_decorator(login_exempt, name="dispatch")
@method_decorator(apigw_require, name="dispatch")
class PluginCallback(APIView):
authentication_classes = [] # csrf exempt

@swagger_auto_schema(
method="POST",
operation_summary="plugin callback",
@extend_schema(
exclude=True,
summary="插件回调",
operation_id="callback",
request=PluginCallbackParamsSerializer,
responses={200: standard_response_enveloper(PluginCallbackResponseSerializer)},
extensions=gen_apigateway_resource_config(
is_public=True,
allow_apply_permission=True,
user_verified_required=False,
app_verified_required=True,
resource_permission_required=True,
description_en="plugin callback",
match_subpath=False,
),
)
@action(methods=["POST"], detail=True)
def post(self, request, token):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,20 @@

import logging

from apigw_manager.drf.utils import gen_apigateway_resource_config
from blueapps.account.decorators import login_exempt
from django.utils.decorators import method_decorator
from drf_yasg.utils import swagger_auto_schema
from drf_spectacular.utils import extend_schema
from rest_framework import permissions, serializers, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.views import APIView

from bk_plugin_framework.hub import VersionHub
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
from bk_plugin_framework.serializers import standard_response_enveloper
from bk_plugin_framework.services.bpf_service.api.serializers import (
StandardResponseSerializer,
)

logger = logging.getLogger("root")

Expand Down Expand Up @@ -64,10 +68,20 @@ class DetailFormsSerializer(serializers.Serializer):
class Detail(APIView):
permission_classes = [permissions.AllowAny]

@swagger_auto_schema(
method="GET",
operation_summary="Get plugin detail for specific version",
responses={200: DetailResponseSerializer},
@extend_schema(
exclude=True,
summary="获取指定版本的插件详情",
operation_id="plugin_detail",
responses={200: standard_response_enveloper(DetailResponseSerializer)},
extensions=gen_apigateway_resource_config(
is_public=True,
allow_apply_permission=True,
user_verified_required=True,
app_verified_required=True,
resource_permission_required=True,
description_en="Get plugin detail for specific version",
match_subpath=False,
),
)
@action(methods=["GET"], detail=True)
def get(self, request, version):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
import logging

from apigw_manager.apigw.decorators import apigw_require
from apigw_manager.drf.utils import gen_apigateway_resource_config
from blueapps.account.decorators import login_exempt
from django.utils.decorators import method_decorator
from drf_yasg.utils import swagger_auto_schema
from drf_spectacular.utils import extend_schema
from rest_framework import serializers, status
from rest_framework.decorators import action
from rest_framework.exceptions import ValidationError
Expand All @@ -23,8 +24,13 @@

from bk_plugin_framework.hub import VersionHub
from bk_plugin_framework.runtime.executor import BKPluginExecutor
from bk_plugin_framework.services.bpf_service.api.permissions import ScopeAllowPermission
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
from bk_plugin_framework.serializers import standard_response_enveloper
from bk_plugin_framework.services.bpf_service.api.permissions import (
ScopeAllowPermission,
)
from bk_plugin_framework.services.bpf_service.api.serializers import (
StandardResponseSerializer,
)

logger = logging.getLogger("bk_plugin")

Expand Down Expand Up @@ -52,11 +58,21 @@ class Invoke(APIView):
authentication_classes = [] # csrf exempt
permission_classes = [ScopeAllowPermission]

@swagger_auto_schema(
method="POST",
operation_summary="Invoke specific version plugin",
request_body=InvokeParamsSerializer,
responses={200: InvokeResponseSerializer},
@extend_schema(
exclude=True,
summary="调用指定版本插件",
operation_id="invoke",
request=InvokeParamsSerializer,
responses={200: standard_response_enveloper(InvokeResponseSerializer)},
extensions=gen_apigateway_resource_config(
is_public=True,
allow_apply_permission=True,
user_verified_required=False,
app_verified_required=True,
resource_permission_required=True,
description_en="Invoke specific version plugin",
match_subpath=False,
),
)
@action(methods=["POST"], detail=True)
def post(self, request, version):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,20 @@

import logging

from apigw_manager.drf.utils import gen_apigateway_resource_config
from blueapps.account.decorators import login_exempt
from django.utils.decorators import method_decorator
from drf_yasg.utils import swagger_auto_schema
from drf_spectacular.utils import extend_schema
from rest_framework import permissions, serializers
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.views import APIView

from bk_plugin_framework.runtime.loghub.models import LogEntry
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
from bk_plugin_framework.serializers import standard_response_enveloper
from bk_plugin_framework.services.bpf_service.api.serializers import (
StandardResponseSerializer,
)

logger = logging.getLogger("root")

Expand All @@ -40,10 +44,20 @@ class Logs(APIView):

permission_classes = [permissions.AllowAny]

@swagger_auto_schema(
method="GET",
operation_summary="Get plugin execution log with trace_id",
responses={200: LogsResponseSerializer},
@extend_schema(
exclude=True,
summary="获取插件执行日志",
operation_id="plugin_logs",
responses={200: standard_response_enveloper(LogsResponseSerializer)},
extensions=gen_apigateway_resource_config(
is_public=True,
allow_apply_permission=True,
user_verified_required=True,
app_verified_required=True,
resource_permission_required=True,
description_en="Get plugin execution log with trace_id",
match_subpath=False,
),
)
@action(methods=["GET"], detail=True)
def get(self, request, trace_id):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,22 @@
import logging
from importlib import import_module

from apigw_manager.drf.utils import gen_apigateway_resource_config
from blueapps.account.decorators import login_exempt
from django.conf import settings
from django.utils.decorators import method_decorator
from drf_yasg.utils import swagger_auto_schema
from drf_spectacular.utils import extend_schema
from rest_framework import permissions, serializers
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.views import APIView

from bk_plugin_framework import __version__ as bpf_version
from bk_plugin_framework.hub import VersionHub
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
from bk_plugin_framework.serializers import standard_response_enveloper
from bk_plugin_framework.services.bpf_service.api.serializers import (
StandardResponseSerializer,
)

logger = logging.getLogger("root")

Expand Down Expand Up @@ -58,10 +62,20 @@ class Meta(APIView):

permission_classes = [permissions.AllowAny]

@swagger_auto_schema(
method="GET",
operation_summary="Get plugin meta info",
responses={200: MetaResponseSerializer},
@extend_schema(
exclude=True,
summary="获取插件元信息",
operation_id="plugin_meta_info",
responses={200: standard_response_enveloper(MetaResponseSerializer)},
extensions=gen_apigateway_resource_config(
is_public=True,
allow_apply_permission=True,
user_verified_required=True,
app_verified_required=True,
resource_permission_required=True,
description_en="Get plugin meta info",
match_subpath=False,
),
)
@action(methods=["GET"], detail=True)
def get(self, request):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,25 @@
from urllib.parse import urlsplit

from apigw_manager.apigw.decorators import apigw_require
from apigw_manager.drf.utils import gen_apigateway_resource_config
from blueapps.account.decorators import login_exempt
from django.test import RequestFactory
from django.urls import Resolver404, resolve
from django.utils.decorators import method_decorator
from drf_yasg.utils import swagger_auto_schema
from drf_spectacular.utils import extend_schema
from rest_framework import serializers, status
from rest_framework.decorators import action
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_framework.views import APIView

from bk_plugin_framework.services.bpf_service.api.permissions import ScopeAllowPermission
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
from bk_plugin_framework.serializers import standard_response_enveloper
from bk_plugin_framework.services.bpf_service.api.permissions import (
ScopeAllowPermission,
)
from bk_plugin_framework.services.bpf_service.api.serializers import (
StandardResponseSerializer,
)

logger = logging.getLogger("bk_plugin")

Expand Down Expand Up @@ -73,11 +79,21 @@ class PluginAPIDispatch(APIView):
authentication_classes = [] # csrf exempt
permission_classes = [ScopeAllowPermission]

@swagger_auto_schema(
method="POST",
operation_summary="Plugin API dispatch",
request_body=PluginAPIDispatchParamsSerializer,
responses={200: PluginAPIDispatchResponseSerializer},
@extend_schema(
exclude=True,
summary="插件API分发",
operation_id="plugin_api_dispatch",
request=PluginAPIDispatchParamsSerializer,
responses={200: standard_response_enveloper(PluginAPIDispatchResponseSerializer)},
extensions=gen_apigateway_resource_config(
is_public=True,
allow_apply_permission=True,
user_verified_required=False,
app_verified_required=True,
resource_permission_required=True,
description_en="Plugin API dispatch",
match_subpath=False,
),
)
@action(methods=["POST"], detail=True)
def post(self, request):
Expand Down
Loading