Skip to content

Commit 237fb51

Browse files
committed
feat(backend): 集群标准化需求新增业务模块导航与mysql单节点、主从集群列表汇总接口 #6628
# Reviewed, transaction id: 17931
1 parent e06613a commit 237fb51

File tree

7 files changed

+151
-3
lines changed

7 files changed

+151
-3
lines changed

dbm-ui/backend/db_services/cmdb/biz.py

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212
import logging
1313
from typing import Dict, List
1414

15+
from django.db.models import Count
16+
1517
from backend.components import CCApi
1618
from backend.components.dbconfig.constants import DEPLOY_FILE_NAME, ConfType, LevelName
17-
from backend.db_meta.models import AppCache, DBModule
19+
from backend.db_meta.enums import ClusterType
20+
from backend.db_meta.models import AppCache, Cluster, DBModule
1821
from backend.db_services.cmdb.exceptions import BkAppAttrAlreadyExistException
1922
from backend.db_services.dbconfig.dataclass import DBBaseConfig, DBConfigLevelData
2023
from backend.db_services.dbconfig.handlers import DBConfigHandler
@@ -221,3 +224,70 @@ def get_or_create_set_with_name(bk_biz_id: int, bk_set_name: str) -> int:
221224
raise err
222225
else:
223226
return bk_set_id
227+
228+
229+
def filter_by_biz_name(data: list, biz_name: str) -> list:
230+
return [biz for biz in data if biz["bk_biz_name"] == biz_name]
231+
232+
233+
def filter_by_module_name(data: list, module_name: str) -> list:
234+
result = []
235+
for biz in data:
236+
filtered_modules = [module for module in biz["modules"] if module["module_name"] == module_name]
237+
if filtered_modules:
238+
new_biz = biz.copy()
239+
new_biz["modules"] = filtered_modules
240+
result.append(new_biz)
241+
return result
242+
243+
244+
def list_biz_module_trees(cluster_type: str, bk_biz_name: str, module_name: str) -> List[Dict]:
245+
"""
246+
获取业务与模块维度集群数量
247+
"""
248+
if cluster_type in [ClusterType.TenDBSingle, ClusterType.TenDBHA]:
249+
clusters = (
250+
Cluster.objects.filter(cluster_type__in=[ClusterType.TenDBSingle, ClusterType.TenDBHA])
251+
.values("db_module_id", "bk_biz_id")
252+
.annotate(count=Count("db_module_id"))
253+
.order_by("-count")
254+
)
255+
else:
256+
clusters = (
257+
Cluster.objects.filter(cluster_type=cluster_type)
258+
.values("db_module_id", "bk_biz_id")
259+
.annotate(count=Count("db_module_id"))
260+
.order_by("-count")
261+
)
262+
263+
db_module_map = DBModule.db_module_map()
264+
id_to_name = AppCache.id_to_name()
265+
266+
nested_data = collections.defaultdict(lambda: {"count": 0, "modules": collections.defaultdict(int)})
267+
for cluster in clusters:
268+
bk_biz_id = cluster["bk_biz_id"]
269+
db_module_id = cluster["db_module_id"]
270+
count = cluster["count"]
271+
nested_data[bk_biz_id]["count"] += count
272+
nested_data[bk_biz_id]["modules"][db_module_id] = count
273+
274+
final_data = []
275+
for bk_biz_id, data in nested_data.items():
276+
modules = [
277+
{"module_name": db_module_map.get(module_id), "module_id": module_id, "count": count}
278+
for module_id, count in data["modules"].items()
279+
]
280+
final_data.append(
281+
{
282+
"bk_biz_name": id_to_name.get(bk_biz_id),
283+
"bk_biz_id": bk_biz_id,
284+
"count": data["count"],
285+
"modules": modules,
286+
}
287+
)
288+
289+
if bk_biz_name:
290+
final_data = filter_by_biz_name(final_data, bk_biz_name)
291+
if module_name:
292+
final_data = filter_by_module_name(final_data, module_name)
293+
return final_data

