1212from operator import itemgetter
1313from 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
1617from 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
1921from backend .db_meta .models .cluster import Cluster
2022from backend .db_meta .models .instance import StorageInstance
2123from backend .db_proxy .models import ClusterExtension
2224from backend .db_services .dbbase .resources import query
25+ from backend .db_services .dbbase .resources .query import ResourceList
2326from backend .db_services .ipchooser .query .resource import ResourceQueryHelper
2427from backend .ticket .constants import TICKET_RUNNING_STATUS_SET
2528from 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+ )
0 commit comments