Skip to content

Commit b4837fb

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

File tree

10 files changed

+119
-16
lines changed

10 files changed

+119
-16
lines changed

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

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
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.models import AppCache, Cluster, DBModule
1820
from backend.db_services.cmdb.exceptions import BkAppAttrAlreadyExistException
1921
from backend.db_services.dbconfig.dataclass import DBBaseConfig, DBConfigLevelData
2022
from backend.db_services.dbconfig.handlers import DBConfigHandler
@@ -221,3 +223,63 @@ def get_or_create_set_with_name(bk_biz_id: int, bk_set_name: str) -> int:
221223
raise err
222224
else:
223225
return bk_set_id
226+
227+
228+
def filter_by_biz_name(data: list, biz_name: str) -> list:
229+
return [biz for biz in data if biz["bk_biz_name"] == biz_name]
230+
231+
232+
def filter_by_module_name(data: list, module_name: str) -> list:
233+
result = []
234+
for biz in data:
235+
filtered_modules = [module for module in biz["modules"] if module["module_name"] == module_name]
236+
if filtered_modules:
237+
new_biz = biz.copy()
238+
new_biz["modules"] = filtered_modules
239+
result.append(new_biz)
240+
return result
241+
242+
243+
def list_biz_module_trees(cluster_types: str, bk_biz_name: str, module_name: str) -> List[Dict]:
244+
"""
245+
获取业务与模块维度集群数量
246+
"""
247+
248+
clusters = (
249+
Cluster.objects.filter(cluster_type__in=cluster_types.split(","))
250+
.values("db_module_id", "bk_biz_id")
251+
.annotate(count=Count("db_module_id"))
252+
.order_by("-count")
253+
)
254+
255+
db_module_map = DBModule.db_module_map()
256+
id_to_name = AppCache.id_to_name()
257+
258+
nested_data = collections.defaultdict(lambda: {"count": 0, "modules": collections.defaultdict(int)})
259+
for cluster in clusters:
260+
bk_biz_id = cluster["bk_biz_id"]
261+
db_module_id = cluster["db_module_id"]
262+
count = cluster["count"]
263+
nested_data[bk_biz_id]["count"] += count
264+
nested_data[bk_biz_id]["modules"][db_module_id] = count
265+
266+
final_data = []
267+
for bk_biz_id, data in nested_data.items():
268+
modules = [
269+
{"module_name": db_module_map.get(module_id), "module_id": module_id, "count": count}
270+
for module_id, count in data["modules"].items()
271+
]
272+
final_data.append(
273+
{
274+
"bk_biz_name": id_to_name.get(bk_biz_id),
275+
"bk_biz_id": bk_biz_id,
276+
"count": data["count"],
277+
"modules": modules,
278+
}
279+
)
280+
281+
if bk_biz_name:
282+
final_data = filter_by_biz_name(final_data, bk_biz_name)
283+
if module_name:
284+
final_data = filter_by_module_name(final_data, module_name)
285+
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_types = serializers.CharField(help_text=_("集群类型(逗号分隔)"))
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_types = self.params_validate(self.get_serializer_class()).get("cluster_types")
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_types, bk_biz_name, module_name), many=True
115+
)
116+
return Response(serializer.data)

dbm-ui/backend/flow/engine/bamboo/scene/mysql/mysql_ha_standardize_flow.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ def standardize(self):
6363
增加单据临时ADMIN账号的添加和删除逻辑
6464
"""
6565
cluster_ids = self.data["infos"]["cluster_ids"]
66-
bk_biz_id = self.data["bk_biz_id"]
66+
# 支持跨业务
67+
# bk_biz_id = self.data["bk_biz_id"]
6768

6869
cluster_objects = Cluster.objects.filter(
69-
pk__in=cluster_ids, bk_biz_id=bk_biz_id, cluster_type=ClusterType.TenDBHA.value
70+
pk__in=cluster_ids, cluster_type=ClusterType.TenDBHA.value
7071
).prefetch_related(
7172
"proxyinstance_set", "storageinstance_set", "proxyinstance_set__machine", "storageinstance_set__machine"
7273
)

dbm-ui/backend/flow/engine/bamboo/scene/spider/spider_cluster_standardize_flow.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,11 @@ def standardize(self):
6161
}
6262
"""
6363
cluster_ids = self.data["infos"]["cluster_ids"]
64-
bk_biz_id = self.data["bk_biz_id"]
64+
# 支持跨业务
65+
# bk_biz_id = self.data["bk_biz_id"]
6566