dbm-ui/backend/db_services/cmdb/serializers.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,21 @@ class ListNodesSerializer(TopoSerializer):
7979
page = serializers.IntegerField(help_text=_("页数"))
8080
module_id = serializers.IntegerField(help_text=_("模块ID"), required=False)
8181
set_id = serializers.IntegerField(help_text=_("集群ID"), required=False)
82+
83+
84+
class ListBIZModulesSLZ(serializers.Serializer):
85+
cluster_type = serializers.ChoiceField(help_text=_("集群类型"), choices=ClusterType.get_choices())
86+
bk_biz_name = serializers.CharField(help_text=_("业务名称"), required=False)
87+
module_name = serializers.CharField(help_text=_("模块名称"), required=False)
88+
89+
90+
class BIZModuleSLZ(serializers.Serializer):
91+
class ModuleClusterCountSLZ(serializers.Serializer):
92+
module_name = serializers.CharField(help_text=_("模块名"))
93+
module_id = serializers.IntegerField(help_text=_("模块ID"))
94+
count = serializers.IntegerField(help_text=_("集群数量"))
95+
96+
bk_biz_name = serializers.CharField(help_text=_("业务名"))
97+
bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
98+
count = serializers.IntegerField(help_text=_("集群数量"))
99+
modules = serializers.ListField(help_text=_("模块信息"), child=ModuleClusterCountSLZ())

dbm-ui/backend/db_services/cmdb/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
urlpatterns = [
1717
path("bizs/", CMDBViewSet.as_view({"get": "list_bizs"})),
1818
path("bizs/<int:bk_biz_id>/modules/", CMDBViewSet.as_view({"get": "list_modules"})),
19+
path("biz_module_trees/", CMDBViewSet.as_view({"get": "list_biz_module_trees"})),
1920
]
2021

2122
routers = DefaultRouter(trailing_slash=True)

dbm-ui/backend/db_services/cmdb/views.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,19 @@ def set_db_app_abbr(self, request, bk_biz_id):
9898
@action(methods=["GET"], detail=True)
9999
def list_cc_obj_user(self, request, bk_biz_id):
100100
return Response(biz.list_cc_obj_user(bk_biz_id))
101+
102+
@common_swagger_auto_schema(
103+
operation_summary=_("业务模块树信息"),
104+
query_serializer=serializers.ListBIZModulesSLZ(),
105+
responses={status.HTTP_200_OK: serializers.BIZModuleSLZ(label=_("业务模块树信息"), many=True)},
106+
tags=[SWAGGER_TAG],
107+
)
108+
@action(methods=["GET"], detail=False, serializer_class=serializers.ListBIZModulesSLZ)
109+
def list_biz_module_trees(self, request):
110+
cluster_type = self.params_validate(self.get_serializer_class()).get("cluster_type")
111+
bk_biz_name = self.params_validate(self.get_serializer_class()).get("bk_biz_name")
112+
module_name = self.params_validate(self.get_serializer_class()).get("module_name")
113+
serializer = serializers.BIZModuleSLZ(
114+
biz.list_biz_module_trees(cluster_type, bk_biz_name, module_name), many=True
115+
)
116+
return Response(serializer.data)

dbm-ui/backend/db_services/dbbase/resources/serializers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,10 @@ class ListTendbClusterMachineResourceSLZ(ListMachineSLZ):
152152
spider_role = serializers.ChoiceField(
153153
help_text=_("spider角色"), choices=TenDBClusterSpiderRole.get_choices(), required=False
154154
)
155+
156+
157+
class SearchMySQLResourceSLZ(serializers.Serializer):
158+
cluster_type = serializers.ChoiceField(help_text=_("集群类型"), choices=ClusterType.get_choices(), required=False)
159+
immute_domain = serializers.CharField(help_text=_("访问入口"), required=False)
160+
status = serializers.ChoiceField(help_text=_("状态"), choices=ClusterStatus.get_choices(), required=False)
161+
db_module_id = serializers.IntegerField(help_text=_("模块ID"), required=False)

