25
25
from backend .components import BKBaseApi
26
26
from backend .configuration .constants import DBType
27
27
from backend .db_meta .enums import ClusterType , InstanceRole
28
- from backend .db_meta .models import Cluster , DBModule , ProxyInstance , StorageInstance
28
+ from backend .db_meta .models import Cluster , DBModule , ProxyInstance , StorageInstance , Tag
29
29
from backend .db_services .dbbase .cluster .handlers import ClusterServiceHandler
30
30
from backend .db_services .dbbase .cluster .serializers import CheckClusterDbsResponseSerializer , CheckClusterDbsSerializer
31
31
from backend .db_services .dbbase .instances .handlers import InstanceHandler
34
34
from backend .db_services .dbbase .resources .query import ListRetrieveResource , ResourceList
35
35
from backend .db_services .dbbase .resources .serializers import ClusterSLZ
36
36
from backend .db_services .dbbase .serializers import (
37
+ AddClusterTagKeysSerializer ,
37
38
ClusterDbTypeSerializer ,
38
39
ClusterEntryFilterSerializer ,
39
40
ClusterFilterSerializer ,
49
50
QueryClusterCapResponseSerializer ,
50
51
QueryClusterCapSerializer ,
51
52
QueryClusterInstanceCountSerializer ,
53
+ RemoveClusterTagKeysSerializer ,
52
54
ResourceAdministrationSerializer ,
53
55
UpdateClusterAliasSerializer ,
56
+ UpdateClusterTagsSerializer ,
54
57
WebConsoleResponseSerializer ,
55
58
WebConsoleSerializer ,
56
59
)
57
60
from backend .db_services .ipchooser .query .resource import ResourceQueryHelper
58
61
from backend .db_services .mysql .remote_service .handlers import RemoteServiceHandler
59
62
from backend .db_services .redis .toolbox .handlers import ToolboxHandler
60
63
from backend .iam_app .handlers .drf_perm .base import DBManagePermission
61
- from backend .iam_app .handlers .drf_perm .cluster import ClusterDBConsolePermission , ClusterWebconsolePermission
64
+ from backend .iam_app .handlers .drf_perm .cluster import (
65
+ ClusterDBConsolePermission ,
66
+ ClusterEditPermission ,
67
+ ClusterWebconsolePermission ,
68
+ )
62
69
63
70
SWAGGER_TAG = _ ("集群通用接口" )
64
71
@@ -78,9 +85,16 @@ class DBBaseViewSet(viewsets.SystemViewSet):
78
85
(
79
86
"simple_query_cluster" ,
80
87
"common_query_cluster" ,
88
+ "filter_clusters" ,
81
89
): [DBManagePermission ()],
82
90
("webconsole" ,): [ClusterWebconsolePermission ()],
83
91
("dbconsole" ,): [ClusterDBConsolePermission ()],
92
+ (
93
+ "update_cluster_alias" ,
94
+ "update_cluster_tag" ,
95
+ "remove_cluster_tag_keys" ,
96
+ "add_cluster_tag_keys" ,
97
+ ): [ClusterEditPermission ()],
84
98
}
85
99
default_permission_class = [DBManagePermission ()]
86
100
@@ -452,5 +466,54 @@ def update_cluster_alias(self, request):
452
466
cluster = Cluster .objects .get (bk_biz_id = validated_data ["bk_biz_id" ], id = validated_data ["cluster_id" ])
453
467
cluster .alias = validated_data ["new_alias" ]
454
468
cluster .save (update_fields = ["alias" ])
455
- serializer = ClusterSLZ (cluster )
456
- return Response (serializer .data )
469
+ return Response (ClusterSLZ (cluster ).data )
470
+
471
+ @common_swagger_auto_schema (
472
+ operation_summary = _ ("更新集群标签" ),
473
+ request_body = UpdateClusterTagsSerializer (),
474
+ tags = [SWAGGER_TAG ],
475
+ )
476
+ @action (methods = ["POST" ], detail = False , serializer_class = UpdateClusterTagsSerializer )
477
+ def update_cluster_tag (self , request ):
478
+ """更新集群标签"""
479
+ data = self .params_validate (self .get_serializer_class ())
480
+ cluster = Cluster .objects .get (bk_biz_id = data ["bk_biz_id" ], id = data ["cluster_id" ])
481
+ tags = Tag .objects .filter (id__in = data ["tags" ])
482
+ # 清空旧标签,添加新标签
483
+ cluster .tags .clear ()
484
+ cluster .tags .add (* tags )
485
+ return Response (ClusterSLZ (cluster ).data )
486
+
487
+ @common_swagger_auto_schema (
488
+ operation_summary = _ ("批量移除标签键" ),
489
+ request_body = RemoveClusterTagKeysSerializer (),
490
+ tags = [SWAGGER_TAG ],
491
+ )
492
+ @action (methods = ["POST" ], detail = False , serializer_class = RemoveClusterTagKeysSerializer )
493
+ def remove_cluster_tag_keys (self , request ):
494
+ """批量移除标签键"""
495
+ data = self .params_validate (self .get_serializer_class ())
496
+ tag_ids = list (Tag .objects .filter (key__in = data ["keys" ]).values_list ("id" , flat = True ))
497
+ Cluster .tags .through .objects .filter (cluster_id__in = data ["cluster_ids" ], tag_id__in = tag_ids ).delete ()
498
+ return Response ()
499
+
500
+ @common_swagger_auto_schema (
501
+ operation_summary = _ ("批量增加标签键" ),
502
+ request_body = AddClusterTagKeysSerializer (),
503
+ tags = [SWAGGER_TAG ],
504
+ )
505
+ @action (methods = ["POST" ], detail = False , serializer_class = AddClusterTagKeysSerializer )
506
+ def add_cluster_tag_keys (self , request ):
507
+ """批量增加标签键"""
508
+ data = self .params_validate (self .get_serializer_class ())
509
+
510
+ tags = Tag .objects .filter (id__in = data ["tags" ])
511
+ through = Cluster .tags .through
512
+
513
+ # 这里需要先获取到所有标签键,然后排除已经存在该key的集群,考虑到这里标签一次性不会太多,暂用for循环处理
514
+ for tag in tags :
515
+ add_clusters = Cluster .objects .filter (id__in = data ["cluster_ids" ]).exclude (tags__key = tag .key )
516
+ add_tags = [through (cluster_id = cluster .id , tag_id = tag .id ) for cluster in add_clusters ]
517
+ through .objects .bulk_create (add_tags )
518
+
519
+ return Response ()
0 commit comments