6667
cluster_objects = Cluster.objects.filter(
67-
pk__in=cluster_ids, bk_biz_id=bk_biz_id, cluster_type=ClusterType.TenDBCluster.value
68+
pk__in=cluster_ids, cluster_type=ClusterType.TenDBCluster.value
6869
).prefetch_related(
6970
"proxyinstance_set",
7071
"storageinstance_set",

dbm-ui/backend/flow/engine/bamboo/scene/tendbsingle/standardize.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ def __init__(self, root_id: str, data: Optional[Dict]):
5050

5151
def standardize(self):
5252
cluster_ids = self.data["infos"]["cluster_ids"]
53-
bk_biz_id = self.data["bk_biz_id"]
53+
# 支持跨业务
54+
# bk_biz_id = self.data["bk_biz_id"]
5455

5556
cluster_objects = Cluster.objects.filter(
56-
pk__in=cluster_ids, bk_biz_id=bk_biz_id, cluster_type=ClusterType.TenDBSingle.value
57+
pk__in=cluster_ids, cluster_type=ClusterType.TenDBSingle.value
5758
).prefetch_related("storageinstance_set", "storageinstance_set__machine")
5859
if cluster_objects.count() != len(cluster_ids):
5960
raise DBMetaException(

dbm-ui/backend/ticket/builders/mysql/mysql_ha_standardize.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from rest_framework import serializers
1515

1616
from backend.db_meta.enums import ClusterType, InstanceInnerRole
17-
from backend.db_meta.models import AppCache, Cluster
17+
from backend.db_meta.models import Cluster
1818
from backend.flow.engine.controller.mysql import MySQLController
1919
from backend.ticket import builders
2020
from backend.ticket.builders.mysql.base import BaseMySQLHATicketFlowBuilder, MySQLBaseOperateDetailSerializer
@@ -25,15 +25,16 @@ class TenDBHAStandardizeDetailSerializer(MySQLBaseOperateDetailSerializer):
2525
class HAStandardizeDetailSerializer(serializers.Serializer):
2626
cluster_ids = serializers.ListField(help_text=_("集群ID列表"))
2727

28-
bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
28+
# 支持跨业务,bk_biz_id不需要传
29+
# bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
2930
infos = HAStandardizeDetailSerializer(help_text=_("标准化信息"))
3031

3132
def validate(self, attrs):
3233
self.__validate_clusters(attrs=attrs)
3334
return attrs
3435

3536
def __validate_clusters(self, attrs):
36-
AppCache.objects.get(bk_biz_id=attrs["bk_biz_id"])
37+
# AppCache.objects.get(bk_biz_id=attrs["bk_biz_id"])
3738

3839
for cluster_obj in Cluster.objects.filter(pk__in=attrs["infos"]["cluster_ids"]).all():
3940
if cluster_obj.cluster_type != ClusterType.TenDBHA.value:

dbm-ui/backend/ticket/builders/spider/mysql_spider_standardize.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from rest_framework import serializers
1515

1616
from backend.db_meta.enums import ClusterType
17-
from backend.db_meta.models import AppCache, Cluster
17+
from backend.db_meta.models import Cluster
1818
from backend.flow.engine.controller.spider import SpiderController
1919
from backend.ticket import builders
2020
from backend.ticket.builders.tendbcluster.base import BaseTendbTicketFlowBuilder, TendbBaseOperateDetailSerializer
@@ -25,15 +25,16 @@ class TenDBClusterStandardizeDetailSerializer(TendbBaseOperateDetailSerializer):
2525
class InnerDetailSerializer(serializers.Serializer):
2626
cluster_ids = serializers.ListField(help_text=_("集群ID列表"))
2727

28-
bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
28+
# 支持跨业务,不需要传bk_biz_id
29+
# bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
2930
infos = InnerDetailSerializer(help_text=_("标准化信息"))
3031

3132
def validate(self, attrs):
3233
self.__validate_clusters(attrs=attrs)
3334
return attrs
3435

3536
def __validate_clusters(self, attrs):
36-
AppCache.objects.get(bk_biz_id=attrs["bk_biz_id"])
37+
# AppCache.objects.get(bk_biz_id=attrs["bk_biz_id"])
3738

3839
for cluster_obj in Cluster.objects.filter(pk__in=attrs["infos"]["cluster_ids"]).all():
3940
if cluster_obj.cluster_type != ClusterType.TenDBCluster.value:

dbm-ui/backend/ticket/builders/tendbsingle/standardize.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from rest_framework import serializers
1313

1414
from backend.db_meta.enums import ClusterType
15-
from backend.db_meta.models import AppCache, Cluster
15+
from backend.db_meta.models import Cluster
1616
from backend.flow.engine.controller.tendbsingle import TenDBSingleController
1717
from backend.ticket import builders
1818
from backend.ticket.builders.mysql.base import BaseMySQLTicketFlowBuilder, MySQLBaseOperateDetailSerializer
@@ -23,7 +23,8 @@ class TenDBSingleStandardizeDetailSerializer(MySQLBaseOperateDetailSerializer):
2323
class InnerDetailSerializer(serializers.Serializer):
2424
cluster_ids = serializers.ListField(help_text=_("集群ID列表"))
2525

26-
bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
26+
# 支持跨业务区域,不需要传bk_biz_id
27+
# bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
2728
infos = InnerDetailSerializer(help_text=_("标准化信息"))
2829

2930
def validate(self, attrs):
@@ -32,7 +33,7 @@ def validate(self, attrs):
3233

3334
@staticmethod
3435
def __validate_clusters(attrs):
35-
AppCache.objects.get(bk_biz_id=attrs["bk_biz_id"])
36+
# AppCache.objects.get(bk_biz_id=attrs["bk_biz_id"])
3637

3738
for cluster_obj in Cluster.objects.filter(pk__in=attrs["infos"]["cluster_ids"]).all():
3839
if cluster_obj.cluster_type != ClusterType.TenDBSingle.value:

0 commit comments

Comments
 (0)