Skip to content

Commit f2dfca9

Browse files
author
Xinkai Yi
committed
fix: 调整蓝鲸插件接口信息同步到网关的逻辑 && 蓝鲸插件部署优化 --story=130029401
1 parent 524fee8 commit f2dfca9

23 files changed

Lines changed: 1015 additions & 292 deletions

File tree

bk-plugin-framework/bk_plugin_framework/kit/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
except ImportError:
1515
from pydantic import Field # noqa
1616

17-
from bk_plugin_framework.kit.plugin import Context # noqa
1817
from bk_plugin_framework.kit.plugin import ( # noqa
1918
Callback,
19+
Context,
2020
ContextRequire,
2121
FormModel,
2222
InputsModel,

bk-plugin-framework/bk_plugin_framework/kit/plugin.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020

2121
from bk_plugin_framework.constants import State
2222
from bk_plugin_framework.hub import VersionHub
23-
from bk_plugin_framework.runtime.callback.api import CallbackPreparation, prepare_callback
23+
from bk_plugin_framework.runtime.callback.api import (
24+
CallbackPreparation,
25+
prepare_callback,
26+
)
2427

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

bk-plugin-framework/bk_plugin_framework/runtime/callback/celery/tasks.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
from bk_plugin_framework.envs import settings
2020
from bk_plugin_framework.hub import VersionHub
2121
from bk_plugin_framework.kit import State
22-
from bk_plugin_framework.metrics import BK_PLUGIN_CALLBACK_EXCEPTION_COUNT, BK_PLUGIN_CALLBACK_TIME, HOSTNAME
22+
from bk_plugin_framework.metrics import (
23+
BK_PLUGIN_CALLBACK_EXCEPTION_COUNT,
24+
BK_PLUGIN_CALLBACK_TIME,
25+
HOSTNAME,
26+
)
2327
from bk_plugin_framework.runtime.executor import BKPluginExecutor
2428
from bk_plugin_framework.runtime.schedule.models import Schedule
2529
from bk_plugin_framework.runtime.schedule.utils import get_schedule_lock

bk-plugin-framework/bk_plugin_framework/runtime/executor.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,14 @@
2222

2323
from django.utils.timezone import now
2424

25-
from bk_plugin_framework.kit import Callback, Context, ContextRequire, InputsModel, Plugin, State
25+
from bk_plugin_framework.kit import (
26+
Callback,
27+
Context,
28+
ContextRequire,
29+
InputsModel,
30+
Plugin,
31+
State,
32+
)
2633
from bk_plugin_framework.kit.plugin import PluginCallbackModel
2734
from bk_plugin_framework.metrics import (
2835
BK_PLUGIN_EXECUTE_EXCEPTION_COUNT,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from drf_spectacular.utils import extend_schema_serializer
2+
from rest_framework import serializers
3+
4+
5+
def standard_response_enveloper(serializer_class, many: bool = False):
6+
"""统一响应包装器"""
7+
component_name = "Enveloped{}{}".format(
8+
serializer_class.__name__.replace("Serializer", ""),
9+
"List" if many else "",
10+
)
11+
12+
@extend_schema_serializer(many=False, component_name=component_name)
13+
class EnvelopeSerializer(serializers.Serializer):
14+
code = serializers.IntegerField(help_text="状态码,0表示成功")
15+
data = serializer_class(many=many)
16+
message = serializers.CharField(help_text="响应消息")
17+
result = serializers.BooleanField(help_text="操作结果")
18+
19+
return EnvelopeSerializer

bk-plugin-framework/bk_plugin_framework/services/bpf_service/api/callback.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,50 @@
1414
import traceback
1515

1616
from apigw_manager.apigw.decorators import apigw_require
17+
from apigw_manager.drf.utils import gen_apigateway_resource_config
1718
from blueapps.account.decorators import login_exempt
1819
from django.utils.decorators import method_decorator
19-
from drf_yasg.utils import swagger_auto_schema
20+
from drf_spectacular.utils import extend_schema
21+
from rest_framework import serializers
2022
from rest_framework.decorators import action
2123
from rest_framework.response import Response
2224
from rest_framework.views import APIView
2325

2426
from bk_plugin_framework.runtime.callback.api import callback, parse_callback_token
27+
from bk_plugin_framework.serializers import standard_response_enveloper
2528

2629
logger = logging.getLogger("bk_plugin")
2730

2831

32+
class PluginCallbackParamsSerializer(serializers.Serializer):
33+
token = serializers.CharField(help_text="插件回调token", required=True)
34+
35+
36+
class PluginCallbackResponseSerializer(serializers.Serializer):
37+
result = serializers.BooleanField(help_text="回调结果,True表示成功,False表示失败")
38+
message = serializers.CharField(help_text="回调结果信息", required=False)
39+
40+
2941
@method_decorator(login_exempt, name="dispatch")
3042
@method_decorator(apigw_require, name="dispatch")
3143
class PluginCallback(APIView):
3244
authentication_classes = [] # csrf exempt
3345

34-
@swagger_auto_schema(
35-
method="POST",
36-
operation_summary="plugin callback",
46+
@extend_schema(
47+
exclude=True,
48+
summary="插件回调",
49+
operation_id="callback",
50+
request=PluginCallbackParamsSerializer,
51+
responses={200: standard_response_enveloper(PluginCallbackResponseSerializer)},
52+
extensions=gen_apigateway_resource_config(
53+
is_public=True,
54+
allow_apply_permission=True,
55+
user_verified_required=False,
56+
app_verified_required=True,
57+
resource_permission_required=True,
58+
description_en="plugin callback",
59+
match_subpath=False,
60+
),
3761
)
3862
@action(methods=["POST"], detail=True)
3963
def post(self, request, token):

bk-plugin-framework/bk_plugin_framework/services/bpf_service/api/detail.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@
1111

1212
import logging
1313

14+
from apigw_manager.drf.utils import gen_apigateway_resource_config
1415
from blueapps.account.decorators import login_exempt
1516
from django.utils.decorators import method_decorator
16-
from drf_yasg.utils import swagger_auto_schema
17+
from drf_spectacular.utils import extend_schema
1718
from rest_framework import permissions, serializers, status
1819
from rest_framework.decorators import action
1920
from rest_framework.response import Response
2021
from rest_framework.views import APIView
2122

2223
from bk_plugin_framework.hub import VersionHub
23-
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
24+
from bk_plugin_framework.serializers import standard_response_enveloper
25+
from bk_plugin_framework.services.bpf_service.api.serializers import (
26+
StandardResponseSerializer,
27+
)
2428

2529
logger = logging.getLogger("root")
2630

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

67-
@swagger_auto_schema(
68-
method="GET",
69-
operation_summary="Get plugin detail for specific version",
70-
responses={200: DetailResponseSerializer},
71+
@extend_schema(
72+
exclude=True,
73+
summary="获取指定版本的插件详情",
74+
operation_id="plugin_detail",
75+
responses={200: standard_response_enveloper(DetailResponseSerializer)},
76+
extensions=gen_apigateway_resource_config(
77+
is_public=True,
78+
allow_apply_permission=True,
79+
user_verified_required=True,
80+
app_verified_required=True,
81+
resource_permission_required=True,
82+
description_en="Get plugin detail for specific version",
83+
match_subpath=False,
84+
),
7185
)
7286
@action(methods=["GET"], detail=True)
7387
def get(self, request, version):

bk-plugin-framework/bk_plugin_framework/services/bpf_service/api/invoke.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
import logging
1313

1414
from apigw_manager.apigw.decorators import apigw_require
15+
from apigw_manager.drf.utils import gen_apigateway_resource_config
1516
from blueapps.account.decorators import login_exempt
1617
from django.utils.decorators import method_decorator
17-
from drf_yasg.utils import swagger_auto_schema
18+
from drf_spectacular.utils import extend_schema
1819
from rest_framework import serializers, status
1920
from rest_framework.decorators import action
2021
from rest_framework.exceptions import ValidationError
@@ -23,8 +24,13 @@
2324

2425
from bk_plugin_framework.hub import VersionHub
2526
from bk_plugin_framework.runtime.executor import BKPluginExecutor
26-
from bk_plugin_framework.services.bpf_service.api.permissions import ScopeAllowPermission
27-
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
27+
from bk_plugin_framework.serializers import standard_response_enveloper
28+
from bk_plugin_framework.services.bpf_service.api.permissions import (
29+
ScopeAllowPermission,
30+
)
31+
from bk_plugin_framework.services.bpf_service.api.serializers import (
32+
StandardResponseSerializer,
33+
)
2834

2935
logger = logging.getLogger("bk_plugin")
3036

@@ -52,11 +58,21 @@ class Invoke(APIView):
5258
authentication_classes = [] # csrf exempt
5359
permission_classes = [ScopeAllowPermission]
5460

55-
@swagger_auto_schema(
56-
method="POST",
57-
operation_summary="Invoke specific version plugin",
58-
request_body=InvokeParamsSerializer,
59-
responses={200: InvokeResponseSerializer},
61+
@extend_schema(
62+
exclude=True,
63+
summary="调用指定版本插件",
64+
operation_id="invoke",
65+
request=InvokeParamsSerializer,
66+
responses={200: standard_response_enveloper(InvokeResponseSerializer)},
67+
extensions=gen_apigateway_resource_config(
68+
is_public=True,
69+
allow_apply_permission=True,
70+
user_verified_required=False,
71+
app_verified_required=True,
72+
resource_permission_required=True,
73+
description_en="Invoke specific version plugin",
74+
match_subpath=False,
75+
),
6076
)
6177
@action(methods=["POST"], detail=True)
6278
def post(self, request, version):

bk-plugin-framework/bk_plugin_framework/services/bpf_service/api/logs.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@
1111

1212
import logging
1313

14+
from apigw_manager.drf.utils import gen_apigateway_resource_config
1415
from blueapps.account.decorators import login_exempt
1516
from django.utils.decorators import method_decorator
16-
from drf_yasg.utils import swagger_auto_schema
17+
from drf_spectacular.utils import extend_schema
1718
from rest_framework import permissions, serializers
1819
from rest_framework.decorators import action
1920
from rest_framework.response import Response
2021
from rest_framework.views import APIView
2122

2223
from bk_plugin_framework.runtime.loghub.models import LogEntry
23-
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
24+
from bk_plugin_framework.serializers import standard_response_enveloper
25+
from bk_plugin_framework.services.bpf_service.api.serializers import (
26+
StandardResponseSerializer,
27+
)
2428

2529
logger = logging.getLogger("root")
2630

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

4145
permission_classes = [permissions.AllowAny]
4246

43-
@swagger_auto_schema(
44-
method="GET",
45-
operation_summary="Get plugin execution log with trace_id",
46-
responses={200: LogsResponseSerializer},
47+
@extend_schema(
48+
exclude=True,
49+
summary="获取插件执行日志",
50+
operation_id="plugin_logs",
51+
responses={200: standard_response_enveloper(LogsResponseSerializer)},
52+
extensions=gen_apigateway_resource_config(
53+
is_public=True,
54+
allow_apply_permission=True,
55+
user_verified_required=True,
56+
app_verified_required=True,
57+
resource_permission_required=True,
58+
description_en="Get plugin execution log with trace_id",
59+
match_subpath=False,
60+
),
4761
)
4862
@action(methods=["GET"], detail=True)
4963
def get(self, request, trace_id):

bk-plugin-framework/bk_plugin_framework/services/bpf_service/api/meta.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,22 @@
1212
import logging
1313
from importlib import import_module
1414

15+
from apigw_manager.drf.utils import gen_apigateway_resource_config
1516
from blueapps.account.decorators import login_exempt
1617
from django.conf import settings
1718
from django.utils.decorators import method_decorator
18-
from drf_yasg.utils import swagger_auto_schema
19+
from drf_spectacular.utils import extend_schema
1920
from rest_framework import permissions, serializers
2021
from rest_framework.decorators import action
2122
from rest_framework.response import Response
2223
from rest_framework.views import APIView
2324

2425
from bk_plugin_framework import __version__ as bpf_version
2526
from bk_plugin_framework.hub import VersionHub
26-
from bk_plugin_framework.services.bpf_service.api.serializers import StandardResponseSerializer
27+
from bk_plugin_framework.serializers import standard_response_enveloper
28+
from bk_plugin_framework.services.bpf_service.api.serializers import (
29+
StandardResponseSerializer,
30+
)
2731

2832
logger = logging.getLogger("root")
2933

@@ -58,10 +62,20 @@ class Meta(APIView):
5862

5963
permission_classes = [permissions.AllowAny]
6064

61-
@swagger_auto_schema(
62-
method="GET",
63-
operation_summary="Get plugin meta info",
64-
responses={200: MetaResponseSerializer},
65+
@extend_schema(
66+
exclude=True,
67+
summary="获取插件元信息",
68+
operation_id="plugin_meta_info",
69+
responses={200: standard_response_enveloper(MetaResponseSerializer)},
70+
extensions=gen_apigateway_resource_config(
71+
is_public=True,
72+
allow_apply_permission=True,
73+
user_verified_required=True,
74+
app_verified_required=True,
75+
resource_permission_required=True,
76+
description_en="Get plugin meta info",
77+
match_subpath=False,
78+
),
6579
)
6680
@action(methods=["GET"], detail=True)
6781
def get(self, request):

0 commit comments

Comments
 (0)