Skip to content

Commit 50fc2f0

Browse files
iSecloudzhangzhw8
authored andcommitted
fix(backend): 丰富filter_clusters过滤字段 #7495
1 parent 9fa0667 commit 50fc2f0

File tree

7 files changed

+34
-38
lines changed

7 files changed

+34
-38
lines changed

dbm-ui/backend/core/storages/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ def get_available_name(self, name, max_length=None):
3636
file_root, file_ext = os.path.splitext(file_name)
3737

3838
def _gen_random_name(_file_root) -> str:
39-
# 在文件名的起始位置添加随机串,源码规则为 "%s_%s%s" % (_file_root, get_random_string(7), file_ext)
39+
# 在文件名的起始位置添加随机串,源码规则为 "%s_dbmrpt_%s%s" % (_file_root, get_random_string(7), file_ext)
4040
# 上述规则对 .tar.gz 不友好,会在类型后缀中间加随机串,所以改为随机串作为前缀
41-
return os.path.join(dir_name, "%s_%s%s" % (get_random_string(7), _file_root, file_ext))
41+
return os.path.join(dir_name, "%s_dbmrpt_%s%s" % (get_random_string(7), _file_root, file_ext))
4242

4343
# not self.file_overwrite and self.exists(name) 利用 and 短路特点,如果 file_overwrite=True 就无需校验文件是否存在
4444
while (not self.file_overwrite and self.exists(name)) or (max_length and len(name) > max_length):

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,9 @@ def _list_clusters(
373373
# 定义内置的过滤参数map
374374
filter_params_map = filter_params_map or {}
375375
inner_filter_params_map = {
376+
# 集群id
376377
"id": Q(id=query_params.get("id")),
378+
# 集群名/别名
377379
"name": (
378380
Q(name__in=query_params.get("name", "").split(","))
379381
| Q(alias__in=query_params.get("name", "").split(","))
@@ -384,7 +386,9 @@ def _list_clusters(
384386
"major_version": Q(major_version__in=query_params.get("major_version", "").split(",")),
385387
# 地域
386388
"region": Q(region__in=query_params.get("region", "").split(",")),
389+
# 集群id列表
387390
"cluster_ids": Q(id__in=query_params.get("cluster_ids")),
391+
# 创建者
388392
"creator": Q(creator__icontains=query_params.get("creator")),
389393
# 所属DB模块
390394
"db_module_id": Q(db_module_id__in=query_params.get("db_module_id", "").split(",")),
@@ -394,8 +398,8 @@ def _list_clusters(
394398
"status": Q(status__in=query_params.get("status", "").split(",")),
395399
# 时区
396400
"time_zone": Q(time_zone=query_params.get("time_zone", "").split(",")),
397-
# 域名精确查询,主要用于工具箱手动填入域名查询
398-
"exact_domain": Q(immute_domain=query_params.get("exact_domain")),
401+
# 主域名精确查询,主要用于工具箱手动填入域名查询
402+
"exact_domain": Q(immute_domain__in=query_params.get("exact_domain", "").split(",")),
399403
# 域名
400404
"domain": build_q_for_domain_by_cluster(domains=query_params.get("domain", "").split(",")),
401405
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,18 @@
2020
class ListResourceSLZ(serializers.Serializer):
2121
id = serializers.IntegerField(required=False)
2222
name = serializers.CharField(required=False)
23-
ip = serializers.CharField(required=False)
2423
instance = serializers.CharField(required=False)
2524
domain = serializers.CharField(required=False)
2625
creator = serializers.CharField(required=False)
2726
major_version = serializers.CharField(required=False)
2827
region = serializers.CharField(required=False)
2928
cluster_ids = serializers.ListField(child=serializers.IntegerField(), required=False, allow_empty=True)
3029
exact_domain = serializers.CharField(help_text=_("精确域名查询"), required=False)
31-
ordering = serializers.CharField(required=False, help_text=_("排序字段,非必填"))
3230
status = serializers.CharField(required=False, help_text=_("状态"))
3331
db_module_id = serializers.CharField(required=False, help_text=_("所属DB模块"))
3432
bk_cloud_id = serializers.CharField(required=False, help_text=_("管控区域"))
3533
cluster_type = serializers.CharField(required=False, help_text=_("集群类型"))
34+
ordering = serializers.CharField(required=False, help_text=_("排序字段,非必填"))
3635

3736

3837
class ListMySQLResourceSLZ(ListResourceSLZ):

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

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,16 @@
88
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
99
specific language governing permissions and limitations under the License.
1010
"""
11-
import re
1211

1312
from django.db.models import Q
1413
from django.utils.translation import gettext_lazy as _
1514
from rest_framework import serializers
1615

1716
from backend.components import CCApi
18-
from backend.constants import IP_PORT_DIVIDER, IP_PORT_RE_PATTERN
1917
from backend.db_dirty.models import DirtyMachine
2018
from backend.db_meta.enums import ClusterPhase, ClusterType
2119
from backend.db_services.dbbase.constants import ResourceType
20+
from backend.db_services.dbbase.resources.serializers import ListResourceSLZ
2221
from backend.db_services.ipchooser.query.resource import ResourceQueryHelper
2322
from backend.db_services.redis.resources.redis_cluster.query import RedisListRetrieveResource
2423
from backend.dbm_init.constants import CC_APP_ABBR_ATTR
@@ -76,33 +75,23 @@ class Meta:
7675
swagger_schema_fields = {"example": []}
7776

7877

79-
class ClusterFilterSerializer(serializers.Serializer):
78+
class ClusterFilterSerializer(ListResourceSLZ):
79+
# 基础的集群过滤条件
8080
bk_biz_id = serializers.IntegerField(help_text=_("业务ID"))
81-
exact_domain = serializers.CharField(help_text=_("域名精确查询(逗号分割)"), required=False, default="")
8281
cluster_ids = serializers.CharField(help_text=_("集群ID(逗号分割)"), required=False, default="")
83-
84-
# 后续有其他过滤条件可以再加
85-
cluster_type = serializers.CharField(help_text=_("集群类型"), required=False)
86-
instance = serializers.CharField(help_text=_("实例查询(逗号分割)"), required=False, default="")
82+
cluster_type = serializers.CharField(help_text=_("集群类型"), required=False, default="")
8783

8884
def validate(self, attrs):
89-
cluster_ids = attrs["cluster_ids"].split(",") if attrs["cluster_ids"] else []
90-
exact_domains = attrs["exact_domain"].split(",") if attrs["exact_domain"] else []
91-
instances = attrs["instance"].split(",") if attrs["instance"] else []
85+
# 获取集群基础过滤条件用作第一轮过滤
9286
filters = Q(bk_biz_id=attrs["bk_biz_id"])
93-
filters &= Q(id__in=cluster_ids) if cluster_ids else Q()
94-
filters &= Q(immute_domain__in=exact_domains) if exact_domains else Q()
95-
filters &= Q(cluster_type=attrs["cluster_type"]) if attrs.get("cluster_type") else Q()
96-
instance_filters = Q()
97-
for instance in instances:
98-
if re.compile(IP_PORT_RE_PATTERN).match(instance):
99-
ip, port = instance.split(IP_PORT_DIVIDER)
100-
instance_filter = Q(storageinstance__machine__ip=ip, storageinstance__port=port) | Q(
101-
proxyinstance__machine__ip=ip, proxyinstance__port=port
102-
)
103-
instance_filters |= instance_filter
104-
filters &= instance_filters
87+
if attrs["cluster_ids"]:
88+
filters &= Q(id__in=attrs["cluster_ids"].split(","))
89+
if attrs["cluster_type"]:
90+
filters &= Q(cluster_type__in=attrs["cluster_type"].split(","))
10591
attrs["filters"] = filters
92+
# 补充list resource过滤条件
93+
query_params = {field: attrs[field] for field in self.fields.keys() if field in attrs}
94+
attrs["query_params"] = query_params
10695
return attrs
10796

10897

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,17 @@ def common_query_cluster(self, request, *args, **kwargs):
117117
@action(methods=["GET"], detail=False, serializer_class=ClusterFilterSerializer)
118118
def filter_clusters(self, request, *args, **kwargs):
119119
data = self.params_validate(self.get_serializer_class())
120-
clusters = Cluster.objects.filter(data["filters"])
121120
# 先按照集群类型聚合
122-
cluster_type__clusters: Dict[str, List[Cluster]] = defaultdict(list)
123-
for cluster in clusters:
124-
cluster_type__clusters[cluster.cluster_type].append(cluster)
121+
resource_cls__cluster_ids_map = defaultdict(list)
122+
for cluster in Cluster.objects.filter(data["filters"]).values("id", "cluster_type"):
123+
resource_class = register.cluster_type__resource_class[cluster["cluster_type"]]
124+
resource_cls__cluster_ids_map[resource_class].append(cluster["id"])
125125
# 按照不同的集群类型,调用不同的query resource去查询集群数据
126126
clusters_data: List[Dict] = []
127-
for cluster_type, clusters in cluster_type__clusters.items():
128-
query_params = {"cluster_ids": [cluster.id for cluster in clusters]}
129-
resource_class: ListRetrieveResource = register.cluster_type__resource_class[cluster_type]
127+
for resource_class, cluster_ids in resource_cls__cluster_ids_map.items():
128+
if not list(cluster_ids):
129+
continue
130+
query_params = {**data["query_params"], "cluster_ids": list(cluster_ids)}
130131
cluster_resource_data: ResourceList = resource_class.list_clusters(
131132
bk_biz_id=data["bk_biz_id"], query_params=query_params, limit=-1, offset=0
132133
)

dbm-ui/backend/db_services/mysql/sql_import/handlers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ def _get_user_semantic_tasks(self, cluster_type, code) -> List[Dict]:
259259
flow_tree_list = FlowTree.objects.filter(root_id__in=task_ids)
260260
semantic_info_list = [
261261
{
262+
"cluster_type": cluster_type,
262263
"bk_biz_id": tree.bk_biz_id,
263264
"root_id": tree.root_id,
264265
"created_at": tree.created_at,

dbm-ui/backend/db_services/redis/resources/redis_cluster/query.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@
2727
from backend.db_meta.models.cluster import Cluster
2828
from backend.db_services.dbbase.resources import query
2929
from backend.db_services.dbbase.resources.query import ResourceList
30+
from backend.db_services.dbbase.resources.register import register_resource_decorator
3031
from backend.db_services.ipchooser.query.resource import ResourceQueryHelper
3132
from backend.db_services.redis.resources.constants import SQL_QUERY_MASTER_SLAVE_STATUS
3233
from backend.utils.basic import dictfetchall
3334

3435

36+
@register_resource_decorator()
3537
class RedisListRetrieveResource(query.ListRetrieveResource):
3638
"""查看twemproxy-redis架构的资源"""
3739

@@ -141,8 +143,8 @@ def _to_cluster_representation(
141143
if machine_list:
142144
spec_id = cluster.storages[0].machine.spec_id
143145
spec = redis_spec_map.get(spec_id)
144-
cluster_spec = model_to_dict(spec)
145-
cluster_capacity = spec.capacity * machine_pair_cnt
146+
cluster_spec = model_to_dict(spec) if spec else {}
147+
cluster_capacity = spec.capacity * machine_pair_cnt if spec else 0
146148

147149
# dns是否指向clb
148150
dns_to_clb = cluster.clusterentry_set.filter(

0 commit comments

Comments
 (0)