dbm-ui/backend/db_services/mysql/resources/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from .tendbcluster.views import SpiderViewSet
1515
from .tendbha.views import DBHAViewSet
1616
from .tendbsingle.views import DBSingleViewSet
17-
from .views import ListResourceViewSet, ResourceTreeViewSet
17+
from .views import ListResourceViewSet, ResourceTreeViewSet, TendbResourceViewSet
1818

1919
router = DefaultRouter(trailing_slash=True)
2020

@@ -26,6 +26,7 @@
2626
# 提供资源(集群)通用属性的查询, 如集群名, 集群创建者等
2727
path("resources/", ListResourceViewSet.as_view({"get": "list"})),
2828
path("resource_tree/", ResourceTreeViewSet.as_view({"get": "get_resource_tree"})),
29+
path("tendb_resource/", TendbResourceViewSet.as_view({"get": "get_tendb_resource"})),
2930
]
3031

3132
urlpatterns += router.urls

dbm-ui/backend/db_services/mysql/resources/views.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717

1818
from backend.bk_web.swagger import common_swagger_auto_schema
1919
from backend.bk_web.viewsets import SystemViewSet
20+
from backend.db_meta.enums import ClusterType
2021
from backend.db_meta.models.cluster import Cluster
2122
from backend.db_meta.models.db_module import DBModule
2223
from backend.db_services.dbbase.resources.constants import ResourceNodeType
23-
from backend.db_services.dbbase.resources.serializers import SearchResourceTreeSLZ
24+
from backend.db_services.dbbase.resources.serializers import SearchMySQLResourceSLZ, SearchResourceTreeSLZ
2425
from backend.db_services.dbbase.resources.views import BaseListResourceViewSet
2526
from backend.db_services.dbbase.resources.yasg_slz import ResourceTreeSLZ
2627
from backend.db_services.mysql.resources import constants
@@ -84,3 +85,37 @@ def get_resource_tree(self, request, bk_biz_id):
8485
for db_module in db_module_qset
8586
]
8687
return Response(tree)
88+
89+
90+
class TendbResourceViewSet(SystemViewSet):
91+
pagination_class = None
92+
93+
action_permission_map = {}
94+
default_permission_class = [DBManagePermission()]
95+
96+
@common_swagger_auto_schema(
97+
operation_summary=_("获取tendb集群"),
98+
query_serializer=SearchMySQLResourceSLZ(),
99+
tags=[constants.RESOURCE_TAG],
100+
)
101+
def get_tendb_resource(self, request, bk_biz_id):
102+
cluster_type = self.params_validate(SearchMySQLResourceSLZ).get("cluster_type")
103+
immute_domain = self.params_validate(SearchMySQLResourceSLZ).get("immute_domain")
104+
status = self.params_validate(SearchMySQLResourceSLZ).get("status")
105+
db_module_id = self.params_validate(SearchMySQLResourceSLZ).get("db_module_id")
106+
107+
query_params = {"bk_biz_id": bk_biz_id}
108+
query_params.update({"cluster_type": cluster_type}) if cluster_type else None
109+
query_params.update({"immute_domain": immute_domain}) if immute_domain else None
110+
query_params.update({"status": status}) if status else None
111+
query_params.update({"db_module_id": db_module_id}) if db_module_id else None
112+
113+
cluster_qset = Cluster.objects.filter(cluster_type__in=[ClusterType.TenDBSingle, ClusterType.TenDBHA]).filter(
114+
**query_params
115+
)
116+
db_module_map = DBModule.db_module_map()
117+
data_list = [cluster.to_dict() for cluster in cluster_qset]
118+
for data in data_list:
119+
data["db_module_name"] = db_module_map.get(data["db_module_id"])
120+
121+
return Response(data_list)

0 commit comments

Comments
 (0)