Skip to content

Commit 2523c31

Browse files
committed
fix(backend): mysql、大数据规格为空处理 #8807
1 parent 73f7af7 commit 2523c31

File tree

2 files changed

+81
-5
lines changed
  • dbm-ui/backend/db_services

2 files changed

+81
-5
lines changed

dbm-ui/backend/db_services/bigdata/resources/query.py

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@
1212
from operator import itemgetter
1313
from typing import Any, Dict, List
1414

15-
from django.db.models import Count, F, Q
15+
from django.db.models import Count, F, Q, QuerySet
16+
from django.forms import model_to_dict
1617
from django.utils.translation import ugettext_lazy as _
1718

18-
from backend.db_meta.models import AppCache
19+
from backend.db_meta.enums.spec import SpecClusterType
20+
from backend.db_meta.models import AppCache, Spec
1921
from backend.db_meta.models.cluster import Cluster
2022
from backend.db_meta.models.instance import StorageInstance
2123
from backend.db_proxy.models import ClusterExtension
2224
from backend.db_services.dbbase.resources import query
25+
from backend.db_services.dbbase.resources.query import ResourceList
2326
from backend.db_services.ipchooser.query.resource import ResourceQueryHelper
2427
from backend.ticket.constants import TICKET_RUNNING_STATUS_SET
2528
from backend.ticket.models import InstanceOperateRecord
@@ -108,7 +111,7 @@ def _to_cluster_representation(
108111
cloud_info: Dict[str, Any],
109112
biz_info: AppCache,
110113
cluster_stats_map: Dict[str, Dict[str, int]],
111-
**kwargs
114+
**kwargs,
112115
) -> Dict[str, Any]:
113116
"""集群序列化"""
114117
# 获取集群基本信息
@@ -127,6 +130,32 @@ def _to_cluster_representation(
127130
# 获取集群访问url
128131
cluster_info.update(access_url=ClusterExtension.get_cluster_service_url(cluster))
129132

133+
# 补充cluster_spec参数,需展示多个角色规格,只返回spec_name字段
134+
spec_name_parts = []
135+
136+
for instance_role in cls.instance_roles:
137+
# 获取当前角色的 storages
138+
instance_role_storages = [
139+
storage for storage in cluster.storages if storage.instance_role == instance_role
140+
]
141+
142+
# 如果存在 storage, 获取对应的规格
143+
if instance_role_storages:
144+
spec_id = instance_role_storages[0].machine.spec_id
145+
spec = kwargs["remote_spec_map"].get(spec_id)
146+
else:
147+
spec = None
148+
149+
if spec:
150+
cluster_spec = model_to_dict(spec)
151+
spec_name_parts.append(f"{cluster_spec['spec_name']}({instance_role})")
152+
153+
# 合并所有的规格信息
154+
spec_name = " , ".join(spec_name_parts)
155+
156+
# 更新cluster信息
157+
cluster_info["cluster_spec"] = {"spec_name": spec_name}
158+
130159
# 获取集群角色信息
131160
for role in cls.instance_roles:
132161
inst_role_infos = [inst.simple_desc for inst in cluster.storages if inst.instance_role == role]
@@ -242,3 +271,27 @@ def _to_nodes_list(
242271
# 对创建时间或者实例数量进行排序
243272

244273
return query.ResourceList(count=count, data=paginated_group_list)
274+
275+
@classmethod
276+
def _filter_cluster_hook(
277+
cls,
278+
bk_biz_id,
279+
cluster_queryset: QuerySet,
280+
proxy_queryset: QuerySet,
281+
storage_queryset: QuerySet,
282+
limit: int,
283+
offset: int,
284+
**kwargs,
285+
) -> ResourceList:
286+
# 预取remote的spec
287+
remote_spec_map = {spec.spec_id: spec for spec in Spec.objects.filter(spec_cluster_type=SpecClusterType.Doris)}
288+
return super()._filter_cluster_hook(
289+
bk_biz_id,
290+
cluster_queryset,
291+
proxy_queryset,
292+
storage_queryset,
293+
limit,
294+
offset,
295+
remote_spec_map=remote_spec_map,
296+
**kwargs,
297+
)

dbm-ui/backend/db_services/mysql/resources/tendbha/query.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
from typing import Any, Callable, Dict, List
1212

1313
from django.db.models import F, Q, QuerySet
14+
from django.forms import model_to_dict
1415
from django.utils.translation import ugettext_lazy as _
1516

1617
from backend.db_meta.api.cluster.tendbha.detail import scan_cluster
1718
from backend.db_meta.enums import ClusterEntryRole, InstanceInnerRole
1819
from backend.db_meta.enums.cluster_type import ClusterType
19-
from backend.db_meta.models import AppCache, StorageInstance
20+
from backend.db_meta.enums.spec import SpecClusterType
21+
from backend.db_meta.models import AppCache, Spec, StorageInstance
2022
from backend.db_meta.models.cluster import Cluster
2123
from backend.db_services.dbbase.resources import query
2224
from backend.db_services.dbbase.resources.query import ResourceList
@@ -100,8 +102,17 @@ def _filter_cluster_hook(
100102
) -> ResourceList:
101103
# 提前预取storage的tuple
102104
storage_queryset = storage_queryset.prefetch_related("as_receiver__ejector")
105+
# 预取remote的spec
106+
remote_spec_map = {spec.spec_id: spec for spec in Spec.objects.filter(spec_cluster_type=SpecClusterType.MySQL)}
103107
return super()._filter_cluster_hook(
104-
bk_biz_id, cluster_queryset, proxy_queryset, storage_queryset, limit, offset, **kwargs
108+
bk_biz_id,
109+
cluster_queryset,
110+
proxy_queryset,
111+
storage_queryset,
112+
limit,
113+
offset,
114+
remote_spec_map=remote_spec_map,
115+
**kwargs,
105116
)
106117

107118
@classmethod
@@ -130,6 +141,17 @@ def _to_cluster_representation(
130141
]
131142

132143
cluster_role_info = {"proxies": proxies, "masters": masters, "slaves": slaves}
144+
145+
# 补充cluster_spec参数
146+
master_storages = list(filter(lambda storage: storage.instance_inner_role == "master", cluster.storages))
147+
# 获取master规格
148+
if master_storages:
149+
spec_id = master_storages[0].machine.spec_id
150+
spec = kwargs["remote_spec_map"].get(spec_id)
151+
else:
152+
spec = None
153+
cluster_spec_info = {"cluster_spec": model_to_dict(spec) if spec else None}
154+
133155
cluster_info = super()._to_cluster_representation(
134156
cluster,
135157
cluster_entry,
@@ -142,6 +164,7 @@ def _to_cluster_representation(
142164
**kwargs,
143165
)
144166
cluster_info.update(cluster_role_info)
167+
cluster_info.update(cluster_spec_info)
145168
return cluster_info
146169

147170
@classmethod

0 commit comments

Comments
 (0)