From fc57a88ed21ca91f55b9cf90c2320083571ff8df Mon Sep 17 00:00:00 2001 From: iSecloud <869820505@qq.com> Date: Wed, 16 Oct 2024 11:40:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(backend):=20=E4=BF=AE=E5=A4=8Dmysql?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E8=B5=84=E6=BA=90=E6=B1=A0=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E5=8F=82=E6=95=B0=20#7369?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db_services/partition/serializers.py | 8 +++- dbm-ui/backend/db_services/partition/views.py | 2 +- .../ticket/builders/mysql/mysql_ha_apply.py | 41 +++++++------------ .../builders/mysql/mysql_single_apply.py | 12 ++++-- 4 files changed, 29 insertions(+), 34 deletions(-) diff --git a/dbm-ui/backend/db_services/partition/serializers.py b/dbm-ui/backend/db_services/partition/serializers.py index 07b36180d7..803110accc 100644 --- a/dbm-ui/backend/db_services/partition/serializers.py +++ b/dbm-ui/backend/db_services/partition/serializers.py @@ -27,16 +27,20 @@ class PartitionListSerializer(serializers.Serializer): immute_domains = serializers.CharField(help_text=_("集群域名"), required=False) dblikes = serializers.CharField(help_text=_("匹配库"), required=False) tblikes = serializers.CharField(help_text=_("匹配表"), required=False) + ids = serializers.CharField(help_text=_("策略ID"), required=False) limit = serializers.IntegerField(required=False, default=10) offset = serializers.IntegerField(required=False, default=0) def validate(self, attrs): - filter_fields = ["immute_domains", "dblikes", "tblikes"] + filter_fields = ["immute_domains", "dblikes", "tblikes", "ids"] + # 将过滤参数转为list for field in filter_fields: if field in attrs: attrs[field] = attrs[field].split(",") - + # id过滤类型为int + if attrs.get("ids"): + attrs["ids"] = list(map(int, attrs["ids"])) return attrs diff --git a/dbm-ui/backend/db_services/partition/views.py b/dbm-ui/backend/db_services/partition/views.py index d168e0fe9a..7bc6741b9f 100644 --- a/dbm-ui/backend/db_services/partition/views.py +++ b/dbm-ui/backend/db_services/partition/views.py @@ -81,7 +81,7 @@ def _update_log_status(log_list): *ActionEnum.get_match_actions( "tendbcluster_partition", exclude=[ActionEnum.TENDBCLUSTER_PARTITION_CREATE] ), - *[ActionEnum.TENDBCLUSTER_PARTITION_ENABLE_DISABLE], + ActionEnum.TENDBCLUSTER_PARTITION_ENABLE_DISABLE, ] if d["cluster_type"] == ClusterType.TenDBCluster else [*ActionEnum.get_match_actions("mysql_partition", exclude=[ActionEnum.MYSQL_PARTITION_CREATE])], diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_ha_apply.py b/dbm-ui/backend/ticket/builders/mysql/mysql_ha_apply.py index 6164cedd1b..e27fd78a9c 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_ha_apply.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_ha_apply.py @@ -8,13 +8,12 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ +import itertools from typing import Dict, List from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers -from backend.components import DBConfigApi -from backend.components.dbconfig import constants as dbconf_const from backend.configuration.constants import MASTER_DOMAIN_INITIAL_VALUE, SLAVE_DOMAIN_INITIAL_VALUE, AffinityEnum from backend.db_meta.enums import ClusterType from backend.db_meta.models import AppCache, DBModule @@ -26,11 +25,11 @@ from backend.ticket.builders.mysql.base import BaseMySQLHATicketFlowBuilder from backend.ticket.builders.mysql.mysql_single_apply import ( MysqlSingleApplyDetailSerializer, + MysqlSingleApplyFlowBuilder, MysqlSingleApplyFlowParamBuilder, MysqlSingleApplyResourceParamBuilder, ) from backend.ticket.constants import TicketType -from backend.ticket.exceptions import TicketParamsVerifyException class MysqlHAApplyDetailSerializer(MysqlSingleApplyDetailSerializer): @@ -47,6 +46,7 @@ class MysqlHAApplyDetailSerializer(MysqlSingleApplyDetailSerializer): def validate(self, attrs): super().validate(attrs) + # 验证输入的机器数量是否预期 if attrs["ip_source"] == IpSource.RESOURCE_POOL: return attrs @@ -104,19 +104,22 @@ def insert_ip_into_apply_infos(cls, ticket_data, apply_infos: List[Dict]): proxy_nodes = ticket_data["nodes"]["proxy"] for index, apply_info in enumerate(apply_infos): # 每组集群需要两个后端 IP 和两个 Proxy IP - start = index * 2 - end = (index + 1) * 2 + start, end = index * 2, (index + 1) * 2 apply_info["mysql_ip_list"] = backend_nodes[start:end] apply_info["proxy_ip_list"] = proxy_nodes[start:end] class MysqlHaApplyResourceParamBuilder(MysqlSingleApplyResourceParamBuilder): + @classmethod + def insert_ip_into_apply_infos(cls, ticket_data, apply_infos: List[Dict]): + backend_nodes = [[group["master"], group["slave"]] for group in ticket_data["nodes"]["backend_group"]] + ticket_data["nodes"]["backend"] = list(itertools.chain(*backend_nodes)) + MysqlHAApplyFlowParamBuilder.insert_ip_into_apply_infos(ticket_data, apply_infos) + def post_callback(self): next_flow = self.ticket.next_flow() apply_infos = next_flow.details["ticket_data"]["apply_infos"] - - MysqlHAApplyFlowParamBuilder.insert_ip_into_apply_infos(self.ticket.details, apply_infos) - + self.insert_ip_into_apply_infos(next_flow.details["ticket_data"], apply_infos) next_flow.details["ticket_data"].update(apply_infos=apply_infos) next_flow.save(update_fields=["details"]) @@ -124,28 +127,12 @@ def post_callback(self): @BuilderFactory.register( TicketType.MYSQL_HA_APPLY, is_apply=True, cluster_type=ClusterType.TenDBHA, iam=ActionEnum.MYSQL_APPLY ) -class MysqlHAApplyFlowBuilder(BaseMySQLHATicketFlowBuilder): +class MysqlHAApplyFlowBuilder(BaseMySQLHATicketFlowBuilder, MysqlSingleApplyFlowBuilder): serializer = MysqlHAApplyDetailSerializer inner_flow_builder = MysqlHAApplyFlowParamBuilder inner_flow_name = _("MySQL高可用部署执行") resource_apply_builder = MysqlHaApplyResourceParamBuilder def patch_ticket_detail(self): - # 补充数据库版本和字符集 - db_config = DBConfigApi.query_conf_item( - { - "bk_biz_id": str(self.ticket.bk_biz_id), - "level_name": dbconf_const.LevelName.MODULE, - "level_value": str(self.ticket.details["db_module_id"]), - "conf_file": dbconf_const.DEPLOY_FILE_NAME, - "conf_type": dbconf_const.ConfType.DEPLOY, - "namespace": ClusterType.TenDBHA, - "format": dbconf_const.FormatType.MAP, - } - )["content"] - - # 校验配置是否存在 - if not db_config.get("db_version") or not db_config.get("charset"): - raise TicketParamsVerifyException(_("获取数据库字符集或版本失败,请检查获取参数, db_config: {}").format(db_config)) - - self.ticket.update_details(db_version=db_config.get("db_version"), charset=db_config.get("charset")) + super().patch_dbconfig(cluster_type=ClusterType.TenDBHA) + super().patch_ticket_detail() diff --git a/dbm-ui/backend/ticket/builders/mysql/mysql_single_apply.py b/dbm-ui/backend/ticket/builders/mysql/mysql_single_apply.py index 63596456c6..45ac1cab6c 100644 --- a/dbm-ui/backend/ticket/builders/mysql/mysql_single_apply.py +++ b/dbm-ui/backend/ticket/builders/mysql/mysql_single_apply.py @@ -156,7 +156,7 @@ def format_cluster_domains(self) -> List[Dict[str, str]]: @classmethod def insert_ip_into_apply_infos(cls, ticket_data, apply_infos: List[Dict]): # 适配手动输入和资源池导入的角色类型 - backend_nodes = ticket_data["nodes"]["backend"] or ticket_data["nodes"]["single"] + backend_nodes = ticket_data["nodes"]["backend"] for index, apply_info in enumerate(apply_infos): apply_info["new_ip"] = backend_nodes[index] @@ -204,7 +204,7 @@ class MysqlSingleApplyFlowBuilder(BaseMySQLSingleTicketFlowBuilder): inner_flow_name = _("MySQL单节点部署执行") resource_apply_builder = MysqlSingleApplyResourceParamBuilder - def patch_ticket_detail(self): + def patch_dbconfig(self, cluster_type): # 补充数据库版本和字符集 db_config = DBConfigApi.query_conf_item( { @@ -213,13 +213,17 @@ def patch_ticket_detail(self): "level_value": str(self.ticket.details["db_module_id"]), "conf_file": dbconf_const.DEPLOY_FILE_NAME, "conf_type": dbconf_const.ConfType.DEPLOY, - "namespace": ClusterType.TenDBSingle, + "namespace": cluster_type, "format": dbconf_const.FormatType.MAP, } )["content"] # 校验配置是否存在 if not db_config.get("db_version") or not db_config.get("charset"): - raise TicketParamsVerifyException(_("获取数据库字符集或版本失败,请检查获取参数, db_config: {}").format(db_config)) + raise TicketParamsVerifyException(_("获取数据库配置失败,请检查获取参数db_config: {}").format(db_config)) self.ticket.update_details(db_version=db_config.get("db_version"), charset=db_config.get("charset")) + + def patch_ticket_detail(self): + self.patch_dbconfig(cluster_type=ClusterType.TenDBSingle) + super().patch_ticket_detail()